CentOS 7搭建L2TP VPN
VPN(Virtual Private Network,即“虚拟私人网络”)是一种通过在数据传输过程中加密的方式来保障数据传输安全的通信方式,L2TP是其中的一种加密方式。VPN被人熟知是可以用来翻墙,不过翻墙不是VPN的主要功能,如果搭建VPN纯粹用来翻墙,可以参考翻墙利器SS,搭建教程:CentOS 搭建 Shadowsocks (ss),SS是纯粹用来翻墙的,所以稳定性和传输速度损耗的控制均比VPN好,不过,后来SS作者被请去喝茶了,原来的SS也就没再更新,也就有了SSR,算是SS的另外一个会更新的分支:ssrpanel:搭建shadowsocksr流量监控和用户管理面板。
L2tp的搭建比较繁琐,涉及的部件较多,所以本文也略长,如有任何疑问或看不懂的地方,欢迎留言。
准备
搭建L2TP需要环境支持,所以需要提前查看是否支持,不支持的自行Google
1 | # 查看主机是否支持pptp,返回结果为yes就表示通过 |
安装
L2TP VPN的支持需要以下组件:
- xl2tp
- libreswan
1 | # 先更新 |
配置
xl2tpd
1 | # 编辑xl2tpd配置文件 |
配置文件如下,需要修改的部分已作说明:
1 | ; |
ppp
1 | # 编辑pppoptfile文件 |
配置文件如下
1 | ipcp-accept-local |
IPSec
1 | # 修改ipsec 主配置文件 |
配置文件如下:
1 | # /etc/ipsec.conf - Libreswan IPsec configuration file |
注意
- 此配置文件不加
left=服务器ip
、include /etc/ipsec.d/*.conf
或者其他行- 第一行config setup必须左对齐,即前面不能有空格,否则会报错
- 其他每一行都必须以Tab开头,否则会报错
- 如果安装的是
openswan
,可能需要在config setup
之前添加version 2.0
IPSec
先设置预共享密钥PSK
1 | # 编辑配置文件 |
配置文件如下:
1 | include /etc/ipsec.d/*.secrets |
- 格式为 服务器IP %any: PSK “预共享密钥”,其中 %any: 和 PSK 之间有空格
接下来是配置服务器
1 | # 修改/etc/ipsec.d/l2tp_psk.conf文件 |
配置文件如下:
1 | conn L2TP-PSK-NAT |
注意
- conn开头的两行必须左对齐,开头不能有空格,其他每一行必须以Tab开头
添加账号密码
1 | vim /etc/ppp/chap-secrets |
配置文件如下:
1 | # Secrets for authentication using CHAP |
配置形式为
用户名
+*
+密码
+*
- 第一个星号是服务类型,在这里是L2TP,因为PPTP的账号密码管理文件也是此文件,所以以通配符
*
代替更好- 第二个星号是用户地址限制,如果填进去某个IP,则是限制只能此IP连接该VPN
开启内核转发
必须开启此项,连接VPN时才能访问公网,不然只能访问服务器内网
1 | vim /etc/sysctl.conf |
配置文件如下:
1 | # Kernel sysctl configuration file for Red Hat Linux |
重新加载内核配置项,使刚才的更改生效
1 | sysctl -p |
如果输出结果有显示 net.ipv4.ip_forward = 1
,则说明更改生效
测试
开启IPSec
1 | ipsec setup start |
ipsec setup start
等同于service ipsec start
提示信息如下:
1 | Redirecting to: service ipsec start |
确认IPSec状态
1 | ipsec verify |
如果配置正确,那么提示信息应该像这个样子:
1 | Verifying installed system and configuration files |
如果有错误信息,部分问题解决如下:
1 | Pluto listening for IKE on udp 500 [FAILED] |
解决办法:安装 lsof :
yum install lsof
1 | Checking NAT and MASQUERADEing [N/A] |
解决办法:更改iptables规则:
iptables -t nat -A POSTROUTING -j MASQUERADE
1 | can not load config '/etc/ipsec.conf': /etc/ipsec.conf:58: syntax error, unexpected KEYWORD, expecting $end [rightsubnet] |
解决办法:
/etc/ipsec.conf
文件除了conn
开头的两行之外,其他的都要以 Tab缩进 开头
1 | SAref kernel support [N/A] |
解决办法:修改
/etc/xl2tpd/xl2tpd.conf
1
2 [global]
ipsec saref = no # 将yes改为no
1 | Two or more interfaces found, checking IP forwarding [FAILED] |
解决办法:只要
cat /proc/sys/net/ipv4/ip_forward
返回结果是1
就没事,如果还不行,就按照上面更改sysctl.conf
文件
开启xl2tpd
1 | service xl2tpd restart |
提示信息如下:
1 | stopping xl2tpd: [ OK ] |
xl2tp debug
1 | xl2tpd -D |
测试连接
关闭iptables:
1 | service iptables stop |
此时关闭iptables防火墙进行测试,已经可以连上VPN,可以上外网
其他
防火墙iptables设置
不开防火墙裸奔也不是办法,所以将防火墙默认拒绝所有接口,然后开放需要使用的接口即可。
清空防火墙配置:
1 | iptables -P INPUT ACCEPT # 改成 ACCEPT 标示接收一切请求 |
配置防火墙:
1 | iptables -A INPUT -i lo -j ACCEPT # 允许127.0.0.1访问本地服务 |
配置ip转发:
1 | iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth1 -j MASQUERADE |
对iptables规则进行保存:
1 | service iptables save |
重启iptables,使规则生效:
1 | service iptables restart |
添加开机自启:
1 | chkconfig iptables on # 开机启动 iptables |
报错修复
运行 ipsec verify 时报错:
- 报错信息
1 | ICMP default/send_redirects [NOT DISABLED] |
- 解决办法:
根据提示,需要关闭sendredirects和acceptredirects。查看这两个下的所有选项,根据网卡数量,选项个数无法确定,其中也可能会包含IPv6的选项,IPv6的不需要改
1 | sysctl -a | grep -e 'send_redirects' |
可以直接通过下面的脚本把上面显示的所有IPv4的选项全部设置为0
:
1 | #!/bin/bash |
修改完成后,再进行一次 ipsec 验证即可看到结果,[NOT DISABLE]
已变为[OK]
。
客户端设置
- Windows设置:错误 789、792
windows+r
打开运行,输入services.msc
,查找ipsec policy agent
,启用服务- 打开注册表,路径
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Rasman\Parameters
- 添加DWORD值(32位)值,名称
ProhibitIpSec
,值为1
- 由于缺省的 Windows XP L2TP 传输策略不允许不使用 IPSec 加密的 L2TP 传输,修改
AllowL2TPWeakCrypto
的值为1
- 重启
- 添加DWORD值(32位)值,名称
- iOS
联通移动信号无法连接,只能wifi - Android
Android对l2tp的支持有bug,所以连不上
后期
- 查看连接情况:
CentOS:/var/log/secure
Debian:/var/log/auth.log
小记
配置文件
配置文件路径 | 设置内容 |
---|---|
/etc/xl2tpd/xl2tpd.conf | ip池、内网IP |
/etc/ppp/options.xl2tpd | mtu、dns |
/etc/ipsec.conf | IPSec主配置文件 |
/etc/ipsec.secrets | 预共享密钥 |
/etc/ipsec.d/l2tp_psk.conf | 服务器IP |
/etc/ppp/chap-secrets | 帐号密码 |
/etc/sysctl.conf | 开启内核转发 |
/var/log/secure | 日志 |
所需要安装的软件
软件 | 作用 |
---|---|
libreswan(ipsec) | 提供一个密钥 |
ppp | 拨号软件,提供用户名和密码 |
xl2tpd | 提供L2TP服务 |
sysctl | 提供服务器内部转发 |
iptables | 提供请求从服务器内部转向外部,外部响应转向服务器内部 |