l2tp VPN搭建

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
2
3
wget --no-check-certificate https://raw.githubusercontent.com/teddysun/across/master/l2tp.sh
chmod +x l2tp.sh
./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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
If there are no [FAILED] above, then you can connect to your
L2TP VPN Server with the default Username/Password is below:

ServerIP:your_server_IP
PSK:your PSK
Username:your usename
Password:your password

If you want to modify user settings, please use command(s):
l2tp -a (Add a user)
l2tp -d (Delete a user)
l2tp -l (List all users)
l2tp -m (Modify a user password)
Welcome to visit https://teddysun.com/448.html
Enjoy it!

其他事项:

  1. 脚本在安装完成后,已自动启动进程,并加入了开机自启动。
  2. 脚本会改写 iptables 或 firewalld 的规则。
  3. 脚本安装时,会即时将安装日志写到 /root/l2tp.log 文件里,如果你安装失败,可以通过此文件来寻找错误信息。

安装完成需要修改路由配置才能翻墙,要不会导致客户端能连上但是不能翻墙.创建脚本set_iptables.sh,输入:

1
2
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -o $eth -j MASQUERADE
iptables -t nat -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to-source 119.28.59.230

$eth一般换成eth0,可以使用ifconfig查看,119.28.59.230换成自己服务器公网地址

常见问题

问题1

安卓6.0系统无法成功连接l2tp,查了谷歌之后发现好像是安卓是sha256加密 我是这么做的,目前正常连接一小时,没有断线,mac ios android 需要在 /etc/ipsec.confconn L2TP-PSK-noNAT 下加入

1
sha2-truncbug=yes

然后重启 IPSec 和 xl2tpd 服务,重新连接就可以了。 可以解决安卓 6.0 的 vpn 无法连接问题。

问题2

/etc/ipsec.confconn L2TP-PSK-noNAT 下加入

1
2
leftnexthop defaultroute
rightnexthop defaultroute

然后重启 IPSec 和 xl2tpd 服务应该可以解决同一局域下多人连接的时候,出现连接不上的情况。 如果还是不行,就得看下这个链接里面的配置: https://segmentfault.com/a/1190000005626927 我就是根据这个里面的配置和你的对比改好了。

安装完成后配置文件

(不需要手动配置,学习用)

l2tp/etc/xl2tpd/xl2tpd.conf
1
2
3
4
5
6
7
8
9
10
11
12
[global]
ipsec saref = no

[lns default]
ip range = 10.152.2.2-10.152.2.254
local ip = 10.152.2.1
require chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes

配置说明如下:

  • 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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
refuse-mschap-v2
refuse-mschap
ms-dns 8.8.8.8
ms-dns 8.8.4.4
asyncmap 0
auth
crtscts
idle 1800
mtu 1200
mru 1200
lock
hide-password
local
#debug
name l2tpd
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
  • 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
2
user1 l2tpd chooseagoodpassword *
user2 * chooseagoodpassword *

每行包括如下字段:

  • 客户端 = 用户名称
  • 服务器 = 在上面的 /etc/ppp/options.xl2tpd 定义的名字
  • 密码 = 用户密码,你应该设置一个足够复杂的密码
  • IP 地址 = * 表示用户可以从任何地址连接,否则设置用户只能从特定的地址连接
ipsec/etc/ipsec.conf
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
config setup
nat_traversal=yes
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!10.152.2.0/24
# 这里包含的网络地址允许配置为远程客户端所在的子网。换句话说,
# 这些地址范围应该是你的NAT路由器后面的客户端的地址。
oe=off
protostack=netkey

conn L2TP-PSK-NAT
rightsubnet=vhost:%priv
also=L2TP-PSK-noNAT

conn L2TP-PSK-noNAT
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
# Apple 的 iOS 不会发送 delete 提醒,
# 所以我们需要通过死亡对端(dead peer)检测来识别断掉的客户端
dpddelay=30
dpdtimeout=120
dpdaction=clear
# 设置 ikelifetime 和 keylife 和 Windows 的默认设置一致
ikelifetime=8h
keylife=1h
type=transport
# 替换 IP 地址为你的本地IP (一般是,私有地址、NAT内的地址)
left=x.x.x.x
# 用于升级过的 Windows 2000/XP 客户端
leftprotoport=17/1701
# 要支持老的客户端,需要设置 leftprotoport=17/%any
right=%any
rightprotoport=17/%any
# 强制所有连接都NAT,因为 iOS
forceencaps=yes

