L2TP/IPSec VPN的兼容比较好,在Windows/Android/IOS上面都能支持。本文使用OpenSwan和xl2tpd在Ubuntu上搭建L2TP/IPSec VPN。IPSec认证方式为PSK,PPP认证方式为chap2,这种认证方式兼容性也比较好。
Ubuntu官方的IPSec包是strongSwan。OpenSwan需要自己编译安装。如果已经安装strongSwan,先卸载。
1 2 | apt-get remove strongswan apt autoremove |
安装OpenSwan
1 2 3 4 5 | wget tar xf openswan-latest.tar.gz -C ../src cd ../src/openswan-2.6.50/ make programs make install |
安装xl2tpd
1 | apt-get install xl2tpd |
还需要安装ppp包,但是通常已经安装好了。
需要配置3个文件。
/etc/ipsec.conf配置:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | # /etc/ipsec.conf version 2.0 # conforms to second version of ipsec.conf specification config setup nat_traversal=yes virtual_private=%v4:10.0.0.0/8,%v4:25.0.0.0/8,%v4:!10.254.253.0/24 protostack=netkey #protostack=mast # used for SAref + MAST only interfaces="%defaultroute" oe=off #plutodebug=all #plutostderrlog=/var/log/openswan.log conn l2tp-psk authby=secret pfs=no auto=add rekey=no # overlapip=yes # for SAref + MAST # sareftrack=yes # for SAref + MAST type=transport left=172.31.129.70 leftprotoport=17/1701 # # The remote user. # right=%any rightprotoport=17/%any rightsubnet=vhost:%priv,%no |
上述配置中,需要将left的ip为wan口ip。
/etc/ipsec.secrets配置:
1 2 3 4 5 6 | # /etc/ipsec.secrets # This file holds shared secrets or RSA private keys for authentication. # RSA private key for this host, authenticating it to any other host # which knows the public part. 172.31.129.70 %any 0.0.0.0 : PSK '123456' |
特别需要指出的是,PSK值123456必须使用单引号括起来。否则协商会失败。
/etc/sysctl.conf添加下述配置
1 2 3 4 5 6 | net.ipv4.ip_forward = 1 net.ipv4.conf.default.rp_filter = 0 net.ipv4.conf.default.accept_source_route = 0 net.ipv4.conf.all.send_redirects = 0 net.ipv4.conf.default.send_redirects = 0 net.ipv4.icmp_ignore_bogus_error_responses = 1 |
添加后,使用 sysctl -p更新。
可以使用ipsec verify命令进行检查,最后重启ipsec。
1 | /etc/init.d/ipsec restart |
同样需要配置3个文件。
xl2tpd配置文件:/etc/xl2tpd/xl2tpd.conf
1 2 3 4 5 6 7 8 9 10 11 | [lns default] ip range = 10.0.0.100-10.0.0.109 local ip = 10.0.0.1 assign ip = yes require chap = yes refuse pap = yes require authentication = yes name = vpn ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes |
ppp配置文件:/etc/ppp/options.xl2tpd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | ipcp-accept-local ipcp-accept-remote ms-dns 8.8.8.8 noccp auth crtscts idle 1800 mtu 1200 mru 1200 nodefaultroute debug lock proxyarp connect-delay 5000 require-mschap-v2 |
require-mschap-v2这个选项,表示使用chap2身份验证,在windows拨号时,要选择对应的验证。
用户配置文件:/etc/ppp/chap-secrets
1 2 3 | # Secrets for authentication using CHAP # client server secret IP addresses user * admin * |
配置NAT转发
1 | iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE |
使用的是Windows10系统,拨号发现Windows不会先进行IPSec协商,需要删除下述注册表:
1 | HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters\ProhibitIpSec |
如果服务器或者客户端在NAT后面,需要添加一条注册表项
1 | HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent |
添加DWORD值 AssumeUDPEncapsulationContextOnSendRule,值为2。重启电脑。
新建VPN连接。
身份验证选项MS-CHAP v2,因为之前的PPP配置中设置的是chapv2。
在高级设置中,选择PSK。
进行连接,输入PPP用户名密码。正常应该连接成功。但是整个配置还是非常复杂的话,连接失败可进行抓包和开启服务器openswan等的log来进行排查。