Linux · 2010-05-21

单网卡 Ubuntu 服务器打造 PPTP/L2TP VPN Server

自从实验室放了台 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 并设置后,客户端还是无法建立到服务器的连接。造成的原因可能有以下几种:

  1. 服务器端的防火墙设置:PPTP 服务需要使用 1723(tcp) 端口和 gre 协议,因此请确保您的防火墙设置允许这两者通行。
  2. 如果服务器在路由器后面,请确保路由器上做好相应的设置和端口转发。
  3. 如果服务器在路由器后面,那么请确保你的服务器支持 VPN Passthrough。
  4. 如果客户端在路由器后面,那么客户端所使用的路由器也必须支持 VPN Passthrough。其实市面上稍微好点的路由器都是支持 VPN Passthrough 的,当然也不排除那些最最最便宜的便宜货确实不支持。当然,如果你的路由器可以刷 DD-Wrt 的话就刷上吧,DD-Wrt 是支持的。

能建立链接,但“几乎”无法访问互联网

这里我使用“几乎”这个词,是因为并不是完全不能访问互联网。 症状为,打开 Google 搜索没问题,但其它网站均无法打开;SSH 可用,但 scp 不行;ftp 能握手,但传不了文件。我就遇到了这种情况,仔细 Google 后发现原来是 MTU 的问题,用 ping 探测了一下果然是包过大了。知道问题就好办了,我们可以通过 iptables 来修正这一问题。具体原理就不讲了,需要的自己 Google。这里只说解决方案,在 filter 表中添加下面的规则:

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上网解决方法

代理服务器更换centos6半月有余,更换后发现wint系统拨号后访问 sina.com.cn / iciba.com / 360.com / abot.cn 等部分网站时页面打不开,而在服务器上或和机房内直接用通过服务器做网关的其它机器都能正常访问,一直不到其解。
今晚搜索了一下,找到些资料,发现是PPTPD默认的MTU太大,导致链路上有些设备堵塞。
解决思路就是把MTU改小些,方法大概有三种:
一、如果开启了iptables的(验证过可行)
iptables -A FORWARD -p tcp –syn -s 10.0.0.0/24 -j TCPMSS –set-mss 1356
其中粗体部分换上你的pptp client的IP段
二 、在 /etc/ppp/ip-up 中,exit 0行前添加 (验证过可行)
ifconfig $1 mtu 1356
看到ip-up中有一行:
[ -x /etc/ppp/ip-up.local ] && /etc/ppp/ip-up.local “$@”
所以也在 ip-up.local文件中添加ifconfig $1 mtu 1356也同效。
三、在PPTPD配置文件中设置:
打开/etc/ppp/options.pptpd
在文件最后添加 mtu1356
 继续前篇博文的内容继续谈谈mtu导致访问非常慢的问题或者直接访问不了。我们的服务器是aliyun的新加坡服务器,pptp连接成功后,访问墙外的大多数网站基本毫无压力,但是放不了百度,好奇怪,都能访问到被墙的谷歌了,百度难道也被新加坡的墙档上了吗?
    经过一番百度+谷歌后,发现果真有很多人有这样的情况。在linux系统下面的ppp0的网卡接口的mtu是1396,而我们windows 客户端的默认mtu是1496。本来在mtu在路由通信的时候会自协商,可是有些运营商或者主机管理着为了防止DDOS,禁用了ping的功能(不知道能起到防ddos的作用),mtu自协商正好利用ICMP协议来通信的,导致不能协商mtu,发送到pptp服务器的数据包,就会有问题,自然有些网站就访问不了,有些网站超时的情况。
    下面来看看解决ppp0接口mtu的几种方式。
  1. 在PPTP的服务端/etc/ppp/options.pptpd 中配置上mtu 1496.
  2. 给ppp0的接口直接修改mtu值,然后重启pptp服务即可生效。
ifconfig ppp0 mtu 1496 /etc/init.d/pptpd restart
修改iptables实现
iptables -A FORWARD -p tcp -syn -s 192.168.100.0/24 -j TCPMSS -set-mss 1496
最后重新连接,就能访问一些因为mtu不统一的问题,访问不了的网站了。

 

Ubuntu server 12 上搭建 L2TP/IPSec VPN

一、简单的原理介绍

通过上次和 Paveo 大叔聊天,还有平时一些肤浅的了解,我们知道,所谓 L2TP/IPSec 就是 L2TP over IPSec。也就是说,这种 VPN 方式分两个部分,IPSec 和 L2TP。我们要先做好 IPSec 的部分。

在这个应用场景下,我的理解,IPSec 使用预共享密钥(PSK)进行加密和验证,L2TP 负责封包,PPP 负责具体的用户验证。

二、IPSEC 部分

在这里,我们使用 Openswan 来实现 IPSec。

sudo aptget 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 aptget install xl2tpd

2. 编辑 L2TP 配置文件

请打开 /etc/xl2tpd/xl2tpd.conf 文件,编辑方法您应该在上面已经学习过了,这里不再赘述。

sudo nano /etc/xl2tpd/xl2tpd.conf

删除文件所有内容,替换成:

[global] ; listenaddr = 192.168.1.98 [lns default] ip range = 10.1.1.210.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 aptget instal ppp

从 xl2tpd 文档中复制一个配置文件样例到我们的配置文件目录:

cp /usr/share/doc/xl2tpd/examples/pppoptions.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