L2TP 部署

一. 环境
1. 需要软件
openswan(ipsec) : 提供一个密钥
ppp :提供用户名和密码
xl2tpd : 提供 L2TP 服务
sysctl : 提供服务器内部转发
iptables : 提供请求从服务器内部转向外部,外部响应转向服务器内部依赖环境

2. 安装依赖
yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced man

3.openswan(ipsec)安装
OpenSWan,Linux 下 IPsec 的最佳实现方式,其功能强大,最大程度地保证了数据传输中的安全性、完整性问题。
yum install openswan

接下来配置 ipsec。ipsec 的配置文件是 /etc/ipsec.conf,安装好 openswan 后,配置文件是默认内容。先进行备份再更改文件。
mkdir ~/~etc
mv /etc/ipsec.conf ~/~etc/ipsec.conf
vi ~/~etc/ipsec.conf

version 2.0
config setup
protostack=netkey
nhelpers=0
uniqueids=no
interfaces=%defaultroute
virtual_private=%v4:10.0.0.0/8,%v4:192.168.0.0/16,%v4:172.16.0.0/12,%v4:!192.168.2.0/24
conn l2tp-psk
rightsubnet=vhost:%priv
also=l2tp-psk-nonat
conn l2tp-psk-nonat
authby=secret
pfs=no
auto=add
keyingtries=3
rekey=no
ikelifetime=8h
keylife=1h
type=transport
left=%defaultroute
leftid=xxx.xx.xx.xx
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
dpddelay=40
dpdtimeout=130
dpdaction=clear
sha2-truncbug=yes
上面有一行是 leftid=xxx.xx.xx.xx,这里要把 leftid 的值改为服务器的 ip 地址,外网可以访问的 IP 地址。

接下来配置密钥。L2TP 比 PPTP 多了一个密钥项,这也是它比 PPTP 更安全的原因之一。这个密钥其实就是一个密码,不同于用户的登录密码,它相当于一个设备之间通信的密钥。它的配置文件是 /etc/ipsec.secrets,按照相同的方法,我们先备份一下它,然后新建一个我们自己的:
mv /etc/ipsec.secrets ~/~etc/ipsec.secrets
vi /etc/ipsec.secrets

%any %any : PSK “RZSJ.COM”
同理,%any 是所有地址,也可以单个指定,而后面的”YourPsk”中的 YourPsk 就是密钥的内容。你可以改为自己的任意字符串。反正在你连接登录 VPN 的时候,是需要这个 PSK 的。

运行 ipsec:
systemctl restart ipsec
systemctl enable ipsec

4.ppp 软件安装
PPP 就是一个拨号软件,用来提供用户登录的用户名和密码验证用的。实际上,PPTP 和 L2TP 是可以共存在一台服务器上的,而且它们还可以共享用户登录账号信息,因为它们都用 PPP 作为用户登录连接。
yum install ppp

虽然我们现在还没有搭建起整个 VPN,但是可以先在 PPP 中把要用来登录的用户名和密码先安排好,在上面的文件中新增一行:

vi /etc/ppp/chap-secrets

xxx l2tpd Qwer1234!

l2tpd表示以后所有使用PPP作为用户认证的服务,xxx为用户名,Qwer1234!则是密码,包括PPTP和L2TP都可以使用loginname。第一个星号表示这个用户可以从任何IP登录。如果你希望控制一下,可以把星号改成具体的值来限制。
5.xl2tpd软件安装
就像pptp和pptpd一样,L2TP也依赖于xl2tpd。
`yum install xl2tpd`
但是大多数情况下,服务器上运行上面的命令会不成功,因为不存在xl2tpd这个安装包。如果运行成功的话,就可以继续往下操作,否则,我们运行下面的命令,通过rpm包来安装:
`wget http://dl.fedoraproject.org/pub/epel/6/x86_64/xl2tpd-1.3.6-2.el6.x86_64.rpm`
`yum install xl2tpd-1.3.6-2.el6.x86_64.rpm`
安装好xl2tpd之后,我们进行配置。它的配置文件有两个,一个是/etc/xl2tpd/xl2tpd.conf一个是/etc/ppp/options.xl2tpd,其实第一个文件把第二个文件包含进来而已。仍然采用备份和创建新文件的方法来修改配置文件:
ip range为给客户端分配的内网地址的范围。
`mkdir ~/~etc/xl2tpd`
`mv /etc/xl2tpd/xl2tpd.conf ~/~etc/xl2tpd/xl2tpd.conf`
`vi /etc/xl2tpd/xl2tpd.conf`
```c
[global]
port = 1701
[lns default]
ip range = 192.168.2.100-192.168.2.200
local ip = 192.168.2.1
require chap = yes
refuse pap = yes
require authentication = yes
name = l2tpd
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
mkdir ~/~etc/ppp
mv /etc/ppp/options.xl2tpd ~/~etc/ppp/opitons.xl2tpd
vi /etc/ppp/options.xl2tpd

ipcp-accept-local
ipcp-accept-remote
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
noccp
auth
hide-password
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
proxyarp
connect-delay 5000
启动xl2tpd服务:
systemctl restart xl2tpd
systemctl enable xl2tpd

6.sysctl转发设置
sysctl的功能是开启转发。它能够将服务器内部的ip地址关系进行转发和映射,从而实现我们链接VPN之后的用户,能够通过内部的一些端口进行请求的转发。

找到下面几个选项,并把值改为我提供的值:
vi /etc/sysctl.conf

net.ipv4.ip_forward=1
net.ipv4.tcp_syncookies=1
net.ipv4.icmp_echo_ignore_broadcasts=1
net.ipv4.icmp_ignore_bogus_error_responses=1
net.ipv4.conf.all.accept_source_route=0
net.ipv4.conf.all.accept_redirects=0
net.ipv4.conf.all.send_redirects=0
net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.default.accept_source_route=0
net.ipv4.conf.default.accept_redirects=0
net.ipv4.conf.default.send_redirects=0
net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.ens32.accept_source_route=0
net.ipv4.conf.ens32.accept_redirects=0
net.ipv4.conf.ens32.send_redirects=0
net.ipv4.conf.ens32.rp_filter=0
net.ipv4.conf.lo.accept_source_route=0
net.ipv4.conf.lo.accept_redirects=0
net.ipv4.conf.lo.send_redirects=0
net.ipv4.conf.lo.rp_filter=0
如果没有找到某些选项,直接把它写到文件的末尾。保存之后,执行:
sysctl -p

7.iptables规则设置
需要iptables来作为外部请求的转发。sysctl解决的是,一个用户通过ppp连接到服务器之后,他发的请求在服务器内部是怎样实现映射的,所以,没有iptables,用户通过上面的那些配置,就可以登录连接到L2TP VPN了,但是很有可能是连接上无法上网,因为外部的请求还没有转发,配置以下内容来转发。
iptables -I INPUT -p udp -m multiport --dports 500,4500,1701 -j ACCEPT
iptables -I FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -I FORWARD -s 192.168.2.0/23 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.2.0/23 -j SNAT --to-source xxx.xx.xx.xx
iptables save

其中192.168.2.0/23是分配的客户端地址范围可自定义,xxx.xx.xx.xx是映射的外网地址
systemctl restart iptables