PPTP over IKEv2 配置

1. 背景介绍

关于如何绕过实验室的访问策略,直接访问服务器区服务器,之前的文章Strongswan Linux host-to-host配置 已经介绍过,实现的拓扑如图1-1所示:

  • 服务器区的服务器Carol的IP地址为172.18.31.13/16办公区Moon的IP地址为10.30.8.8/19
  • Carol以IKEv2 VPN连接到Moon,获取的办公区虚拟IP地址为10.30.30.13
3-1
图1-1 逻辑拓扑

2. 理论基础

原解决方案

尽管此时可以从办公区直接访问服务器区的Carol,但是服务器区的服务器众多,如果要访问服务器区的其他服务器,原来的解决方案有两种,分别为:

  • 先SSH登录Carol,再在Carol上以SSH的方式登录其他服务器

    该方式只能SSH登录,但是其他服务器,例如HTTP,并不能通过Carol进行中转

  • 在每台服务器上都建立与Moon的IKEv2 VPN连接

    该方式操作开销大,在每台服务器上都需要配置IKEv2,而且要为每个服务器都分配一个办公区的虚拟IP

因此以上两种解决方案均有各自的缺点与限制,因此需要新的方式来提高对服务器区的访问体验

解决方案1

使用路由方式,在个人路由器上,添加到172.18.0.0/16的路由,下一跳地址为10.30.30.13,从服务器区返回的路由正常返回。在路由器的使用traceroute结果如下,

1
2
3
4
5
6
7
8
9
root@OpenWrt:~# traceroute 172.18.31.41
traceroute to 172.18.31.41 (172.18.31.41), 30 hops max, 38 byte packets
1 ikev2.acs.ict.ac.cn (10.30.8.8) 0.310 ms 0.825 ms 0.260 ms
2 10.30.0.254 (10.30.0.254) 49.573 ms 0.874 ms 0.703 ms
3 192.168.200.1 (192.168.200.1) 1.307 ms 1.313 ms 1.441 ms
4 xxx.xxx.43.36 (xxx.xxx.43.36) 1.905 ms 1.651 ms 1.729 ms
5 192.168.46.49 (192.168.46.49) 1.425 ms 1.555 ms 1.366 ms
6 xxx.xxx.xxx.195 (xxx.xxx.xxx.195) 1.299 ms 1.708 ms 1.676 ms
7 xxx.xxx.253.50 (xxx.xxx.253.50) 1.466 ms !N 1.781 ms !N 1.572 ms !N

经过分析可知

  • 源主机知道发往172.18.0.0/16的数据包,要发往10.30.30.13,但是首先要发到Moon(10.30.8.8),虽然10.30.30.13在逻辑上为办公区的IP地址,但是在再往下一层看,其还是要通过Moon转发的。
  • 然后Moon接收到去往目的地为172.18.0.0/16的数据包,Moon并不会把数据包发往10.30.30.13,而是按照自己的路由表进行转发,因此Moon把该数据包转发到了自己的默认路由,因此需要在Moon上手动添加路由

在Moon上手动添加到172.18.0.0/16的路由条目

1
2
3
4
5
6
7
[root@localhost ~]# ip route
10.30.0.0/19 dev eth0 proto kernel scope link src 10.30.7.235
172.16.0.0/16 dev eth1 proto kernel scope link src 172.16.0.235
169.254.0.0/16 dev eth0 scope link metric 1002
169.254.0.0/16 dev eth1 scope link metric 1003
default via 10.30.0.254 dev eth0
[root@localhost ~]# ip route add 172.18.0.0/16 dev eth0 proto kernel via 10.30.30.13

手动添加路由后,再尝试在Moon上访问服务器区的Carol,出现了路由黑洞!

1
2
3
[root@localhost ~]# traceroute 172.18.31.13
traceroute to 172.18.31.13 (172.18.31.13), 30 hops max, 60 byte packets
1 10.30.8.8 (10.30.8.8) 3000.424 ms !H 3000.423 ms !H 3000.417 ms !H

