使用openswan和xl2tpd搭建V*N

jopen 10年前

使用openswan和xl2tpd在VPS上搭建V*N,至此你可以从 Mac、iPhone、iPad、Android 的 V*N 处连接这台 V*N 服务器,正常访问所有合法网站

      在现在的网络环境下每个人都需要一个 V*N。一方面可以保证你在公共网络环境下安全使用网络,比如在咖啡厅、机场等提供免费 WIFI 的地方;另一方面众所周知的原因,我们尤其是互联网行业的技术人员需要 V*N 或者加密网络链路才能够正常使用某些国外合法服务。

      另外对于公共场所的wifi,实际上是有些不安全的,那么此时在连接wifi后使用V*N上网,由于数据进行了加密,所以会比较安全。

通常情况下加密链路有 2 种方式:

0. GoAgengX

1. SSH 隧道

2. VPS 上安装 V*N

这篇文章主要说明 V*N 的方式,因为这种方式几乎是一劳永逸的方式,后期成本很低。

GoAgengX 的方式:

这在 Mac 下使用非常方便,缺点和 SSH 隧道方式类似,手机和 iPad 不方便,并且有流量限制。而且这种方式经常或失效。

SSH 隧道的方式:

我之前几年都使用的是加密隧道的方式,比如在 Mac 或者 Linux 平台上,可以执行 ssh -D 1234 username@domain.name 登陆后就会在本地打通一个端口,将需要加密的流量导入本地这个端口即可。
然后可以设置应用的 proxy 为 本地 IP 和 1234 端口即可。这种方式的好处是非常稳定,缺点是每次输入命令操作复杂,并且手机和 iPad 很难用这种方式访问国外合法网站。

V*N 的方式:

V*N 的方式可以方便的使用 V*N 客户端来完成整个过程。 V*N 的安装还是相对复杂的,网上能找到的 V*N 安装教程非常多,但是能够实现完整
安装,然后电脑、笔记本、手机、iPad 正常使用的教程几乎找不到。所以我把自己安装 V*N 的过程记录下来。本文介绍使用openswan和xl2tpd搭建V*N,原因是由于PPP搭建V*N不够安全,容易被封。

