l2tp VPN搭建
l2tp server搭建
完成使用方法
步骤即可翻墙
写在前面
本脚本适用环境: 系统支持:CentOS6+,Debian7+,Ubuntu12+ 内存要求:≥128M 更新日期:2017 年 02 月 25 日 关于本脚本名词解释如下
- L2TP(Layer 2 Tunneling Protocol)
- IPSec(Internet Protocol Security)
- IKEv2 (Internet Key Exchange v2) 能实现 IPsec 的目前总体上有 openswan,libreswan,strongswan 这3种。 libreswan 是基于 openswan 的 fork,所以现在各个发行版基本已经看不到 openswan 的身影了。当然也有使用 strongswan 的。
之所以要更新 L2TP 一键安装脚本,是因为随着各个 Linux 发行版不断推陈出新,原有的脚本已经不适应现在的需求。 本脚本通过编译安装最新版 libreswan 来实现 IPSec(CentOS7 下则是全部 yum 安装),yum 或 apt-get 来安装 xl2tpd,再根据各个发行版的使用方法不同,部署防火墙规则。
基于 OpenVZ 虚拟化技术的 VPS 需要开启TUN/TAP才能正常使用,购买 VPS 时请先咨询服务商是否支持开启 TUN/TAP。
OpenVZ 虚拟的 VPS 需要系统内核支持 IPSec 才行。也就是说,母服务器的内核如果不支持的话那就没办法,只能换 VPS。 因此,一般不建议在 OpenVZ 的 VPS 上安装本脚本。脚本如果检测到该 VPS 为 OpenVZ 架构,会出现警告提醒。
如何检测是否支持TUN模块?
执行命令:
cat /dev/net/tun
如果返回信息为:cat: /dev/net/tun: File descriptor in bad state
说明正常
如何检测是否支持ppp模块?
执行命令:
cat /dev/ppp
如果返回信息为:cat: /dev/ppp: No such device or address
说明正常
当然,脚本在安装时也会执行检查,如果不适用于安装,脚本会予以提示。
搬瓦工使用的是OpenVZ架构,就算检测到支持TUN模块也不能成功翻墙,新出了KVM架构的VPS,价格稍微贵些
使用方法
一键安装脚本:https://github.com/hwdsl2/setup-ipsec-vpn/blob/master/README-zh.md root 用户登录后,运行以下命令:
1 | wget --no-check-certificate https://raw.githubusercontent.com/teddysun/across/master/l2tp.sh |
Please input IP-Range: (Default Range: 192.168.18): 输入本地IP段范围(本地电脑连接到VPS后给分配的一个本地IP地址),直接回车意味着输入默认值192.168.18
Please input PSK: (Default PSK: teddysun.com): PSK意为预共享密钥,即指定一个密钥将来在连接时需要用到,直接回车意味着输入默认值teddysun.com
Please input Username: (Default Username: teddysun): Username意为用户名,即第一个默认用户。直接回车意味着输入默认值teddysun
Please input teddysun’s password: (Default Password: Q4SKhu2EXQ): 输入用户的密码,默认会随机生成一个10位包含大小写字母和数字的密码,当然你也可以指定密码。
ServerIP:your_server_main_IP 显示你的 VPS 的主 IP(如果是多 IP 的 VPS 也只显示一个)
Server Local IP:192.168.18.1 显示你的 VPS 的本地 IP(默认即可)
Client Remote IP Range:192.168.18.2-192.168.18.254 显示 IP 段范围
PSK:teddysun.com 显示 PSK
Press any key to start…or Press Ctrl+c to cancel 按下任意按键继续,如果想取消安装,请按Ctrl+c键
安装完成后,脚本会执行 ipsec verify 命令并提示如下:
1 | If there are no [FAILED] above, then you can connect to your |
其他事项:
- 脚本在安装完成后,已自动启动进程,并加入了开机自启动。
- 脚本会改写 iptables 或 firewalld 的规则。
- 脚本安装时,会即时将安装日志写到 /root/l2tp.log 文件里,如果你安装失败,可以通过此文件来寻找错误信息。
安装完成需要修改路由配置才能翻墙,要不会导致客户端能连上但是不能翻墙.创建脚本set_iptables.sh,输入:
1 | iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o $eth -j MASQUERADE |
$eth一般换成eth0,可以使用ifconfig查看,119.28.59.230换成自己服务器公网地址
常见问题
问题1
安卓6.0系统无法成功连接l2tp,查了谷歌之后发现好像是安卓是sha256加密
我是这么做的,目前正常连接一小时,没有断线,mac ios android
需要在 /etc/ipsec.conf
的 conn L2TP-PSK-noNAT
下加入
1 | sha2-truncbug=yes |
然后重启 IPSec 和 xl2tpd 服务,重新连接就可以了。 可以解决安卓 6.0 的 vpn 无法连接问题。
问题2
在/etc/ipsec.conf
的 conn L2TP-PSK-noNAT
下加入
1 | leftnexthop defaultroute |
然后重启 IPSec 和 xl2tpd 服务应该可以解决同一局域下多人连接的时候,出现连接不上的情况。 如果还是不行,就得看下这个链接里面的配置: https://segmentfault.com/a/1190000005626927 我就是根据这个里面的配置和你的对比改好了。
安装完成后配置文件
(不需要手动配置,学习用)
l2tp/etc/xl2tpd/xl2tpd.conf
1 | [global] |
配置说明如下:
- ip range = 可以连接VPN服务的客户端IP地址范围
- local ip = VPN 服务器的IP,必须在客户端IP范围之外
- refuse pap = 拒绝 pap 认证
- ppp debug = 测试时打开
l2tp
/etc/xl2tpd/l2tp-secrets
1
* * exampleforchallengestring
配置密码
l2tp/etc/ppp/options.xl2tpd
1 | refuse-mschap-v2 |
- ms-dns 选项设置要给客户端分配的 DNS 服务器,当客户端连接时,就会被分配这些 DNS。如果要加入多个 DNS,就每行一个,分别写几行。
如果你要给客户端推送wins设置,可以分别设置如下选项。
mtu 和 mru 按照openswan.org的说法,减小 mru/mtu 的大小非常重要。因为 l2tp/ipsec 会封装几次,可能导致性能下降,减小这个配置的大小可以一次性传输全部的包。
proxyarp 可以将连接的客户端的IP地址和以太网地址加入的系统的ARP表中。这会影响到本地局域网内其它客户端。
name l2tpd 用在 PPP验证文件里面。
ipsec/etc/ppp/chap-secrets
1 | user1 l2tpd chooseagoodpassword * |
每行包括如下字段:
- 客户端 = 用户名称
- 服务器 = 在上面的 /etc/ppp/options.xl2tpd 定义的名字
- 密码 = 用户密码,你应该设置一个足够复杂的密码
- IP 地址 = * 表示用户可以从任何地址连接,否则设置用户只能从特定的地址连接
ipsec/etc/ipsec.conf
1 | config setup |
注意你的ipsec.conf文件,”config setup” 和 “L2TP-PSK-NAT”、 “L2TP-PSK-NAT”应该顶着行头写,而其它行应该以8个空格缩进。
ipsec/etc/ipsec.secrets
1 | x.x.x.x %any: PSK "somegoodpassword" |
这里x.x.x.x 替换为你的服务器的IP地址,并设置一个复杂的密码
/etc/init.d
在/etc/init.d
下创建一个名为ipsec.vpn
的文件,内容如下:
1 | case "$1" in |
这会配置防火墙转发。记得修改上面文件的本地IP地址池10.152.2.0/24为你自己的。 给这个文件设置可执行权限:
1 | sudo chmod 755 ipsec.vpn |
禁止默认的 ipsec 服务脚本运行:
1 | sudo update-rc.d -f ipsec remove |
然后,启用我们刚才定制的这个
1 | sudo update-rc.d ipsec.vpn defaults |
l2tp.sh脚本命令
如果你要想对用户进行操作,可以使用如下命令:
- l2tp -a 新增用户
- l2tp -d 删除用户
- l2tp -m 修改现有的用户的密码
- l2tp -l 列出所有用户名和密码
- l2tp -h 列出帮助信息
ipsec & xl2tpd命令(用)
ipsec status (查看 IPSec 运行状态)
ipsec verify (查看 IPSec 检查结果)
/etc/init.d/ipsec start|stop|restart|status (CentOS6 下使用)
/etc/init.d/xl2tpd start|stop|restart (CentOS6 下使用)
systemctl start|stop|restart|status ipsec (CentOS7 下使用)
systemctl start|stop|restart xl2tpd (CentOS7 下使用)
service ipsec start|stop|restart|status (Debian/Ubuntu 下使用)
service xl2tpd start|stop|restart (Debian/Ubuntu 下使用)
ipsec whack --trafficstatus
:查看链接客户端信息
排除故障
如果遇到了问题,以下命令可以帮助你找到问题:
1 | sudo tcpdump -i ppp0 |
你可以可以在服务器上使用如下命令来监控:
1 | sudo tcpdump -i eth0 host aaa.bbb.ccc.ddd and not port ssh |
l2tp 客户端连接(主要是ubuntu)
以下步骤是在 Peter Sanford 的工作 基础上修改。这些命令必须在你的 VPN 客户端上使用 root
账户运行。
参考自:https://github.com/hwdsl2/setup-ipsec-vpn 下doc下的clients-zh.md,客户端和服务器配置教程工具都下载到了Doc/vpn_doc
要配置 VPN 客户端,首先安装以下软件包:
1 | # Ubuntu & Debian |
创建 VPN 变量 (替换为你自己的值):
1 | VPN_SERVER_IP='your_vpn_server_ip' |
配置 strongSwan:
1 | cat > /etc/ipsec.conf <<EOF |
配置 xl2tpd:
1 | cat > /etc/xl2tpd/xl2tpd.conf <<EOF |
至此 VPN 客户端配置已完成。按照下面的步骤进行连接。
创建 xl2tpd 控制文件:
1 | mkdir -p /var/run/xl2tpd |
重启服务:
1 | service strongswan restart |
开始 IPsec 连接:
1 | # Ubuntu & Debian |
开始 L2TP 连接:
1 | echo "c myvpn" > /var/run/xl2tpd/l2tp-control |
运行 ifconfig
并且检查输出。现在你应该看到一个新的网络接口 ppp0
。
检查你现有的默认路由:
1 | ip route |
在输出中查找以下行: default via X.X.X.X ...
。记下这个网关 IP,并且在下面的两个命令中使用。
从新的默认路由中排除你的 VPN 服务器 IP (替换为你自己的值):
1 | route add YOUR_VPN_SERVER_IP gw X.X.X.X |
如果你的 VPN 客户端是一个远程服务器,则必须从新的默认路由中排除你本地电脑的公有 IP,以避免 SSH 会话被断开 (替换为你自己的公有 IP,可在 这里查看):
1 | route add YOUR_LOCAL_PC_PUBLIC_IP gw X.X.X.X |
添加一个新的默认路由,并且开始通过 VPN 服务器发送数据:
1 | route add default dev ppp0 |
至此 VPN 连接已成功完成。检查 VPN 是否正常工作:
1 | wget -qO- http://ipv4.icanhazip.com; echo |
以上命令应该返回 你的 VPN 服务器 IP
。
要停止通过 VPN 服务器发送数据:
1 | route del default dev ppp0 |
要断开连接:
1 | # Ubuntu & Debian |