因此放弃该方案!原因未知,Linux添加路由条目,其指定的下一跳地址为VPN虚拟IP地址时候,出现路由黑洞!

解决方案2

原来IKEv2 VPN的基础上,再建立一层PPTP VPN,其逻辑拓扑如图2-1所示

2-1
图2-1 逻辑拓扑

总体思路如下

  • Carol与Moon之间的为第一层为IKEv2 VPN链路,如图2-1绿色部分,使得Carol在逻辑上与办公区处于同一个局域网
  • 以Carol的办公区虚拟机IP地址10.30.30.13为PPTP VPN服务器地址,办公区主机与10.30.30.13建立第二层PPTP VPN链路,尽管PPTP安全性不高,但是内网之间通信,可以忽略这个问题
  • Carol以PPTP VPN服务器的身份,给办公区主机分配的虚拟IP段位于172.18.0.0/16内,因此PPTP VPN连接之后,拥有了访问服务器区地址段的路由

3. 实现步骤

实验环境

假设服务器区的服务器仍为Carol,办公区的IKEv2 服务器为Moon,办公区的客户端为Bob

设备 所在区域 逻辑所在区域 IP地址 操作系统 VPN角色
Moon 办公区 办公区 10.30.8.8 CentOS 6 IKEv2 VPN服务器IP
Carol 服务器区 服务器区 172.18.31.13 CentOS 7 IKEv2 VPN客户端IP
办公区 10.30.30.13 CentOS 7 IKEv2 VPN虚拟IP
服务器区 172.18.29.1 CentOS 7 PPTP VPN虚拟网关IP
Bob 办公区 办公区 10.30.5.39 Windows PPTP VPN客户端
服务器区 172.18.29.2 Windows PPTP VPN虚拟

软件安装

在Carol上安装pptp

1
2
yum install epel-release
yum -y install pptpd

PPTP服务器配置

/etc/ppp/chap-secrets中添加验证条目,内容如下,添加了一个用户名、密码均为test的账户,可以按照这个格式继续添加账户

1
2
# client        server  secret                  IP addresses
test pptpd test *

/etc/pptpd.conf中设置虚拟IP网关地址、分配给客户端的虚拟IP地址范围,该虚拟IP在服务器区的IP地址范围内

1
2
localip 172.18.29.1
remoteip 172.18.29.2-254

iptables以及内核转发设置

1
2
3
4
5
echo 'net.ipv4.ip_forward = 1'>>/etc/sysctl.conf
sysctl -p
iptables -I INPUT 2 -p tcp --dport 1723 -j ACCEPT
iptables -I INPUT 2 -p gre -j ACCEPT
iptables-save>/etc/sysconfig/iptables

启动服务

1
2
service pptpd start
chkconfig pptpd on

Freeradius验证

鉴于使用文件添加文件不够方便,而且不方便进行管理,因此可以使用Freeradius进行验证PPTP VPN

不要使用yum安装radcli,虽然其声明兼容freeradiusclient,但是会有一些奇怪的问题

编译安装freeradiusclient 1.1.7

1
2
3
4
5
wget ftp://ftp.freeradius.org/pub/freeradius/freeradius-client-1.1.7.tar.gz
tar xvzf freeradius-client-1.1.7.tar.gz
cd freeradius-client-1.1.7
./configure
make && make install

切换到freeradiusclient的配置目录,下载字典,和windows登录PPTP VPN有关

1
2
cd /usr/local/etc/radiusclient
wget http://qingdao.icean.cc:11234/dictionary.microsoft

修改dictionary文件,最后追加如下两行,并删除所有关于IPv6的条目,否则会报错

1
2
3
4
5
cat >> dictionary << EOF
INCLUDE /usr/local/etc/radiusclient/dictionary.microsoft
INCLUDE /usr/local/etc/radiusclient/dictionary.merit
EOF
sed -i '/IPv6/d' dictionary

注释掉配置文件radiusclient.confradius_deadtimebindaddr字段,

1
2
sed -i 's/radius_deadtime/#radius_deadtime/g' radiusclient.conf
sed -i 's/bindaddr/#bindaddr/g' radiusclient.conf