注意你的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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
case "$1" in
start)
echo "Starting my Ipsec VPN"
iptables -t nat -A POSTROUTING -o eth0 -s 10.152.2.0/24 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done
/etc/init.d/ipsec start
/etc/init.d/xl2tpd start
;;
stop)
echo "Stopping my Ipsec VPN"
iptables --table nat --flush
echo 0 > /proc/sys/net/ipv4/ip_forward
/etc/init.d/ipsec stop
/etc/init.d/xl2tpd stop
;;
restart)
echo "Restarting my Ipsec VPN"
iptables -t nat -A POSTROUTING -o eth0 -s 10.152.2.0/24 -j MASQUERADE
echo 1 > /proc/sys/net/ipv4/ip_forward
for each in /proc/sys/net/ipv4/conf/*
do
echo 0 > $each/accept_redirects
echo 0 > $each/send_redirects
done
/etc/init.d/ipsec restart
/etc/init.d/xl2tpd restart
;;
*)
echo "Usage: /etc/init.d/ipsec.vpn {start|stop|restart}"
exit 1
;;
esac

这会配置防火墙转发。记得修改上面文件的本地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
2
3
sudo tcpdump -i ppp0
sudo tail -f /var/log/auth.log
sudo tail -f /var/log/syslog

你可以可以在服务器上使用如下命令来监控:

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
2
3
4
5
6
7
8
9
10
# Ubuntu & Debian
apt-get update
apt-get -y install strongswan xl2tpd

# CentOS & RHEL
yum -y install epel-release
yum -y install strongswan xl2tpd

# Fedora
yum -y install strongswan xl2tpd

创建 VPN 变量 (替换为你自己的值):

1
2
3
4
VPN_SERVER_IP='your_vpn_server_ip'
VPN_IPSEC_PSK='your_ipsec_pre_shared_key'
VPN_USER='your_vpn_username'
VPN_PASSWORD='your_vpn_password'

配置 strongSwan:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
cat > /etc/ipsec.conf <<EOF
# ipsec.conf - strongSwan IPsec configuration file

# basic configuration

config setup
# strictcrlpolicy=yes
# uniqueids = no

# Add connections here.

# Sample VPN connections

conn %default
ikelifetime=60m
keylife=20m
rekeymargin=3m
keyingtries=1
keyexchange=ikev1
authby=secret
ike=aes128-sha1-modp1024,3des-sha1-modp1024!
esp=aes128-sha1-modp1024,3des-sha1-modp1024!

conn myvpn
keyexchange=ikev1
left=%defaultroute
auto=add
authby=secret
type=transport
leftprotoport=17/1701
rightprotoport=17/1701
right=$VPN_SERVER_IP
EOF

cat > /etc/ipsec.secrets <<EOF
: PSK "$VPN_IPSEC_PSK"
EOF

chmod 600 /etc/ipsec.secrets

# For CentOS/RHEL & Fedora ONLY
mv /etc/strongswan/ipsec.conf /etc/strongswan/ipsec.conf.old 2>/dev/null
mv /etc/strongswan/ipsec.secrets /etc/strongswan/ipsec.secrets.old 2>/dev/null
ln -s /etc/ipsec.conf /etc/strongswan/ipsec.conf
ln -s /etc/ipsec.secrets /etc/strongswan/ipsec.secrets

配置 xl2tpd:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
cat > /etc/xl2tpd/xl2tpd.conf <<EOF
[lac myvpn]
lns = $VPN_SERVER_IP
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
EOF

cat > /etc/ppp/options.l2tpd.client <<EOF
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-chap
noccp
noauth
mtu 1280
mru 1280
noipdefault
defaultroute
usepeerdns
connect-delay 5000
name $VPN_USER
password $VPN_PASSWORD
EOF

chmod 600 /etc/ppp/options.l2tpd.client

至此 VPN 客户端配置已完成。按照下面的步骤进行连接。

创建 xl2tpd 控制文件:

1
2
mkdir -p /var/run/xl2tpd
touch /var/run/xl2tpd/l2tp-control

重启服务:

1
2
service strongswan restart
service xl2tpd restart

开始 IPsec 连接:

1
2
3
4
5
# Ubuntu & Debian
ipsec up myvpn

# CentOS/RHEL & Fedora
strongswan up myvpn

开始 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
2
3
4
5
6
7
# Ubuntu & Debian
echo "d myvpn" > /var/run/xl2tpd/l2tp-control
ipsec down myvpn

# CentOS/RHEL & Fedora
echo "d myvpn" > /var/run/xl2tpd/l2tp-control
strongswan down myvpn
坚持原创技术分享,您的支持将鼓励我继续创作!