Debian系统架设L2TP/IPSec VPN服务器
L2TP/IPSec是比较常见的VPN实施方式,平台兼容性比较好,各种常见的平台都可以很好的支持。
L2TP用于隧道建立和控制以及数据荷载的封装,IPSec用于分组加密和完整性校验。
安装配置IPSec
linux系统有两种比较常见的IPSec实现,Openswan和strongSwan,二者都fork自FreeS/WAN(Free Secure Wide-Area Networking)。
安装openswan
#apt-get install openswan
配置
使用PSK(Pre-Shared Key)加密方式
编辑ipsec配置文件/etc/ipsec.conf如下
1 version 2.0 # 遵循ipsec.conf 2.0 配置规范
2
3 config setup # 基本配置
4 dumpdir=/var/run/pluto/ # core dump目录
5 nat_traversal=yes # NAT 穿越
6 #私网地址段
7 virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10
8 oe=off # 关闭随机加密Opportunistic Encryption
9 protostack=netkey # 使用内核ipsec栈,openswan自己的协议栈叫KLIPS
10
11 conn L2TP-PSK # 配置使用ipsec服务的连接规范,名字随意
12 # 连接两端相互认证的方式,secreti - 用于共享密钥,比如PSK方式,rsasig - RSA数字签名方式,never - 不建立安安全连接
13 authby=secret
14 pfs=no
15 auto=add # ipsec启动时的默认动作
16 keyingtries=3 # 建立连接的尝试次数
17 rekey=no # 连接将要过期时是否重新协商
18 ikelifetime=8h # 连接重新协商前,key通道的持续时间
19 salifetime=8h # 协商成功后连接的持续时间,它有两个别名keylife和lifetime
20 # IPSec连接类型
21 # tunnel - 主机到主机host-to-host,主机到子网host-to-subnet,子网到子网subnet-to-subnet隧道模式
22 # transport - 主机到主机host-to-host传输模式,这里不使用ipsec建立隧道,只使用其加密传输
23 # passthrough - 不进行IPSec处理,分组原样流过连接
24 # drop - 丢弃分组
25 # reject - 丢弃分组,并返回一个ICMP通知
26 type=transport
27 # left 和right分别用于指定连接两侧的参与者IP地址,left和right用于指定任何一端皆可,二者是对等的
28 # 但习惯上left用于指定本地端(local),right用于指定远程端(remote),方便记忆
29 left=192.168.0.2
30 # leftprotoport和rightprotoport用于指定两端使用的协议和端口,要与left和right指定的端匹配
31 # 这里本地端为服务端,使用UDP的1701端口,这是ipsec的默认端口,远端使用UDP协议的任意端口
32 leftprotoport=UDP/1701
33 # leftsubnet 指定左侧参与者left后面的私有子网,格式为network/netmask,如果省略该参数则实际指定为left/32,
34 # 也就是该连接左侧只有这一个参与者
35 right=%any
36 rightprotoport=UDP/%any
37 rightsubnet=vhost:%priv
打开/etc/ipsec.secrets文件添加PSK密钥
x.x.x.x %any: PSK “yourpsk”
x.x.x.x为服务器端IP地址,yourpsk设置你想设置的字符串
修改内核参数
root账户运行以下命令
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done
校验IPSec是否正常
先安装lsof
apt-get install lsof
校验
ipsec verify
Checking your system to see if IPsec got installed and started correctly:
Version check and ipsec on-path [OK]
Linux Openswan U2.6.37-g955aaafb-dirty/K3.2.0-2-amd64 (netkey)
Checking for IPsec support in kernel [OK]
SAref kernel support [N/A]
NETKEY: Testing XFRM related proc values [OK]
[OK]
[OK]
Checking that pluto is running [OK]
Pluto listening for IKE on udp 500 [OK]
Pluto listening for NAT-T on udp 4500 [OK]
Checking for ‘ip’ command [OK]
Checking /bin/sh is not /bin/dash [WARNING]
安装配置l2tp
安装xl2tpd
apt-get install xl2tpd
配置
编辑/etc/xl2tpd/xl2tpd.conf
1 [global] ;全局参数
2 ; 使用IPSec 安全关联追踪,打开此参数IPSec会在分组上附加额外的字段,用来追踪一个NAT IP地址后面的多个客户端
3 ; 当前只有Openswan的协议栈KLIPS支持此参数,NETKEY尚未支持
4 ipsec saref = yes
5
6 [lns default] ; LNS(L2TP Network Server)配置
7 ip range = 10.100.0.2-10.100.0.9 ; 私有IP分配范围
8 local ip = 10.100.0.1 ; 服务器使用的私有IP
9 length bit = yes ;
10 refuse pap = yes ; 拒绝PAP认证
11 refuse chap = yes ; 拒绝CHAP认证
12 require authentication = yes ; 需要端点认证
13 ppp debug = yes ;
14 pppoptfile = /etc/ppp/options.xl2tpd ; 对应的ppp配置文件
安装配置ppp
安装
#apt-get install ppp
配置
编辑配置文件/etc/ppp/options.xl2tpd
1 require-mschap-v2 # 使用mschap v2认证
2 ms-dns 8.8.8.8 # 推送的DNS服务器
4 asyncmap 0 # 异步字符映射位图
5 auth # 需要端认证
6 crtscts # 使用硬件流控RTS/CTS
7 lock # 锁定设备
8 hide-password # 当记录PAP包内容时不记录密码
9 modem #
10 debug
11 name l2tpd # 用于认证目地的本地系统名字
12 proxyarp # 代理arp
13 lcp-echo-interval 30 # 用于确认对端是否仍然在线
14 lcp-echo-failure 4
添加VPN拨号用户
编辑/etc/ppp/chap-secrets,添加
Secrets for authentication using CHAP
client server secret IP addresses
test l2tpd test *
test1 l2tpd test1 *
重新启动xl2tpd完成L2TP/IPSec VPN设置。
转发
如果允许VPN客户端通过VPN服务器访问其他网络,可以设置网络转发。
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables - -table nat - -append POSTROUTING - -jump MASQUERADE
端口映射
如果L2TP/IPSec服务器位于NAT网关后面,没有公网IP,则需要映射以下端口
UDP/1701 #L2TP使用的端口
UDP/500 #IKE(Internet Key Exchange)使用的端口
UDP/4500 #IPSec NAT-T(NAT Traversal)使用的端口
一般建议L2TP/IPSec服务器使用公网IP
NAT后面的多个客户端
因为linux内核自带的IPSec协议栈NETKEY当前还不支持SAref特性,因此同一个NAT网关后共享一个IP的机器无法同时登录VPN,也就是同一时刻只能有一台机器拨到VPN服务器。
如果需要NAT后的多个客户端同时与服务器建立VPN连接,可以考虑安装IPSec的KLIPS协议栈,或者改用OpenVPN,OpenVPN是一项很优秀的VPN技术。