下面具体介绍安装方法,以ubuntu 12.04为例进行安装,centos系统参考这篇文章(http://ippotsuko.com/blog/centos-setup-l2tp-ipsec-psk-V*N/):

此次安装是在DigitalOcean上的ubuntu系统上安装的,环境参数说明:

auto eth0  iface eth0 inet static  address 107.170.193.20 ##本机外网IP  netmask 255.255.240.0  gateway 107.170.192.1 ##本机网关IP  dns-nameservers 8.8.4.4 8.8.8.8 209.244.0.3

具体ip配置请以自己主机上的ip为准,这里仅做示范用。

安装过程

安装必备的软件包:

sudo apt-get install openswan ppp xl2tpd

编辑并检查 /etc/ipsec.conf 的以下几行,大部分情况下整个文件不需要修改:

config setup    dumpdir=/var/run/pluto/    nat_traversal=yes    virtual_private=%v4:10.0.0.0/8,%v4:192.168.140.0/16,%v4:172.16.0.0/12,%v4:25.0.0.0/8,%v6:fd00::/8,%v6:fe80::/10    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=5   rekey=no   ikelifetime=8h   keylife=1h   type=transport   left=107.170.193.20   leftprotoport=17/1701   right=%any   rightprotoport=17/%any   dpddelay=15   dpdtimeout=30   dpdaction=clear

left为本机IP地址。

编辑和检查 /etc/xl2tpd/xl2tpd.conf 修改 IP 范围和本地 IP 地址,注意这些地址和你的内网 IP 地址不能冲突或者重复:

[global]  ipsec saref = yes    [lns default]  ip range = 192.168.140.200-192.168.140.240  local ip = 192.168.140.230  refuse chap = yes  refuse pap = yes  require authentication = yes  name = OpenswanV*N  ppp debug = yes  pppoptfile = /etc/ppp/options.xl2tpd  length bit = yes

编辑和检查 /etc/ppp/options.xl2tpd修改 ms-dns 的值,这里使用 Google 的 DNS 服务器 8.8.8.8:

require-mschap-v2  ms-dns 8.8.8.8  ms-dns 8.8.4.4  auth  mtu 1200  mru 1000  crtscts  hide-password  modem  name l2tpd  proxyarp  lcp-echo-interval 30  lcp-echo-failure 4

编辑和检查 /etc/ppp/chap-secrets 这个文件保存的 V*N 的连接账号信息,以下只开通一个账号,并且指定这个账号的 IP 地址:

# Secrets for authentication using CHAP  # client server secret   IP addresses  fantasy         l2tpd fantasy856575     *  wang123  l2tpd   wj1989   *

这里配置的是V*N的帐号,但在L2TP连接时,还有共享密码需要配置。编辑和检查 /etc/ipsec.secrets 注意 digitalocean 这个值是机器鉴定的共享秘钥的值,可以修改成其他值:

# this file is managed with debconf and will contain the automatically created RSA keys  #include /var/lib/openswan/ipsec.secrets.inc  #注意这一行要注释掉  107.170.193.20  %any:  PSK "digitalocean"

修改/etc/sysctl.conf,尾部加入一些参数:

# /etc/sysct.conf  # only values specific for ipsec/l2tp functioning are shown here. merge with existing file  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.icmp_ignore_bogus_error_responses = 1

执行脚本:

for V*N in /proc/sys/net/ipv4/conf/*; do echo 0 > $V*N/accept_redirects; echo 0 > $V*N/send_redirects; done    sysctl -p #使修改生效

最后配置防火墙:

iptables --table nat --append POSTROUTING --jump MASQUERADE  iptables -t nat -A POSTROUTING -s 192.168.140.0/24 -o eth0 -j MASQUERADE  iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT  iptables -I FORWARD -s 192.168.140.0/24 -j ACCEPT  iptables -I FORWARD -d 192.168.140.0/24 -j ACCEPT  iptables -A FORWARD -j REJECT  iptables -A INPUT -p udp -m state --state NEW -m udp --dport 1701 -j ACCEPT  iptables -A INPUT -p udp -m state --state NEW -m udp --dport 500 -j ACCEPT  iptables -A INPUT -p udp -m state --state NEW -m udp --dport 4500 -j ACCEPT    /etc/rc.d/init.d/iptables save  /etc/rc.d/init.d/iptables restart

其中这两句写入/etc/rc.local:

for V*N in /proc/sys/net/ipv4/conf/*; do echo 0 > $V*N/accept_redirects; echo 0 > $V*N/send_redirects; done  iptables --table nat --append POSTROUTING --jump MASQUERADE

重启相关服务:

/etc/init.d/pppd-dns restart  /etc/init.d/xl2tpd restart  /etc/init.d/ipsec restart

注:由于digitalocean默认是root用户,因此上述命令没有sudo,对于一般用户,建议使用sudo账户。

我本地使用mac自带的V*N客户端是可以连接到V*N服务器上的,连接时会有日志输出(/var/log/syslog

最终查看连接或者调试错误时查看日志  /var/log/syslog  :

tail -f  /var/log/syslog

验证配置是否成功:

ipsec verify

输出:

Checking your system to see if IPsec got installed and started correctly:  Version check and ipsec on-path                              [OK]  Linux Openswan U2.6.37/K3.8.0-29-generic (netkey)  Checking for IPsec support in kernel                         [OK]   SAref kernel support                                        [N/A]   NETKEY:  Testing XFRM related proc values                   [OK]   [OK]   [OK]  Checking that pluto is running                               [OK]   Pluto listening for IKE on udp 500                          [OK]   Pluto listening for NAT-T on udp 4500                       [OK]  Checking for 'ip' command                                    [OK]  Checking /bin/sh is not /bin/dash                            [WARNING]  Checking for 'iptables' command                              [OK]  Opportunistic Encryption Support                             [DISABLED]

如果都显示 OK 则成功了,否则需要检查哪里有问题。

使用 帐号(fantasy)和密码(fantasy856575)以及ipsec共享密码(digitalocean)就可以访问自己搭建的V*N了。

至此你可以从 Mac、iPhone、iPad、Android 的 V*N 处连接这台 V*N 服务器,正常访问所有合法网站了,注意选择的V*N类型为  L2TP/IPSec或L2TP。

android手机设置V*N访问:http://www.krit.cn/android.html

ios设备设置V*N访问:http://www.appifan.com/jc/201301/39474.html

mac电脑社hiV*N访问:http://www.krit.cn/mac.html 

来自:http://my.oschina.net/u/128568/blog/286002