Linux 上的 VPN 服务器
Posted on 04月 26th, 2008 由 admin
公司最近希望为不在主厂区的子公司提供 VPN 服务。在 Linux 上,可选的 VPN 服务器软件大概有这么几种:
其中 PPTPD 最简单常用,网上资料也最多。它是“点对点隧道协议”的一种实现,主要基于 GRE 通过隧道来传送一个 PPP 连接。
而 OpenVPN 是一种基于 SSL 的 VPN。它最大好处在于,你仅仅需要一个单独的TCP或者UDP端口便可以轻易的穿越大多数的防火墙进行数据传送。我最终选择使用了它,也是由于这个原因。但它也有一个令一般用户觉得不够亲近的地方,它需要额外安装客户端软件,而且安装配置都不够傻瓜化。
L2TP 则是一种国际标准隧道协议,它结合了 PPTP 以及第二层转发协议的优点,但它本身没有任何加密措施,更多的是各 IPSec 协议结合使用,比如与 openswan 一起使用。
Openswan 是 Linux 下 IPSec 的最佳实现了,功能很强大、配置也非常灵活,因此成功配置运行也相当有难度。此外,尽管已经其在对NAT-Travel的支持方面做了不少改进,但还是不能较好的工作于一些NAT网关之后。(我自己并没有测试运行 openswan,所以这些我也只是道听途说。)
下面说我实际的配置过程。我首先试用了 PPTPD。在 Ubuntu 中,安装和配置它相当简单,我只简单的修改了几个地方:
/etc/pptpd.conf最后加上:
localip x.x.x.x #vpn 服务器地址remoteip x.x.x.x-x #为客户端分配的 IP 地址范围
然后 /etc/ppp/pptpd-options 中:
ms-dns x.x.x.x. #客户端连接后使用的 DNS 服务器地址
最后 /etc/ppp/chap-secrets中添加用户名密码:
"user" pptpd "passwd" *
除此之外,配置防火墙允许 1723 端口和 GRE 协议
iptables -A INPUT -i eth0 -p tcp --dport 1723 -j ACCEPT iptables -A INPUT -i eth0 -p gre -j ACCEPT
第二条也可以写作:
iptables -A INPUT -i eth0 -p 47 -j ACCEPT
47 是 GRE 的协议号,网上还有很多人这样写:
iptables -A INPUT -i eth0 -p tcp --dport 47 -j ACCEPT
应该是错误的。
至此,重启 pptpd 服务就行了。但是实际使用中发现问题多多:
其一,DNS 无法解析。即使如前所述设置了客户端连接后使用的 DNS 服务器,仍旧无法解析私有域名,但直接用 IP 地址访问却是通的。
其二,连接不稳定。有的用户能拨上,有的用户拨不上,提示 619 错误。Google 多天,发现该问题很普遍,但没有人提供好的解决办法。大致是说 NAT 穿越问题,也就是客户端到服务器端的连接中间如果有 NAT 设备的话,需要在其上开通 nat-t。这样一来就麻烦了,这中间的设备是电信公司的,我们怎么管得了,如何开通呢?
于是,我改用 OpenVPN。配置有篇文章讲的很详细,基本照做就成,链接是:http://forum.ubuntu.org.cn/viewtopic.php?p=532825。
需要说明的是 windows 客户端的安装。如果你使用的是 windows 2003,可能会遇到不能安装的问题,表现为装到一半时,安装程序进行不下去,其实安装程序并没有死,耐心等待半个小时以上(呵呵),大概就行了。如果还不行,可以试试检查你的本地安全策略,其中有一项“未签名驱动程序的安装操作”,把它改为“默认继续”,应该就行了。这个问题在非服务器版本的 windows 上似乎不存在。
这样 VPN 服务器就配好了,而且没有了前面使用 PPTPD 时那些烦恼。唯一不爽的地方如前所述,openvpn 的客户端对一般用户不够傻瓜化并且还是英文的,可能会让某些用户“不满”。