说到L2TP VPN,大家肯定会想到xl2tpd和openswan的组合,这是传统L2TP VPN所需要的组件。安装配置步骤相对比较复杂。通常用作Point to Site模式,即:多个接入点(PC、服务器或者移动设备)连接(拨号)到一个服务器。传统L2TP VPN的兼容性非常好,主流操作系统原生支持L2TP协议。
Linux内核从3.2开始内置了L2TP Tunnel功能,安装和配置简单,不需要任何第三方的组件。缺点是只能支持Site to Site模式,和GRE Tunnel、IPIP Tunnel类似。这种L2TP VPN还有一个最大的优势就是:接入服务器可以位于NAT设备后面,使用UDP协议通讯,因此非常适合在各种公有云上使用(特别是网络功能不怎么健全的Microsoft Azure)。
我们使用Ubuntu Server 16.04 LTS为例,在Microsoft Azure日本西和腾讯云广州之间搭建L2TP Tunnel。将Microsoft Azure日本西作为服务器,腾讯云广州作为客户端。客户端的部分网络流量经过L2TP Tunnel从服务器端发出。
服务器端配置
#开启L2TP Tunnel功能,执行一次即可 sudo modprobe l2tp_eth sudo ip l2tp add tunnel tunnel_id 3000 peer_tunnel_id 4000 encap udp local [服务器内网IP地址] remote [客户端公网IP地址] udp_sport 5000 udp_dport 6000 sudo ip l2tp add session tunnel_id 3000 session_id 1000 peer_session_id 2000 sudo ip link set l2tpeth0 up mtu 1488 #设置Tunnel网卡地址 sudo ip addr add 10.99.1.1 peer 10.99.1.2 dev l2tpeth0 #开启ip转发 sysctl -w net.ipv4.ip_forward=1 #开启SNAT伪装 sudo iptables -t nat -A POSTROUTING -s 10.99.1.0/24 -j SNAT --to-source [服务器内网IP地址]
客户端配置
#开启L2TP Tunnel功能,执行一次即可 sudo modprobe l2tp_eth sudo ip l2tp add tunnel tunnel_id 4000 peer_tunnel_id 3000 encap udp local [客户端内网IP地址] remote [服务器公网IP地址] udp_sport 6000 udp_dport 5000 sudo ip l2tp add session tunnel_id 4000 session_id 2000 peer_session_id 1000 sudo ip link set l2tpeth0 up mtu 1488 #设置Tunnel网卡地址 sudo ip addr add 10.99.1.2 peer 10.99.1.1 dev l2tpeth0
注意上述配置中,服务器和客户端的[tunnel_id]和[peer_tunnel_id],[session_id]和[peer_session_id],[udp_sport]和[udp_dport]是“对调互换”的。两边Tunnel网卡地址和peer地址也是类似的“对调互换”;服务器端需要开启IP转发功能和SNAT;客户端要根据具体的需求配置静态路由规则(使用route add命令);还有就是记得为两边的服务器开启对应的UDP端口,通常是在云平台的Security Group功能中进行配置。本例中要开放UDP 5000和UDP 6000端口。
至此一个高效快捷的L2TP Tunnel就创建完成了,像配置GRE Tunnel一样简洁迅速,同时又具备良好的公有云环境兼容性。