L2TP over IPsec搭建
L2TP over IPSec简介
L2TP VPN使虚拟私有拨号网VPDN的一种,扩展了点到点协议PPP的应用,可以通过远程拨号接入企业总部网络的一种重要VPN技术。L2TP集合了PPTP和L2F两种协议的优点,被广泛应用于单个或少数远程终端通过公共网络接入企业互联网的需求。
L2TP的特性:
- 不提供加密服务
- 使用1701端口
- 使用UDP协议
L2TP被广泛应用于出差员工远程接入企业内部资源工作,和企业内部网络与合作企业或企业总部进行通信,使用ppp协议申请内网地址,并提供总部对出差员工的身份认证,ppp协议本身不能使用在Internet,通过L2TP VPN隧道传输PPP协议,可以解决这一问题。
连接方或网络通过ppp协议拨号封装报文完成身份认证,并在LAC通过L2TP封装进入隧道发送给企业网络连接公网的LNS,其中LAC和LNS协商分配给了连接方一个总部内网的空闲保留ip地址,用于双方通信。
但L2TP本身不提供加密服务,需要通过IPSec对其内容进行加密,保证了信息在公网传输的保密性。这种L2TP+IPSec
的组合方式称为L2TP over IPSec
。
实验设计
本次实验模拟员工通过PC机远程连接企业内部网络的情景,当连接方是一台个人电脑时,如win10,可以通过系统提供的配置以及服务实现LAC的功能,从而完成L2TP隧道的协商建立。
用户通过个人电脑的vpn连接,获得L2TP服务器分配的一个内网保留地址,并通过该保留地址和L2TP over IPSec隧道进行信息在公网的加密传输,对于用户和内网的设备来说,公网传输是透明的,逻辑上就像是同一网段的设备在内网通信。
实验环境
实验设备
Window10(客户端)
- 内网ip
192.168.200.129
- 公网ip
192.168.8.138
Ubuntu22.04(L2TP服务器)
- 内网ip
192.168.100.128
- 公网ip
192.168.8.128
Windows10(内网web服务器)
- 内网ip
192.168.100.129
设备配置
Windows10(客户端)配置
由于Win10默认不支持IPSec服务,需要开启ipsec服务并修改密钥相关的注册表
- 允许IPSec穿越NAT
正常IPSec使用500 UDP进行通信,但是由于IPSec建立联系时,要比较IKE包host id和IP包的真实IP,需要引入NAT穿越技术,由500端口初次协商,后续交由4500端口进行NAT穿越协商。
默认windows不支持NAT穿越,配置AssumeUDPEncapsulationContextOnSendRule
字段允许IPSec使用UDP4500端口进行NAT穿越。
修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\PolicyAgent
添加dword类型键值AssumeUDPEncapsulationContextOnSendRule
数值为2
- 允许L2TP唤醒IPSec
可能影响休眠后重新唤醒IPSec加密
修改注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters
修改AllowL2TPWeakCrypto
数值为1
- ProhibitIpSec避坑
网上很多文章都在注册表HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\RasMan\Parameters
添加ProhibitIpSec
字段,再跟着这些文章配置成功并连接vpn后,使用wireshark抓包分析,发现协议中存在L2TP协商数据包,且通信内容明文传输,猜想是IPSec出现了问题,尝试将vpn连接的预共享密钥删除,vpn依然可以通信,IPSec根本没有使用,查看多个文章,发现ProhibitIpSec
会导致Windows禁用IPSec。
相关文章(80条消息) 【逗老师的小技巧】我算是把Windows IPSec L2TP的问题玩明白了_逗老师的博客-CSDN博客
- 启动IPsec Policy Agent服务
Ubuntu22.04(L2TP服务器)配置
安装相应的包
sudo apt-get install strongswan xl2tpd ppp lsof
- strongswan是一个提供ipsec服务的工具集
- xl2tpd是L2TP服务相关包
- ppp是提供点对点通信的协议
为了使L2TP服务器达到网关的作用,需要开启转发功能,修改/etc/sysctl.con
配置
net.ipv4.ip_forward = 1 //启动ip转发
net.ipv4.conf.all.accept_redirects = 0 //不接收重定向包
net.ipv4.conf.all.send_redirects = 0 //不发送重定向包
net.ipv4.conf.default.rp_filter = 0 //关闭反向路径过滤
net.ipv4.conf.default.accept_source_route = 0 //禁止源路由
net.ipv4.conf.default.send_redirects = 0 //禁止发送重定向,与第三条作用=相似
net.ipv4.icmp_ignore_bogus_error_responses = 1 //忽略虚假错误响应,防止ICMP错误响应
配置/etc/ipsec.conf
conn L2TP-PSK
type=transport //传输模式
authby=psk //使用预共享密钥进行身份验证
keyexchange=ikev1 //l2tp over ipsec需要使用ikev1
keyingtries=3 //密钥交换尝试次数
rekey=no //不允许重新进行密钥交换
left=192.168.8.128 //l2tp服务器公网地址
right=%any //连接方可以是任意地址
auto=add //自动添加连接配置
由于使用预共享密钥方式进行身份验证,需要设置PSK,配置/etc/ipsec.secrets
#本机公网ip 接收ip 预共享密钥
%any : PSK "myvpn123"
配置xl2tp文件,/etc/xl2tpd/xl2tpd.conf
[global]
ipsec saref = yes //启动IPSec的NAT环境传输
saref refinfo = 30
;debug avp = yes
;debug network = yes
debug state = yes
;debug tunnel = yes
[lns default]
ip range = 192.168.100.150-192.168.100.200 //分配给连接方的内网ip池
local ip = 192.168.100.128 //l2tp服务器公网地址
refuse pap = yes //禁用PAP认证
require authentication = yes //启动身份认证
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd //指定ppp选项文件路径
length bit = yes //指示l2tp数据包长度
配置上述配置中指定的pppoptfile文件
创建/etc/ppp/options.xl2tpd
require-mschap-v2 //要求使用ms-chapv2进行身份认证
ms-dns 8.8.8.8 //首选dns
ms-dns 114.114.114.114 //备用dns
auth //表示对用户进行身份认证
mtu 1200 //最大传输单元
mru 1000 //最大接收单元
crtscts //启动流控制
hide-password //隐藏密码信息,不在日志文件暴露
modem //模拟调制解调器模式
name l2tpd //指定L2TP服务器名称
proxyarp //启动ARP代理,在网络中中转ARP请求
lcp-echo-interval 30 //指定LCP回显请求间隔30s
lcp-echo-failure 4 //指定lcp回显请求失败次数
配置vpn用户密码/etc/ppp/chap-secrets
# client server secret IP addresses
"user" l2tpd "123456" *
放行端口
ufw allow 500
ufw allow 1701
ufw allow 4500
启动服务
ipsec restart
service xl2tpd restart
Windows10(web服务器)配置
通过phpstudy搭建一个网络环境,模拟用户访问内网资源
实验过程
web服务器(192.168.100.129
)启动phpstudy
客户端添加vpn连接
//连接名称
l2tp
//服务器地址
192.168.8.128
//VPN类型
使用预共享密钥的L2TP/IPsec
//域共享密钥
myvpn123
//登录信息的类型
用户名和密码
//用户名
user
//密码
123456
保存后,允许认证方式
连接vpn,并访问web服务器
成功访问
wireshark抓包VMnet8
可以看到在192.168.8.0/24网段传输ESP数据包,说明访问网站的数据包被IPSec协议加密。