自从实验室放了台 Linux 服务器后,可玩的东西就越来越多了。虽然这台服务器主要的工作是 Web Server,但鉴于我们那小站压力非常之小,服务器资源绝大多数还是浪费着,所以让它多干些活是个不错的选择。实验室的内部网络中有不少非常有用的资 源,例如科研用的文献资料,个人的实验数据等等,这些内容一旦离开实验室就不那么容易访问到了。解决这个问题最好的办法就是 VPN。在 Ubuntu 上搭建 VPN 服务器的方法非常多,比较著名的有 PPTP, L2TP/IPSec 和 OpenVPN。这三种方式中后两者的安全性比较好,但配置较麻烦。其中 OpenVPN 在 Windows/Mac 平台上还需要额外的客户端。而 L2TP/IPSec 方式虽然比较好,但我配置后,虽然 Windows 和 Linux 用户没有问题,但 Mac/iPhone 却始终无法连上,所以暂时删掉了,日后搞清楚是什么问题再换到这种方式。
只剩下 PPTP 了。事实上 PPTP 是这三者中配置最容易的方式,而且由于 Windows/Mac 系统中都内建相应的客户端,使用起来非常方便。下面我就简单写写我的安装过程,希望对需要的朋友有用。当然如果您有什么高见,也欢迎您提出。
首先,我所有的操作都是在之前文 章中介绍的 Ubuntu 8.04 Server 系统中操作的,如果您的系统和我的不一样,请参考之前的两 篇文章。我的服务器环境是单网卡 eth0。
在 Ubuntu 中建立 pptp server 需要的软件包为 pptpd,用 apt-get 即可安装:
sudo apt-get install pptpd
系统会自动解决依赖关系,安装好后,需要进行一番设置。首先编辑 /etc/pptpd.conf
sudo nano /etc/pptpd.conf
去掉文件最末端的 localip 和 remoteip 两个参数的注释,并进行相应修改。这里,localip 是 VPN 连通后服务器的 ip 地址,而 remoteip 则是客户端的可分配 ip 地址。下面是我的配置:
localip 10.100.0.1 remoteip 10.100.0.2-10
编辑好这个文件后,我们需要编辑 /etc/ppp/pptpd-options 文件,还是用 nano 编辑,命令这里就不写了。这里绝大多数参数只需维持原来的默认值即可,我们只需要改变其中的 ms-dns 选项,为 VPN 客户端指派 DNS 服务器地址:
ms-dns 202.113.16.10 ms-dns 208.67.222.222
修改 /etc/ppp/chap-secrets 文件,这里面存放着 VPN 的用户名和密码,根据你的实际情况填写即可。如文件中注释所示,第一列是用户名,第二列是服务器名(默认写 pptpd 即可,如果在 pptpd-options 文件中更改过的话,注意这里保持一致),第三列是密码,第四列是 IP 限制(不做限制写 * 即可)。这里我就不贴我的配置了
全部搞定后,我们需要重启 pptpd 服务使新配置生效:
sudo /etc/init.d/pptpd restart
找一台 Windows 电脑,新建个 VPN 链接,地址填服务器的 IP(或域名),用户名密码填刚才设置好的,域那项空着(如果你在 pptpd-options 中设置了,这里就保持一致),点连接就可以了。正常情况下您应该能够建立与服务器的 VPN 链接了。
建立连接之后,您会发现除了可以访问服务器的资源,其余内外和互联网的内容均无法访问。如果需要访问这些内容的话,我们还需要进一步设置:
首先,开启 ipv4 forward。方法是,修改 /etc/sysctl.conf,找到类似下面的行并取消它们的注释:
net.ipv4.ip_forward=1
然后使新配置生效:
sudo sysctl -p
有些时候,经过这样设置,客户端机器就可以上网了(我在虚拟机上这样操作后就可以了)。但我在实验室的服务器上这样操作后仍然无法访问网络,这样我 们就需要建立一个 NAT。这里我们使用强大的 iptables 来建立 NAT。首先,先安装 iptables:
sudo apt-get intall iptables
装好后,我们向 nat 表中加入一条规则:
sudo iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -o eth0 -j MASQUERADE
这样操作后,客户端机器应该就可以上网了。
但是,只是这样,iptables 的规则会在下次重启时被清除,所以我们还 需要把它保存下来,方法是使用 iptables-save 命令:
sudo iptables-save > /etc/iptables-rules
然后修改 /etc/network/interfaces 文件,找到 eth0 那一节,在对 eth0 的设置最末尾加上下面这句:
pre-up iptables-restore < /etc/iptables-rules
这样当网卡 eth0 被加载的时候就会自动载入我们预先用 iptables-save 保存下的配置。
到此,一个 VPN Server/Gateway 基本就算架设完毕。当然,也许你按照我的方法做了,还是无法成功,那么下面总结一些我碰到的问题和解决方案:
无法建立 VPN 连接
安装好 pptpd 并设置后,客户端还是无法建立到服务器的连接。造成的原因可能有以下几种:
- 服务器端的防火墙设置:PPTP 服务需要使用 1723(tcp) 端口和 gre 协议,因此请确保您的防火墙设置允许这两者通行。
- 如果服务器在路由器后面,请确保路由器上做好相应的设置和端口转发。
- 如果服务器在路由器后面,那么请确保你的服务器支持 VPN Passthrough。
- 如果客户端在路由器后面,那么客户端所使用的路由器也必须支持 VPN Passthrough。其实市面上稍微好点的路由器都是支持 VPN Passthrough 的,当然也不排除那些最最最便宜的便宜货确实不支持。当然,如果你的路由器可以刷 DD-Wrt 的话就刷上吧,DD-Wrt 是支持的。
能建立链接,但“几乎”无法访问互联网
sudo iptables -A FORWARD -s 10.100.0.0/24 -p tcp -m tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1200
上面规则中的 1200 可以根据你的实际情况修改,为了保证最好的网络性能,这个值应该不断修改,直至能保证网络正常使用情况下的最大值。
好了,至此,一台单网卡 pptp-server 就算完成了。
pptp上网解决方法
- 在PPTP的服务端/etc/ppp/options.pptpd 中配置上mtu 1496.
- 给ppp0的接口直接修改mtu值,然后重启pptp服务即可生效。
Ubuntu server 12 上搭建 L2TP/IPSec VPN
一、简单的原理介绍
通过上次和 Paveo 大叔聊天,还有平时一些肤浅的了解,我们知道,所谓 L2TP/IPSec 就是 L2TP over IPSec。也就是说,这种 VPN 方式分两个部分,IPSec 和 L2TP。我们要先做好 IPSec 的部分。
在这个应用场景下,我的理解,IPSec 使用预共享密钥(PSK)进行加密和验证,L2TP 负责封包,PPP 负责具体的用户验证。
二、IPSEC 部分
在这里,我们使用 Openswan 来实现 IPSec。
sudo apt–get install openswan
编辑 IPSec 配置文件
请使用您喜欢的编辑器打开 /etc/ipsec.conf
文件。
sudo nano /etc/ipsec.conf
找到 protostack
一行,将其值改为 netkey
。应该是这个样子的:
protostack=netkey
好的,现在请将光标移动到文件末尾(末尾应该是一些注释说明,在它的下面),复制如下一段内容,
conn %default forceencaps=yes conn L2TP-PSK-NAT rightsubnet=vhost:%no,%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=您服务器的公网IPv4地址 leftprotoport=17/1701 right=%any rightprotoport=17/%any
嗯,IPSec 部分就快完成了。下面我们来设置 PSK 预共享密钥,用编辑器打开(没有就创建) /etc/ipsec.secrets
文件。
sudo nano /etc/ipsec.secrets
输入下面一行内容
您服务器的公网IPv4地址 %any: PSK "您的预共享密钥"
下面我们需要对系统的网络策略进行一些调整,请运行(一行一行地输入,输入完按回车,请忽略行首的空格):
for each in /proc/sys/net/ipv4/conf/* do echo 0 > $each/accept_redirects echo 0 > $each/send_redirects done
同时,将上面这段代码完整地复制一次,加入到 /etc/rc.local
中,使其在每次系统启动时都生效。具体方法是,运行 vi /etc/rc.local
,将光标移动到 exit 0
之前的行,复制代码。
接下来,我们来重启一次 IPSec 服务,
service ipsec restart
测试我们的 IPSec 部分配置是否成功
ipsec verify
如果在结果中看到「Opportunistic Encryption Support」被禁用了,没关系,其他项 OK 即可。
三、L2TP 部分
我们先来进行 L2TP 部分的配置,在这里,我们使用 xl2tpd 来实现。
1. 从源安装 xl2tpd
运行:
sudo apt–get install xl2tpd
2. 编辑 L2TP 配置文件
请打开 /etc/xl2tpd/xl2tpd.conf
文件,编辑方法您应该在上面已经学习过了,这里不再赘述。
sudo nano /etc/xl2tpd/xl2tpd.conf
删除文件所有内容,替换成:
[global] ; listen–addr = 192.168.1.98 [lns default] ip range = 10.1.1.2–10.1.1.255 local ip = 10.1.1.1 require chap = yes refuse pap = yes require authentication = yes name = LinuxVPNserver ppp debug = yes pppoptfile = /etc/ppp/options.xl2tpd length bit = yes
做一下简单的解释,这里的 ip range
项是连接上来的用户所获得到的服务器端内网的 IPv4 地址段。而 local ip
是在新建的网络接口 pppX
所占用的那个 IP 地址。因此,它们都不能和服务器端内网的任何 IP 地址(段)相重复或冲突。若不能理解,没关系,就请不要修改这个值。
修改完请保存。
注意到了吗,pppoptfile
这一项的值,指向到了一个现在也许不存在的目录下面的options.xl2tpd
文件。对,我们现在就来配置 PPP。
四、PPP 的配置
首先应该安装 ppp 包:
sudo apt–get instal ppp
从 xl2tpd 文档中复制一个配置文件样例到我们的配置文件目录:
cp /usr/share/doc/xl2tpd/examples/ppp–options.xl2tpd \ /etc/ppp/options.xl2tpd
出于网页宽度的限制,这是个多行命令,您可一次复制进终端,或是选择逐行输入。
下面打开编辑这个 /etc/ppp/options.xl2tpd
,
sudo nano /etc/ppp/options.xl2tpd
将光标移动到 ms-wins
的所在行,删除它们。并将 ms-dns
项调整为 Google Public DNS:
ms-dns 8.8.8.8 ms-dns 8.8.4.4
其它的都不要动,保存。
添加用户账户,“账户”都在 /etc/ppp/chap-secrets
中:
# Secrets for authentication using CHAP # client server secret IP addresses 用户名 * "密码" * userA * "password" *
重启一下 xl2tpd :
service xl2tpd restart
至此,IPSec、L2TP、PPP 应该都配置完毕了。您可以测试连接,xl2tpd 的日志文件应该包含在 /var/log/daemon.log
中。
这时虽然可以连接上 VPN,但是只能访问内网。需要说明的是,VPN 的功能就是这些。至于我们所说的“上网”,那就是下面数据转发的事情了,和 VPN 已经无关了。
如果在syslog里看到ipsec出现授权错误可进行以下操作:
openswan@openswanbox:~$ sudo cp /etc/ipsec.d/private/{openswanboxKey.pem,openswanboxkey_copy.pem}
openswan@openswanbox:~$ sudo openssl rsa -in /etc/ipsec.d/private/openswanboxkey_copy.pem -outform pem -out /etc/ipsec.d/private/openswanboxKey.pem
writing RSA key
openswan@openswanbox:~$ sudo service ipsec restart
五、转发设置
首先在系统的 /etc/sysctl.conf
将 net.ipv4.ip_forward
启用,具体方法是:
sudo nano /etc/sysctl.conf
找到 net.ipv4.ip_forward
一行,将光标移动至其前面的 # 号上,删除 # 号,应该看起来是这样的:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
请保存。再运行
sysctl -p
以直接令其生效。
我们使用发行版中通常包含了的 iptables 来配置更具体的转发。为避免繁琐的 iptables “永久”规则设定,我们让服务器每次启动时都设置一次,还需要用到 /etc/rc.local
,请运行:
sudo nano /etc/rc.local
将下面内容复制进来,复制之前这里应该已经有 5 行我们之前添加的代码,现在可以将下面这行添加在它的上面或下面,唯不要将其加在 5 行中间 ……
iptables -t nat -A POSTROUTING -s 10.1.1.0/24 -o eth0 -j MASQUERADE
这将应用我们刚刚设置的子网 10.1.1.0/24
的数据包可以从 eth0
接口被转发。
这时,您可以运行 reboot
重启您的服务器,或在终端运行一次上述 iptables
命令,即可令转发立即生效。
如果服务器在内网可在网关影射端口: TCP: 1723 UDP: 500,4500,1701