之前我写了一篇《买一个便宜的VPS,搞一个VPN》,可以看我的主页里面找到这篇文章,那篇文章介绍的是如何用PPTP来实现VPN。但是在后来我发现,通过PPTP搭建的VPN总是掉线,所以我想换成L2TP后会不会好一点,所以又研究了一下搭建L2TP的VPN。
一般的教程在描绘环境的搭建步骤的时候分为两种,一种是先把所有的软件安装好,然后再逐个配置,另一种则是逐个安装和配置软件,最后配置各个软件之间的关联性。我这篇文章采用后一种方法来讲解。
依赖环境
yum update
yum install -y make gcc gmp-devel xmlto bison flex xmlto libpcap-devel lsof vim-enhanced man
openswan(ipsec)
什么是openswan呢,可以百科一下。简单的说它就是ipsec。安装openswan也就是安装ipsec。但是如果你深入去了解,就知道openswan是一套方案。我们这篇文章的目的是搭建起VPN,所以不深入探讨。
yum install openswan
一般而言,大部分服务器运行上面一句都可以成功。这样ipsec就安装好了。
假如在一些情况下,你不能安装某些软件,你一定要记住,linux还有rpm/deb等安装包安装的方法,比如下面的xd,很多情况下服务器上都没有自带安装包,要我们用rpm包来安装,除了软件安装包,还有源码编译安装的方式。所以如果你在yum install的时候提示no package,就可以考虑到网上去找安装包或源码。
接下来配置ipsec。ipsec的配置文件是/etc/ipsec.conf,安装好openswan后,配置文件是默认内容。我们为了方便,把默认的配置文件备份到某个目录下,比如~/~etc/ipsec.conf,然后自己新建一个ipsec.conf,执行方法如下:
mkdir ~/~etc
mv /etc/ipsec.conf ~/~etc/ipsec.conf
vi /etc/ipsec.conf
这样,就准备新建一个ipsec.conf,我们把下面的内容直接全部拷贝为新文件的内容:
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
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
ikelifetime=8h
keylife=1h
type=transport
left=xxx.xxx.xxx.xxx
leftprotoport=17/1701
right=%any
rightprotoport=17/%any
上面有一行是left=xxx.xx.xx.xx
,这里要把left的值改为你的服务器的ip地址,外网可以访问的IP地址。
接下来配置密钥。L2TP比PPTP多了一个密钥项,这也是它比PPTP更安全的原因之一。这个密钥其实就是一个密码,不同于用户的登录密码,它相当于一个设备之间通信的密钥。它的配置文件是/etc/ipsec.secrets,按照相同的方法,我们先备份一下它,然后新建一个我们自己的:
mv /etc/ipsec.secrets ~/~etc/ipsec.secrets
vi /etc/ipsec.secrets
然后把下面的内容放到新建的配置文件中:
xxx.xxx.xxx.xxx %any: PSK "YourPsk"
同理,上面的xxx.xxx.xxx.xxx
是服务器的公网IP,而后面的"YourPsk"中的YourPsk就是密钥的内容。你可以改为自己的任意字符串。反正在你连接登录VPN的时候,是需要这个PSK的。
运行ipsec.
ipsec setup restart
chkconfig ipsec on
这样,ipsec就跑起来了。网上还说需要使用ipsec verify去验证ipsec是否真的跑起来可以用,我觉得可以暂时不看,比较整个环境还没配完。
PPP
PPP就是一个拨号软件,用来提供用户登录的用户名和密码验证用的。所以在上面那篇文章里,PPTP搭建的VPN也会用到PPP。所以,实际上,PPTP和L2TP是可以共存在一台服务器上的,而且它们还可以共享用户登录账号信息,因为它们都用PPP作为用户登录连接。
yum install ppp
一般服务器都是OK的,如果你的PPP没有安装成,记住我上面提供的另外两种安装方式。虽然我们现在还没有搭建起整个VPN,但是可以先在PPP中把要用来登录的用户名和密码先安排好:
vi /etc/ppp/chap-secrets
在上面的文件中新增一行:
loginname * loginpassword *
有两个星号,第一个表示以后所有使用PPP作为用户认证的服务,都可以使用这个用户名和密码,包括PPTP和L2TP都可以使用loginname。第二个星号表示这个用户可以从任何IP登录。如果你希望控制一下,可以把星号改成具体的值来限制。
xd
就像pptp和pptpd一样,L2TP也依赖于xd。
yum install xd
但是大多数情况下,服务器上运行上面的命令会不成功,因为不存在xd这个安装包。不过如果你运行成功的话,就可以继续往下操作,否则,我们运行下面的命令,通过rpm包来安装:
wget http://dl.fedoraproject.org/pub/epel/6/x86_64/xd-1.3.6-2.el6.x86_64.rpm
yum install xd-1.3.6-2.el6.x86_64.rpm
注意,上面下载的是64位的安装包,你可以在pkgs.org这个网站上搜索xd找到你需要的版本。
安装好xd之后,我们进行配置。它的配置文件有两个,一个是/etc/xd/xd.conf一个是/etc/ppp/options.xd,其实第一个文件把第二个文件包含进来而已。同样的道理,我们仍然采用备份和创建新文件的方法来修改配置文件:
mkdir ~/~etc/xd
mv /etc/xd/xd.conf ~/~etc/xd/xd.conf
vi /etc/xd/xd.conf
把下面的内容写进去:
[global]
ipsec saref = yes
listen-addr = xxx.xxx.xxx.xxx
[lns default]
ip range = 192.168.1.2-192.168.1.100
local ip = 192.168.1.1
refuse chap = yes
refuse pap = yes
require authentication = yes
ppp debug = yes
pppoptfile = /etc/ppp/options.xd
length bit = yes
和上面提到的一样xxx.xxx.xxx.xxx
也要改成你自己的服务器外网IP。
mkdir ~/~etc/ppp
mv /etc/ppp/options.xd ~/~etc/ppp/opitons.xd
vi /etc/ppp/options.xd
写入下面的内容:
require-mschap-v2
ms-dns 8.8.8.8
ms-dns 8.8.4.4
asyncmap 0
auth
crtscts
lock
hide-password
modem
debug
name d
proxyarp
lcp-echo-interval 30
lcp-echo-failure 4
这样,xd的配置就好了。
启动xd服务:
service xd restart
chkconfig xd on
sysctl
sysctl的功能是开启转发。它能够将服务器内部的ip地址关系进行转发和映射,从而实现我们链接VPN之后的用户,能够通过内部的一些端口进行请求的转发。
vi /etc/sysctl.conf
找到下面几个选项,并把值改为我提供的值:
net.ipv4.ip_forward = 1
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.default.send_redirects = 0
net.ipv4.conf.all.log_martians = 0
net.ipv4.conf.default.log_martians = 0
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.icmp_ignore_bogus_error_responses = 1
如果没有找到某些选项,直接把它写到文件的末尾。保存之后,执行:
sysctl -p
这样配置就生效了。
iptables
我以前已经比较详细的介绍过iptables了,虽然它是个防火墙软件,但是在上介绍PPTP的VPN搭建的时候,我已经说过了,我们需要iptables来作为外部请求的转发。sysctl帮我们解决的是,一个用户通过ppp连接到服务器之后,他发的请求在服务器内部是怎样实现映射的,所以,没有iptables,用户通过上面的那些配置,就可以登录连接到L2TP VPN了,但是很有可能是连接上无法上网,因为外部的请求还没有转发啊。所以,我们执行下面的这些命令,来使iptables实现转发。
iptables -A INPUT -m policy --dir in --pol ipsec -j ACCEPT
iptables -A FORWARD -m policy --dir in --pol ipsec -j ACCEPT
iptables -t nat -A POSTROUTING -m policy --dir out --pol none -j MASQUERADE
iptables -A FORWARD -i ppp+ -p all -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m policy --dir in --pol ipsec -p udp --dport 1701 -j ACCEPT
iptables -A INPUT -p udp --dport 500 -j ACCEPT
iptables -A INPUT -p udp --dport 4500 -j ACCEPT
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE
service iptables save
service iptables restart
不过上面的操作可能并不是我们最终想要的结果,为什么呢?因为我们执行iptables -A这样的操作,会在iptables的规则文件中追加这条规则。但是如果你的配置中,原本就已经通过REJECT结束了规则的匹配怎么办?你新加的规则根本不起作用。我的解决办法就是查看iptables的真实规则,并把REJECT相关的规则放到末尾。iptables的规则文件是/etc/sysconfig/iptables,你可以打开看一下有没有出现我说的情况,如果有的话,调整一下规则顺序,把上面新加的规则全部移动到REJECT相关的行的前面去。如果你不懂iptables,最好先学习一下,我的文章《iptables入门:规则及路由基础》对iptables进行了详细的讲解,可以帮助你快速入门。
调整完,执行service iptables restart
,以确保你的服务器外网转发OK。
总结
这个时候,我们在来运行一下:
ipsec setup restart
ipsec verify
这个时候,你可能就已经可以看到正常的信息了。
我们简单总结一下,我们这篇教程里面用到的软件有:
openswan(ipsec) : 提供一个密钥
ppp :提供用户名和密码
xd : 提供L2TP服务
sysctl : 提供服务器内部转发
iptables : 提供请求从服务器内部转向外部,外部响应转向服务器内部
这就是我们搭建L2TP VPN的相关知识,百闻不如一练,自己去试试吧。
关注我微博和我交流@否子戈