Unix Like, VPN, 网络

Linux L2TPv3以及ip-xfrm的配置

L2TPv3:http://man7.org/linux/man-pages/man8/ip-l2tp.8.html

ip-xfrm:http://man7.org/linux/man-pages/man8/ip-xfrm.8.html

这两个都是kernel内置的功能,通过这两个可以直接构建加密的VPN。

本文尝试使用ip-xfrm创建加密的隧道,并基于此隧道构建L2TPv3 VPN。

1. 生成密钥与ID

不使用StrongSwan,手动配置ip-xfrm时需要用到:

复制上面四行命令后输出的内容,粘贴到left和right上运行,用于设置变量

2. 配置ip-xfrm

这里得分两种情况,一种是left和right都不经过NAT直接持有公网IP,另一种是left或者right任何一端经过NAT。

为什么要这样区分?因为ip-xfrm传输加密报文使用的协议ESP是L3的,一般情况下无法NAT,需要使用L4封装才能正常使用;其次,L4被SNAT后的源端口(source port),可能会被改变。

下面以UDP端口1801作为L2TPv3的通讯端口,对ip-xfrm进行配置。

2.1 不经过NAT

拓扑如下:

首先在left配置ip-xfrm:

然后配置right:

上面的配置命令,state是指定left到right的之间数据封装使用ESP协议,指定使用sha1算法进行签名,aes-128进行加密。policy指定当L2TPv3的UDP数据包在left和right之间传输时,使用刚刚在state里面配置的规则进行封装。

2.2 经过NAT

拓扑:

上图中left和right都被NAT过,这里需要注意:至少要保证left或者right的一个UDP端口能被对方访问,如果双方都被NAT,且路由器都没有映射端口到它们那,那这个VPN就无法构建。

这里假定right的路由把到2.3.5.6的流量都转发给了192.168.2.2。

NAT还有一个比较大的问题,就是SNAT后源端口可能会改变,假定left和right设定了ESP通过双方的UDP端口4500封装,如果left的kernel从源端口4500发送UDP封装的ESP数据包到2.3.5.6:4500,right收到的数据包的来源端口有可能不是4500,这样会内核就找不到对应的xfrm规则,不会对解除该ESP的封装。即使你通过抓包或者其它方法获取到了被SNAT后的端口,如果这个NAT记录一段时间后无任何流量,路由器会清理掉该记录,后面再SNAT的端口可能又是另一个了。所以,这就是为什么IPsec会有NAT-T。

不过,即使解决SNAT和NAT记录超时问题,也还不足,虽然可以直接手动配置espinudp的规则,但是还是得依赖外部程序,内核才会解除ESP的UDP封装。

2.2.1 方式一:使用StrongSwan配置ip-xfrm

StrongSwan的实现其实也是ip-xfrm,使用StrongSwan,需要开放UDP端口500和4500,这里假设right的路由已把这两个端口转发到right。

在left和right安装StrongSwan:

在left的/etc/ipsec.conf加入记录:

在left的/etc/ipsec.secrets加入记录(把pre-shared-key改成你自己指定的密钥)

在right的/etc/ipsec.conf加入记录(这里的auto是add不是route,因为只有right的路由器是为right映射了端口的,left没有,right是无法主动向left发起协商请求的):

在right的/etc/ipsec.secrets加入记录(left和right的PSK要一致):

 

注意,在StrongSwan的配置文件中的left和right并不代表拓扑图中的left和right,left是本机,right是对方;另外,ipsec.secrets的格式是:

上面StrongSwan加入的记录,大概意思就是该规则应用于left和right的udp端口1801之间的通讯,并且让内核在遇到匹配left和right 1801端口的通讯时自动配置ip-xfrm,此外,30秒进行一次心跳,120秒无回应则重建连接。

在两边都重启StrongSwan:

正常来说,后面构建L2TPv3后,1801端口有流量,StrongSwan会自动配置ip-xfrm,不过可以手动up试试是否成功(这里只能在left上进行,前面已提过right是无法主动向left发起协商请求的):

2.2.2 方式二:手动配置ip-xfrm

下面的配置步骤,即使全部对了,应该也是无法通的,抓包可以看到封装为UDP的ESP数据包,但是内核不会解除封装,不过如果你left和right两边都运行StrongSwan(不需要进行任何配置),监听着4500端口,就可以通。

left:

right:

3. 配置L2TPv3

在left和right上都执行一样的命令配置L2TPv3:

无误的话,在left和right上执行ip link show会看到一个名为l2tpeth100的虚拟网卡:

L2TPv3是附带以太网头的,所以还可以桥接组网。