修改authserver localhostacctserver localhost字段,将localhost修改为freeradius服务器的IP地址

1
2
sed -i "s/localhost/$radiusserver/g" radiusclient.conf
sed -i "s/localhost/$radiusserver/g" radiusclient.conf

添加freeradius服务器以及预共享密钥

1
echo "$radiusserver/$radiusserver    $sharekey" >> servers

修改PPTP配置文件/etc/pptpd.conf/etc/ppp/options.pptpd,并重启服务

1
2
3
4
5
6
7
sed -i 's/logwtmp//#logwtmp/g' /etc/pptpd.conf
cat >> /etc/ppp/options.pptpd << EOF
plugin /usr/lib64/pppd/2.4.5/radius.so
plugin /usr/lib64/pppd/2.4.5/radattr.so
radius-config-file /usr/local/etc/radiusclient/radiusclient.conf
EOF
service pptpd restart

freeradius服务器添加客户端,在配置文件夹的clients.conf文件中,添加客户端配置信息

1
2
3
4
5
6
client pptp {                             
ipaddr = 0.0.0.0
secret= $sharekey
require_message_authenticator = no
nastype = other
}

静态IP地址分配

如果想给某个客户端分配静态IP地址,可以在freeradius服务器上进行配置。

修改freeradius配置文件mods-config/files/authorize,以如下为例,为用户名username,密码为password的客户端分配静态的IP为172.18.42.10

1
2
3
4
5
6
7
8
9
username Cleartext-Password := "password"
Service-Type = Framed-User,
Framed-Protocol = PPP,
Framed-IP-Address = 172.18.42.10,
Framed-IP-Netmask = 255.255.0.0,
Framed-Routing = Broadcast-Listen,
Framed-Filter-Id = "std.ppp",
Framed-MTU = 1500,
Framed-Compression = Van-Jacobsen-TCP-IP

客户端配置

Windows

Windows如何设置VPN,请自行Google。但是鉴于Windows的不友好,如果既想连接到服务器区,又不影响正常上网,即不将PPTP链路设置为默认网关。需要进行如下设置:

  • 配置位置:控制面板 -> 网络和 Internet -> 网络和共享中心 -> 更改适配器设置
  • 在新建的 VPN 连接上右键属性
  • 切换到网络选项卡
    • 选择Internet协议版本4 -> 高级
    • 切换到IP设置选项卡
    • 不选择在远程网络上使用默认网关,然后保存
  • 再次连接VPN即可生效
MacOS

如何设置PPTP VPN请自行Google。在当前实验环境下,MacOS不将PPTP链路设置为默认网关。

其他

没有经过设置以及测试,请自行Google


4. 问题总结

选择PPTP原因

  • 尽管有很多其他优秀的VPN,但是PPTP配置简单,轻量。鉴于第一层VPN使用IKEv2,经过测试,不能再用IKEv2 VPN进行叠加。

  • 测试过Anyconnect VPN

    • Anyconnect的优点为可以在服务器端自定义推送到客户端的路由表
    • 但是每次Windows 10连接之后,就无法使用IPv6了
    • Anyconnect 客户端需要每次输入服务器地址、账户名以及密码

    鉴于无法使用IPv6,很影响体验,所以不采用Anyconnect VPN。

    Windows 其他版本以及Mac、Linux、iOS没有进行过该测试。

OpenWRT问题

  • 在默认情况下,OpenWRT的缺省配置不允许LAN客户端(本地私有网络)以PPTP连接到WAN(外部网络)的服务器。因为PPTP使用GRE协议,该协议为纯IP协议,只使用IP地址作为源和目的,不会识别端口号,因为OpenWRT使用了NAT,所以要安装一个软件包,让OpenWRT支持PPTP NAT

    1
    opkg install kmod-nf-nathelper-extra

    更多内容,查看这里


修订版本信息

修订版本 时间 备注
文档创建 2017/3/20 16:29
文档修改1 2017/6/19 12:58 添加了pptp freeradius验证
文档修改2 2017/12/4 16:25 添加了客户端静态IP分配