由于一些众所不知的原因,我国访问某些网站的路由有些问题。这是个迷,不过我觉得与其解出这个谜,还不如绕路走。
L2TP/IPSec VPN 是除 OpenVPN 以外,一个不错的解决方案。若您没有如 iPhone、iPod touch、iPad 这样的 Apple 设备,您完全没有必要建立 L2TP/IPSec VPN。OpenVPN 完全可以满足您的需求,而且搭建方便很多。请考虑看看 Linode Library 中关于 OpenVPN 搭建的相关教程。
网上已经有了很多 L2TP/IPSec VPN 的搭建教程,可是我怎么就一个也不成功呢。那么我来写一个,如果您和我一样“不求甚解”,那么不妨按照我“走通了的路”来走。我会尽我所能,做一些解释说明,也欢迎各位网络大牛帮忙进一步解释、或是修正我的观点。不欢迎装逼、无聊的言论。
〇、说在最前
虽然我不喜欢扯淡,但是有些淡还是必须要扯的:
本次搭建,必须要的是:
- 一台 VPS 或是独立服务器(至于服务器放在哪里,这个很有讲究,比如你不可以选择朝鲜 VPS 或是和朝鲜 VPS 类似的 VPS)
- Ubuntu Server(或其它操作系统,但我未做测试)
- 若是 VPS,请尽量使用 Xen 虚拟化技术(OpenVZ 的网络我还没有测试过)
- 以 root 用户或同等权限用户登录
- 至少 3 个小时的空余时间、足够的耐心(初次安装花了我几天的时间,问了很多朋友,这次再安装,也用了我一个下午的时间。不过希望本教程可以助您缩短这个时间)
本次搭建,达到的目的有:
- 一个 L2TP/IPSec VPN
- 使用预共享密钥(PSK)、用户名密码进行加密和验证
- Mac OS X、iOS 能够正常连接
本次搭建无论如何也达不到的是:
- 无法在 Windows 系统中连接
扯淡完毕。开始正事 ——
一、简单的原理介绍
通过上次和 Paveo 大叔聊天,还有平时一些肤浅的了解,我们知道,所谓 L2TP/IPSec 就是 L2TP over IPSec。也就是说,这种 VPN 方式分两个部分,IPSec 和 L2TP。我们要先做好 IPSec 的部分。
在这个应用场景下,我的理解,IPSec 使用预共享密钥(PSK)进行加密和验证,L2TP 负责封包,PPP 负责具体的用户验证。
二、IPSec 部分
在这里,我们使用 Openswan 来实现 IPSec。
Ubuntu 当前的 lucid 源中,Openswan 有关于 NAT 的 bug,会妨碍某些情况下的用户连接,因此,我们先来手动编译它。
若您在 2010 年 11 月或以后看到本篇文章,并且使用最新的发行版,则您无须手动编译,只需运行 aptitude install openswan 即可。因为在您的发行版软件仓库中的 openswan 包已经修复了那个 bug。
1. 安装编译工具
初次编译程序,您需要安装一些编译所必须的包。一次运行:
aptitude install build-essential
请注意,如果您编译过其它软件,您很可能已经装过这个包了,不必重复安装。
一些 Openswan 所依赖的包:
aptitude install libgmp3-dev gawk flex bison
2. 下载、解压缩、编译并安装 Openswan 2.6.27
我们还是到 root 目录来操作吧,不要弄脏别的目录。运行:
cd ~/
从官方网站下载 Openswan 2.6.27:
wget http://www.openswan.org/download/openswan-2.6.27.tar.gz
请注意,若您发现了更新版本的 Openswan,我建议您安装更新版本的,请将 2.6.27 替换为您找到的版本号。若您不太关心这些,请无须更改而直接运行。
解压缩:
tar xzvf openswan-2.6.27.tar.gz
小提示,在 Linux 中,由于目录是区分大小写的,所以系统支持 Tab 键自动补全。比如您输入上面的命令时,输入完“tar xzvf o”以后,若当前目录下没有其他“o”开头的文件,按一下键盘的 Tab 键,“penswan-2.6.27.tar.gz”就会自动出现。
cd 进入 openswan-2.6.27/ 目录:
cd openswan-2.6.27/
编译:
make programs
这将花费一段时间。
安装:
make install
若您没有看到错误信息,那么编译大功告成!请进入下一步,
3. 编辑 IPSec 配置文件
请使用您喜欢的编辑器打开 /etc/ipsec.conf 文件。若没有或从未做过,请运行 aptitude install vim 来安装 Vi IMproved。
vi /etc/ipsec.conf
找到 protostack 一行,(按 Insert 键,移动光标到相应位置)将其值改为 netkey。应该是这个样子的:
protostack=netkey
好的,现在请将光标移动到文件末尾(末尾应该是一些注释说明,在它的下面),复制如下一段内容,
(下面的配置文件已于 2010 年 6 月 28 日中午更新:刚刚 KhaosT 同学指导,使用原配置,未经 NAT 设备的设备是无法连接的。他提出如下更正,经多次、多环境测试无误,请使用下面的配置。本次主要影响到中国电信 EV-DO 用户、小部分 ADSL 用户)
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
这时您应该在 insert 模式,按 Esc 以退出,然后输入 :wq 以保存。
嗯,IPSec 部分就快完成了。下面我们来设置 PSK 预共享密钥,用编辑器打开(没有就创建) /etc/ipsec.secrets 文件。
vi /etc/ipsec.secrets
按 Insert,输入下面一行内容
您服务器的公网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 之前的行,按 Insert,再使用终端的复制功能(右键 > 粘贴)。再按 Esc 退出 insert 模式,输入 :wq 保存。
接下来,我们来重启一次 IPSec 服务,
service ipsec restart
然后尝试使用 L2TP/IPSec 客户端连接一次,请输入正确的 PSK(也有可能叫做“secret”或“预共享密钥”)。这次连接肯定不成功,如果成功,您可以去买彩票了,因为我们还没有做 L2TP 部分呢。这次连接的目的只是测试我们的 IPSec 部分配置是否成功。请运行
cat /var/log/auth.log | grep pluto
以查看最后一行是否包含类似
IPsec SA established transport mode
的行。若有,则说明一切无误,请继续。(否则请运行 ipsec verify 查看发生了何种问题)
三、L2TP 部分
其实搭建也不是那么复杂,对吧。我们先来进行 L2TP 部分的配置,在这里,我们使用 xl2tpd 来实现。
1. 从源安装 xl2tpd
运行:
aptitude install xl2tpd
2. 编辑 L2TP 配置文件
请打开 /etc/xl2tpd/xl2tpd.conf 文件,编辑方法您应该在上面已经学习过了,这里不再赘述。
vi /etc/xl2tpd/xl2tpd.conf
先别动光标,按 dG(D + Shift + G)删除文件所有内容,替换成:
[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 包:
aptitude install ppp
从 xl2tpd 文档中复制一个配置文件样例到我们的配置文件目录:
cp /usr/share/doc/xl2tpd/examples/ppp-options.xl2tpd \ /etc/ppp/options.xl2tpd
出于网页宽度的限制,这是个多行命令,您可一次复制进终端,或是选择逐行输入。
下面打开编辑这个 /etc/ppp/options.xl2tpd,
vi /etc/ppp/options.xl2tpd
先不要按 Insert,将光标移动到第一个 ms-wins 的所在行,按 dd(D + D),再按 dd,删除它们。这时再按 Insert,将 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" *
建议使用 Tab 进行定位,以保持数据的整齐,抱歉,我在网页中不易实现。
重启一下 xl2tpd 吧:
service xl2tpd restart
至此,IPSec、L2TP、PPP 应该都配置完毕了。您可以测试连接,xl2tpd 的日志文件应该包含在 /var/log/daemon.log 中。
这时虽然可以连接上 VPN,但是只能访问内网。需要说明的是,VPN 的功能就是这些。至于我们所说的“上网”,那就是下面数据转发的事情了,和 VPN 已经无关了。
五、转发设置
首先在系统的 /etc/sysctl.conf 将 net.ipv4.ip_forward 启用,具体方法是:
vi /etc/sysctl.conf
然后不要按 Insert,用键盘上下键滚动,找到 net.ipv4.ip_forward 一行,将光标移动至其前面的 # 号上,按键盘的 X 键,此时 # 号消失(此行被 uncomment),应该看起来是这样的:
# Uncomment the next line to enable packet forwarding for IPv4 net.ipv4.ip_forward=1
请保存。再运行
sysctl -p
以直接令其生效。
我们使用发行版中通常包含了的 iptables 来配置更具体的转发。为避免繁琐的 iptables “永久”规则设定,我们让服务器每次启动时都设置一次,还需要用到 /etc/rc.local,请运行:
vi /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 命令,即可令转发立即生效。
六、清理工作
我们之前使用 wget 下载,使用 tar 解压缩出来的东西依然在 ~/,但它们已经没有用了,我们可以将它删除:
rm -fIrv ~/openswan*
七、看起来无关紧要但很重要的两句话
- 恭喜您成功配置 L2TP/IPSec VPN。
- 请尽量多建立些帐号分享给您的朋友。