创建博客 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

shiqiang_hx的个人主页

 
 
 

日志

 
 
关于我
文章分类
LOFTER精选

使用Linux L2TP/IPsec VPN 服务器  

2007-03-19 10:39:14|  分类: 默认分类 |  标签: |举报 |字号 订阅

使用Linux L2TP/IPsec VPN 服务器

(屈世强 2006年2月26日)

原文:http://www.jacco2.dds.nl/networking/freeswan-l2tp.html

1 绪论

这篇文章包含了如何使用微软、苹果或其它第三方厂商的L2TP/IPsec客户端来设置让Road Warrior连接到一个基于FreeS/WAN或后续软件的Linux服务器。Frees/WAN是一个为Linux 2.x内核设计的IPSec执行者,基于GUN Public Licence发布。Frees/WAN的后续者为Openswan和StrongSwan。这样做的优势是,如果你使用包含在诸如Windows 和Mac OS X等操作系统中的免费客户端时,不用再把钱花在第三方VPN客户端和服务器上,显然,如果你想合法,你仍需要取得操作系统的授权。

IPsec是一个安全通信的网络协议。它是一个正式的互联网标准。不同厂家生产的客户端和设备应该能够协同工作(从理论上说),只要他们支持IPsec标准。

Windows 2000/XP,Pocket PC 2003和Mac OS X v10.3+内建有L2TP/IPsec客户端,专门为Windows 95/98/ME/NT4设计的“Microosft L2TP/IPSec VPN Client”可以免费从微软网站上下载。Windows下的SSH Sentinel、Forticlient和SafeNet SoftRemote等第三方客户端同时支持IPsec和L2TP。

Linux下常见的IPsec执行者有:

·FreeS/WAN,Linux下的第一个IPsec执行者,不过,FreeS/WAN不再开发了,它交叉进了Openswan和StrongSwan。

·Openswan是由FreeS/WAN团队成员开发,它由Novell/SuSE和Astaro发起。

·strongSwan也是FreeS/WAN的延续。StrongSwan的主要作者是Andreas Steffen——为FreeS/WAN开发X509补丁的人。没有令人惊讶的,它主要的焦点是良好的证书和智能卡支持。

·2.6以上内核自带了一个本地IPsec执行者,称为“NETKEY”、“26sec”或“PF_KEY”。这意味着最新的发行版将从内部提供对IPsec的支持。

·ipsec-tools基于KAME,许多发行版默认使用它,它的IKE守护进程称为racoon。

·isakmpd一个移植到Linux中的OpenBSD的ISAKMPD守护进程。

一个典型的IPsec执行者通常包含内核部分和相应的用户态工具。FreeS/WAN、Openswan、StrongSwan的内核部分叫“KLIPS”,用户态IKE守护进程称为“pluto”。普通的内核(2.4或更老的)通常不包含KLIPS,需要使用KLIPS内核补丁或安装KLIPS的可加载内核模块。上面说过,2.6以上内核自带一个本地IPsec执行者称为“NETKEY”,最新的FreeS/WAN同时支持KLIPS和NETKEY。使事情更为复杂的是,NETKEY又移植到2.4内核,同时KLIPS也正在向2.6内核移植,这意味着在Linux下有以下几种用户态工具和内核对应的选项。

  Kernel 2.0 KLIPS Kernel 2.2 KLIPS Kernel 2.4 KLIPS Kernel 2.4 NETKEY backport 1) 2) Kernel 2.6 KLIPS  Kernel 2.6 NETKEY 1)
FreeS/WAN 1.x X X X      
FreeS/WAN 2.x     X X X X
Openswan 1.x X X X      
Openswan 2.x     X X X4) X
strongSwan 2.x     X     X
ipsec-toolsutilities3)       X   X
isakmpd Linux port       X?   X?

1)Linux 2.6自带一个本地的IPsec执行者,称为NETKEY。

2)NETKEY反向移植到2.4内核。这种移植不包含在普通的2.4内核,但一些发行版(特殊的Debian)在它的内核提供这种反向移植。

3)ipsec-tools组件(包含在IKE的守护进程“racoon”中)是一个KAME的Linux移植。许多发行版包含ipsec-tools,不用担心,通常软件包都命名为“ipsec-tools”。

4)运行在从kernel.org上获取的普通2.6内核,对于一些对内核修改很严重的发行版(如Fedora,RHEL等)可能会有问题。

 

3 背景

微软在Windows 2000 Professional/Server、Windows XP Home/Professional和Pocket PC 2003中包含了一个IPsec客户端。因为客户端支持是基于操作系统的,所以不用再下载。

可以免费从微软网站上下载另一个不同的IPsec客户端,“MSL2TP client”,它可以安装在Windows 95/98/Me/NT4上。尽管与Windows 2000/XP自带的不同,但在功能上与它十分相似。

到目前为止,微软好象还没有Windows 3.X、Windows NT 4.0 Server和Pocket PC 2002及以前版本的客户端。对于这些不常见的用户,你可以下载免费的PGPNET,不过它只能用于主机到主机的连接。

可是微软免费的IPsec客户端有一个障碍,它只能与另一个协议L2TP结合使用,不与L2TP结合使用可能非常困难(Widnows 2000/XP)或许根本不可能(MSL2TP,Pocket PC)。有的说微软按照真正的微软风格采用并增强了IPsec标准。虽然是合理的,但L2TP目前是一个被提议的互联网标准(RFC 2661)并且是L2TP over IPsec(RFC3193)。另外,PPTP是另一个广泛被用于VPN的协议,但它不是一个正式的标准。

使用L2TP协议意味着你将使用一个L2TP守护进程。有许多可以使用的L2TP守护进程。当Windows L2TP/IPsec客户端连接到你的Linux服务器时,首先打开一个到Openswan的IPsec隧道,然后使用这个隧道连接到 Linux服务器上的L2TP守护进程,最后客户端就可以访问内网的计算机。

一种办法是,如果你有一台Windows 200X服务器,用L2TP/IPsec客户端连接到Linux IPsec服务器,然后使用IPsec隧道连接到Windows 200X的L2TP服务来代替Linux。这样的优势是Windows的L2TP服务对Windows客户端的兼容性大概比开源的L2TP守护进程要好。注:这样的安装,Windows 200X服务器不是直接连接到Internet,Linux服务器是。有人可能关心这个安全优势。如果依靠Windows 200X代替Linux通过 PPP对用户进行认证,因而你需要客户访问许可。

微软显然不认为IPsec是为远程工作者(Road Warriors)提供认证的一个好协议。说点多余的,因为第三方客户(PGPNet,SoftRemote等)在这方面完全没有任何问题。微软的解释陈述在它们网页中的VPN FAQ中。基本上他们主张口令比证书容易使用。但我认为在这后面大概有另外的战略决定,显然L2TP协议提供了更加适合微软的额外认证机制(比如,通过Windows登录证书认证意味着销售出更多的NT/200X客户许可)。

4 过程概况

· 下载Openswan、L2TP 服务、PPP 服务和示范脚本/配置文件。

· 阅读文档(包括本文, Openswan文档, 微软文档)。

· 使用你的Linux发行版提供的支持IPsec的内核,如果不支持则要为你的发行版下载支持IPsec的内核。如果没有,要自己编译并安装一个新的支持IPsec的内核。

· 为你的Linux发行版安装Openswan用户态工具,如果没有,你需要自己编译并安装它们。

· 修改Openswan配置文件。

· 如果你的Windows或Macintosh没有内建L2TP/IPsec客户端,就安装它。

· 配置客户端,使用“预共享密钥”(“口令”)。

· 在客户端开始(或称“拨号”) L2TP/IPsec连接。

· 验证Linux VPN服务器的IPsec部分成功连接。

· 在Linux上下载、安装并配置L2TP和PPP服务。

· 调整防火墙,阻止通过外部接口UDP 1701端口进来的数据(非常重要)。

· 在客户端再次开始L2TP/IPsec连接。

· 验证Linux VPN服务器IPsec和L2TP都能工作。

· (可选的)用X.509证书代替“预共享密钥”。

下面是安装示意图。

 

 

 

或许看起来有些困难,不过如果你已经有一个正常工作的Openswan系统,那么只不过再安装一个额外的L2TP守护进程软件包而已。或许你还需要修改一下配置文件。有点复杂的事情是支持NAT-Traversal。我们假设一开始你不需要NAT。

5 安全考虑

认真地看这一部分,如果刚开始看,不要立即采取行动。等你理解并记住后再回过来,这时你已经知道了全部的工作并且你也知道如何避开如Internet这样的不安全网络。

5.1.1 外部接口(ipsec0)需要开的接口

也许你可以在你的VPN服务器或在它前边使用防火墙,如果这样你需要调整你的防火墙,允许L2TP/IPsec协议进入。

Linux下有许多不同种类的防火墙,甚至相同发行版的不同版本也不同。许多人喜欢自己调整防火墙规则来代替发行商提供的规则。

使用L2TP/IPsec像简单的IPsec协议那样需要打开相同的协议和端口。

UDP 端口 500 (IKE)

IP 协议 50 (ESP)

UDP 端口 4500 (NAT-T)如果有一些客户端位于NAT路由后边就需要使用。

注意,IP 协议50是协议,不是端口。IP有许多协议,像ESP、UPD、TCP等,TCP协议、UDP协议开有许多端口,比如TCP 80端口(HTTP),UDP 500端口(IKE)等。IP协议50的名称为:IPv6-Crypt。

5.1.2 阻止外部访问L2TP守护进程。

应该对L2TP守护进程建立防火墙,使外部接口不能访问。也可以说:必须为L2TP守护进程建立防火墙,否则你将冒巨大的风险。

对于L2TP/IPsec协议,需要建建立防火墙,来阻断除ipsec0接口(如果使用NETKEY来代替KLIPS的话是外网接口)外所有外部接口的的L2TP连接(UDP 端口1701)。

5.2.1 监听地址参数(仅KLIPS有效)

除对L2TP守护进程建立防火墙外,还有一种更加安全的设置方法。默认情况下,L2TP守护进程监听UDP 1701端口,假如防火墙关闭,L2TP守护进程将暴露在外部接口。因此,不需要任何人通过Linux VPN服务器外部接口访问L2TP守护进程,你需要的是只有经过IPsec认证的客户可以访问L2TP守护进程,也就是说L2TP数据包应该通过IPsec隧道,并且服务器与客户机之间不是没有加密的直接相连。可是,默认情况下L2TP守护进程监听所有接口,包括外部接口(不友好的),它绑定到INADDR_ANY(它能够识别的那些)。你更愿意L2TP仅绑定到ipsec0接口,不过,这是不可能的。不像低层网络应用程序(tcpdump和Ethereal)那样,你不能将L2TP绑定到某个特定的接口。

幸运的是,L2TP可以绑定到某个特定的IP地址。两个主流的开源L2TP守护进程(l2tpd和rp-l2tp)提供了补丁,使之可以绑定(监听)某个特定的IP地址。这个补丁称为:listen-addr patch。打了该补丁后你只要在L2TP守护进程的配置文件(l2tpd.conf)中增加一行“listen-addr 192.168.1.98”,L2TP守护进程就会绑定(监听)这个IP地址(一般情况下是内网IP地址)。

因为L2TP守护进程在内部接口上监听,所以外部接口不能直接访问守护进程,这很好,可是L2TP守护进程必须通过ipsec0接口才能访问,所以要配置一下防火墙,让ipsec0的数据包能够到达内网。

iptables -t nat --append PREROUTING -i ipsec0 -p udp --sport 1701 --dport 1701 -j DNAT --to-destination 192.168.1.98

这里的192.168.1.98也是内网接口的IP地址。删除规则的方法是:

iptables -t nat --delete PREROUTING -i ipsec0 -p udp --sport 1701 --dport 1701 -j DNAT --to-destination 192.168.1.98

在执行这一行时Openswan必须运行,也就是说ipsec0必须存在。作为选择,你可以增加额外的防火墙脚本供Openswan调用,也就是指定“leftfirewall=参数”。参考这方面的FreeS/WAN文档(http://www.freeswan.org/freeswan_snaps/CURRENT-SNAP/doc/firewall.html#up_down)。

当正确地使用了listen-addr参数后,L2TP守护进程将不再监听外部接口,因此就算防火墙停止,L2TP守护进程也不会暴露在外部接口上。可是仍需要对除ipsec0以外的所有接口进来的L2TP连接谨慎地设置防火墙。同时使用防火墙保护和“listen-addr”参数(就像腰带与吊带一样)。

5.2.2 监听地址参数(对于NETKEY)

不幸的是,上面提到的“listen-addr”不能用在2.6内核的本地IPsec执行者(26sec也称NETKEY)上,因为NETKEY没有ipsec0这样的接口,而且在普通的2.6内核上IPsec后面进行网络地址转换(NAT-after-IPsec)会普遍被破坏。在2.6内核上的这些问题有5种解决方法。第一,在2.6内核中使用KLIPS,这样你就有了ipsec0这样的接口,FreeS/WAN 2.05支持这样,Openswan 2.3支持在2.6内核中使用KLIPS,但它仍在开发中。第二,等出现新的IPsec后面进行网络地址转换(NAT-after-IPsec)不再被破坏的2.6.x内核。第三,用非正式开发的Netfilter补丁来编译你自己的内核。第四,也是最不理想的,在IPsec服务器上使用防火墙,也就是让L2TP守护进程监听所有接口,防范从外部接口进来的所有L2TP连接。第五,在VPN服务器前边放一个有防火墙(也可能是NAT)的路由器,并且允许L2TP监听所有接口。后边两种方法依赖于防火墙,是一种折衷的办法,万一禁用或者发生其它原因,L2TP就暴露了。

5.3 ip_forward(IP传递)

另一个值得注意的安全点是,人们通常将/proc/sys/net/ipv4/ip_forward设置为1来启用路由(VPN已经启用),这样从IPsec隧道来的数据包将被转发到内网。可是有一些安全含意,当对某个接口做了限制后,也许一个或多个iptables forward规则同样可能被欺骗。否则你可以使用iproute2(高级路由)。这有点超出本文的范围。

5.4 chroot、UML、XEN或SELinux

Openswan和l2tpd都以root身份运行,为了更加安全,可以尝试把它们都强制硬塞进chroot jail或SELinux policy,或者甚至可以在服务器上使用Usermode Linux、Xen等。很显然在http://www.astaro.org/有人尝试这样做,你可以下载一个评估版,并了解它是如何做的。

6 VPN的选择

在发掘安装Openswan和L2TP的技术细节前,先停一下。假设你有兴趣让你的用户通过Internet远程访问,主要原因是:价格、安全、友善的用户界面,有以下几种方案供选择:

1、客户端用硬件设施。

2、PPTP,例如Windows包含客户端的。

3、像Citrix、Windows终端服务器、pcAnywhere或VNC等远程桌面解决方案。

4、基于SSL的VPN,例如HOB或者Citrix Secure Gateway。

5、非标准的,基于开源的解决方案,如CIPE、vtun、tinc和OpenVPN。

6、第三方IPsec解决方案,如PGP、SafeNet SoftRemote、SSH Sentinel或TheGreenBow VPN客户端。

7、Windows 2000/XP自带的IPsec客户端,手工配置去除掉L2TP。

8、Windows 2000/XP自带的IPsec客户端,用免费工具软件配置去除掉L2TP。

9、像Windows 2000/XP、Pocket PC 2003、Mac OS X v10.3+ 自带的IPsec/L2TP客户端,为Windows 95/ME/NT4设计的MSL2TP客户端。

7 带L2TP的IPsec的优势和劣势

下面是用Windows和Mac Panther自带的带L2TP的IPsec客户端连接到Linux服务器的优势和劣势。

优势:

1、“免费”。Windows自带客户端或者可以免费从微软下载。Mac OS X 10.3+也带了一个客户端,当然客户端本身不是真正免费,因为已经从Windows/Mac OS许可中支付了。很明显,它不像免费软件基金会的软件那样真正免费。

2、在客户端上安装还算简单。默认情况下Windows 2000/XP、Pocket PC 2003和Mac OS X 10.3+已经安装了一个客户端。Windows 9x/ME/NT4需要下载一些额外的软件(需要Dial-Up Networking 1.4和IE 5.01以上)。也可以安装第三方客户端。

3、使用还算简单。没有更多的配置,所以更少出错。

4、“本地的”客户端。也就是微软的苹果。

5、安全。一般认为IPsec是一个安全的VPN协议。例如,远远超过PPTP。L2TP没有把握,但无论如何L2TP数据包用IPsec加密了。

6、支持“虚拟IP地址”。这意味着远程客户一旦登录后就可以从内网获得一个IP地址。对其它计算机来说,远程用户就像在内部网络上一样。

7、支持TCP/IP和IPX隧道。使用L2TP,你可以建立一个第二层的隧道,因此从理论上任何三层协议都可以通过隧道。可是多数情况下TCP/IP协议被使用到VPN隧道中,据报道,IPX也能很好地工作。微软客户端支持NetBEUI,但pppd不支持,看来NetBEUI大概不能工作。

8、L2TP over IPsec是IETE的一个正式标准(RFC2661)。这意味着许多厂商支持这个协议,像PPTP、MPPE、PEAP、L2sec和OpenVPN等这些相关的VPN方案仍然不是正式标准。

9、NAT-Travelsal。多数IPsec客户端支持它(但像Windows 2000/XP等只有更新后才支持。

劣势:

1、可能在服务器上比较难安装。L2TP/IPsec或许在客户端比较容易安装,但比较来看,它在服务器上安装要比PPTP和简单的IPsec难。因此,很大程度上取决于你的操作技巧和你选择的Linux发行版。

2、较少的特性。比如一般情况下微软的客户端不支持AES加密,很多商业的客户端和Mac OS X支持AES加密,它要比3DES快得多。

3、支持。在客户端,你可以请求谁来为你提供支持?微软吗?微软转售者吗?Openswan和l2tpd的邮件列表对人们非常有用,但是如果你微软客户端的臭虫,只有微软能修补它。像Astaro和Xelerance这样的公司对它们的VPN产品提供支持。

4、需要一个L2TP服务。Openswan提供了IPsec服务,但你还需要一个L2TP服务。还有许多执行者,但它们在Linux/Unix下不常用。

5、需要证书。除非你的客户端有固定IP地址,否则需要X.509证书。换句话说,你需要一个公钥基础设施(PKI:Public Key Infrastructure),另一方面,PPP仅需要口令。

6、没有更多可用的经验。带L2TP和IPsec的结合使用在Linux上还算比较新。大概很少有人会立即使用这样的配置。

7、不稳定的升级路线。2003年6月微软对它们Windows 2000/XP自带的IPsec客户端进行了升级。MSL2TP基本上是1.0版,尽管它是基于SoftRemote客户端的。或许微软不会再更新了,因为Windows版的客户端已经处于“不支持阶段”了。

8、信息包的顶部装置。通信负载被多次封装(IPsec、L2TP、PPP),这就需要更多的带宽,这就导致了一个MTU大小的问题,如果我没有记错的话,简单的IPsec每个数据包有56个字节的顶部装置,L2TP会在每个数据包上再增加16个字节,如果使用NAT-Traversal(IPsec被封装到UDP里)顶部装置会更大。我无法做更多的性能测试,

9、慢。L2TP和PPP协议需要在Linux服务器上运行额外的守护进程。这些守护进程运行在用户态,这意味着信息包的额外处理和更多的延迟。一般情况情况下,在ADSL线路上,线路速度是瓶颈,不是VPN,但如果VPN运行在LAN上,那么VPN是瓶颈。

10、在非微软的客户端事上比较复杂。L2TP在IPsec顶上对Windows的本地客户端来说设置比较容易,但不是所有的第三方客户端都支持L2TP。比如如果你有Linux用户,让他们运行L2TP客户端有点无聊,也意味着你需要做更多的工作,因为你希望提供的支持不只一个,而是不同的VPN选项,也就是IPsec和L2TP/IPsec。

11、NAT-Travelsal。有L2TP/IPsec的NAT-Traversal在Linux上现在是实验性的。NAT-T由IETE批准,但多数厂商的执行者比草案要早。

12、没有“完美的安全传送”PFS是一个可以被IPsec通信启用的安全特征,但是Windows和Mac的L2TP/IPsec客户端不支持(除非用户手工建立一个IPsec策略,但是那样用户界面又不友好,而且容易出错)。

13、专利问题。Cisco拥有L2F协议的专利,L2TP本质上是由Cisco的L2F协议和微软的PPTP协议组合而成的。Cisco在L2TP协议上同样有专利。人们都知道,不排除Cisco想寻求版税或什么的。同样一些公司拥有NAT-Traversal的专利。这个专利问题也许只对美国、日本等软件专利法非常愚蠢的国家的用户有影响。

就像你看到的,有这么多好的原因使你不使用带L2TP的IPsec,但是,在像IKEv2和DHCP over IPsec这样更好的解决方案更普遍地使用前,它还因为相当安全这一面和价格影响使人有兴趣来考虑它。

8 Road Warrior支持

VPN用户经常使用动态IP:在他们连接的每一次IP地址都可能不同。比如,一个旅行者用它的笔记本电脑从宾馆或会议室发起的连接;一些cable/ADSL提供商使用DHCP来分配有规律地改变的动态IP地址。

使用IPsec有多种方法来支持这种设想:

· 每个用户共享的“预共享密钥”(PSK:PreShared Key)。

· RSA认证。

· 在“好斗模式”(Aggressive Mode)下的“多重预共享密钥”(Multiple PreShared Key)。

· DHCP over IPsec。

· IKEv2

· X.509证书。

“预共享密钥”(PSK:PreShared Key)是一个IPsec隧道两端共享的安全口令。PSK的分发是“脱离网络”(out of band)的,也就是,不通过不友好的网络(Internet),例如,你可以面对面地把写在纸片上的PSK交给用户。PSK使用起来比较简单,但是当用户数量较多并且你想为Road Warrior使用PSK时,就不太好衡量了,所有使用动态IP地址的用户使用相同的PSK(“group secret”),当然这是重大的安全风险,假如一个用户离开了公司或丢失了他的手提电脑,其他所有的用户必须更换新的PSK。另一种方法是给每个用户一个不同的PSK,但在IPsec下要求所有用户都是固定IP地址。因为这些限制,PSK不能用于Road Warrior,除非只有一个用户或每个用户都有固定IP地址。

使用RSA认证。你在Openswan的配置中为用户指定一个处于自然状态的RSA公钥。RSA认证支持静态IP和动态IP地址,RSA认证执行起来也相对光明有份量,并且使用起来几乎同口令一样简单。因为口令不可能被猜出,所以RSA密钥自然更加安全,这是它的优势所在。不像口令那样,用户记不住RSA密钥,需要剪切到配置中。不幸的是,支持RSA认证像支持L2TP/IPSec那样的IPsec客户端,反之亦然。

一些IPsec客户端支持“好斗模式”(Aggressive Mode)。允许动态IP地址使用PSK。尤其是设备只有很小处理能力的客户端(像Pocket PC和Palm)使用“好斗模式”,因为RSA加密要比对称密钥更加慢。FreeS/WAN需要一个补丁才能支持“好斗模式”,但Openswan 1.x和SuperFreeS/WAN已经包含了这个补丁。使用“好斗模式”的麻烦是,安全依赖于口令本身的强度(PPTP有同样的问题)。像IKEcrack(http://ikecrack.sourceforge.net/)和Cain&Abel(http://www.oxid.it/cain.html)的程序尝试截取会话并破解“预共享密钥”。http://www.ernw.de/download/pskattack.pdf有解释。

XAUTH(混合模式)是IPsec的扩建部分,因为它需要修改IKE标准,所以至今未被IETE批准。Cisco看来是XAUTH的最大支持者。FreeS/WAN和Strongswan不支持XAUTH,但Openswan有一个执行者(默认是禁用的,需要重新编译)。Philippe Sultan证明(http://www-rocq.inria.fr/who/Philippe.Sultan/vpn/spoofed_vpn_server.html)如果知道“预共享密钥”可以使用一个被欺骗的服务器获得XAUTH用户名和口令,“预共享密钥”可以通过“暴力破解”(brute force cracking)获得或从客户端复制(磁盘或内存)。关于这个问题可以参看Cisco的“Mutual Group Authentication”(http://www.cisco.com/en/US/products/sw/secursw/ps2308/prod_release_note09186a00802d398a.html#wp1382364),(注:服务器认证和客户口令,目前只有Cisico的VPN连接者支持,不是IOS),也可以使用证书来解决这个问题。

DHCP-over-IPsec。Openswan支持,不过只有很少的客户端支持,Windows客户端现在只有SSH Sentinel,但它已经废止了。

IKEv2。是目前IKE的继承者,它将支持“继承”像口通过EAP这样的认证模式,在提议被IETE批准之前大概还需要一段时间,并且Linux上的一个执行者已经可用,IKEv2有望成为主流标准。

X.509证书。几乎所有L2TP/IPsec客户端都支持。Openswan也支持它,当然是由Strongsec提供的补丁。证书一般被Road Warrios所推崇。不利的是你需要设置多种PKI(Public Key Infrastructure),这也许是管理负担,你需要为Openswan主机和L2TP/IPsec客户端的X.509证书进行生成、发布、撤销等。

另外还存在像Kerberos、CRACK、HYBRID和PIC等IPsec认证方法,但目前它们没有针对Openswan或其它Linux IPsec执行者的执行体。

9 安装(Linux 内核等)

服务器端需要以下几部分:

· Linux内核。需要一个新的,完整的内核,2.4.18或更高,2.6.6或更高。2.6内核包含了“NETKEY”,一个本地IPsec执行者。

· Openswan 或者Strongwan。

· Strongse的X.509证书补丁。通常情况下Frees/Wan需要。Openswan和Strongswan已经包含了这个补丁。

· 可选的(但对低于2.00的Frees/WAN强烈建议):打Delete/Notification补丁,Openswan和Strongswan已经包含这个补丁。

· 可选的:Mathieu Lafon的NAT-Traversal补丁(http://open-source.arkoon.net/)。

· 如果你使用MSL2TP客户端,建议对Frees/WAN使用JuanJo Ciarlante的补丁(http://www.jacco2.dds.nl/networking/freeswan-msl2tp-payload-malformed-workaround-1.diff)。

· L2TP服务。Ll2tpd-0.69不能工作,需要使用l2tpd的邮件列表中的额外补丁或自己创建补丁。

· PPP服务。你需要启用内核的PPP支持。

· Openswan、L2TPD、PPPD的配置文件。

9.1 获得Openswan、Strongswan或FreeS/WAN

你大概更喜欢使用你的发行版提供的包含KLIPS或26sec的内核,它们可能更先进。稍后,如果你觉得你需要最新的版本、额外的补丁或更多的特性,你可以决定来编译你自己的内核和用户态工具。多数多行版包含Openswan或Frees/WAN,当然你也可以下载源代码来重新编译。

9.2.1 X.509证书补丁

Strongsec发布的X.509证书补丁让FreeS/WAN增加了支持可变IP地址。Openswan和Strongswan已经包含这个补丁。除X.509支持外,这个补丁为L2TP/IPsec提供了额外的极为重要的特性,L2TP/IPsec客户端应该对IPsec隧道作出:因此只有UDP数据包(IP 协议17)可以穿过隧道的限制。标准版的FreeS/WAN不能做到这样的限制,普通的FreeS/WAN加密它和另外一端之间的所有协议,而不只是L2TP通信。X.509证书补丁增加了两个参数来解决这个问题,leftprotoport和rightprotoport。不幸的是存在两种不同的情况。Windows 2000和XP带的最初的L2TP/IPsec客户端需要这样:

leftprotoport=17/0

rightprotoport=17/1701

其它所有的客户端(包括更新后的Windows 2000/XP和XP SP2+)使用:

leftprotoport=17/1701

rightprotoport=17/1701

MAC OS 10.3.x+需要另一种配置,因为它使用了“浮动(floating)”UDP端口,幸运的是这种配置只适用上面提到的rightprotoport=17/1701:

leftprotoport=17/1701

rightprotoport=17/%any

如果你拥有不同客户端的混合环境,大概最好使用leftprotocport=17/1701和rightprotoport=17/%any然后简单地放弃支持未升级的Windows客户端(指没有安装XP SP2或KB Q818043升级包)。

作为一种折衷的办法,Openswan开发团队建议使用leftprotoport=17/%any和rightprotoport=17/%any,但这样允许访问所有运行在Openswan服务器上的UDP守护进程。我感到这有点太仁慈了。另一种解决办法是丑陋的分歧,也就是如果在配置文件中指定了leftprotoport=17/1701,那么leftprotoport=17/0会产生公认的副作用。Openswan工作组正在考虑这样的分歧。

只有最新版的X.509补丁(比如针对FreeS/WAN2.x的1.4.8+和针对FreeS/WAN1.99的0.9.37+)可以真正把IPsec连接限制到指定的协议和端口。老版本的X.509不支持leftprotoport和rightprotoport参数,但它们不能执行这些限制,它们接受协议17(UDP)/端口1701(L2TP)限制,但忽略限制,仍通过IPsec隧道恰当地发送其它所有通信(ICMP、HTTP、SSH等)。

9.2.2隧道协议问题

如果你不使用X.509补丁,L2TP/IPsec客户端和FreeS/WAN之间会有一个协同工作的问题,IPsec连接不能建议,因为FreeS/WAN报错:

"peer client ID payload ID_IPV4_ADDR specifies protocol 17; we only support 0"

如果你得到这个错误,那么你需要为FreeS/WAN用户态程序打X.509补丁。

9.2.3 “Delete/Notification”支持

FreeS/WAN低于2.00的版本忽略“Delete/Notification”信息。Mathieu Lafon为FreeS/WAN制作了一个补丁(http://open-source.arkoon.net/),这个补丁包含了支持这些信息的功能。Openswan、Strongswan和FreeS/WAN 2.00或更高已经包含了这个补丁。

客户端也许想通知服务器,它要关闭IPsec连接,它可能通过发送一个“Delete SA”信息来完成。如果服务器不支持“Delete SA”信息,它简单的忽略它们,并且IPsec连接也许超时,然而,这时候客户端当然不能重新连接到服务器,服务器对这时发来的数据包感到困惑,它认为这些数据包是旧连接的,反之,客户端确信它拥有了一个新的IPsec连接。Mathieu Lafon的“Delete/Notification”补丁修正了这个问题。记住,如果客户端当机或Internet连接被中断,客户端不会有发送“Delete SA”信息的机会,在这种情况下,有没有“Delete/Notification”补丁服务器都将超时。“Delete/Notification”补丁看起来对MSL2TP客户端特别有用。(注:MSL2TP客户端大概发送“Delete SA”信息两次,第一次将正确地删除SA,因此第二次将导致一个无害的“ignoring Delete SA payload”信息。)

10、配置Openswan

当你有了支持IPsec的内核,你就需要配置一条或多条IPsec连接。

Openswan文档中的示例假设Road Warrior客户想做“主机到网络”的IPsec连接。这里也这样假设,另一方面你想访问被Openswan网关保护的内网。在“普通”的IPsec(也就是无L2TP)下,你使用left/rightsubnet关键字。

Openswan文档不包括L2TP/IPsec连接。在L2TP/IPSec下用户同样想访问内网,但是完成这样的机制不同。首先,你声明一个Windows/Macintosh客户与Openswan服务器之间的“主机到主机”IPsec隧道。当这个IPsec连接启动,客户连接到在Openswan服务器上的L2TP服务。L2TP服务这时将数据包发往内网。在“普通”IPsec下,Openswan不会把它自身向前转发。

10.1 预共享密钥(PSK:Preshared Keys)概述

大多数L2TP/IPsec客户支持两种认证方法:X.509证书和预共享密钥。我假你首先尝试预共享密钥方式,当理解IPsec和L2TP/IPsec客户之如何工作时然后再根据你的需要切换到证书方式。

10.1.1   预共享密钥(PSK:Preshared Keys):配置一条IPsec连接

下边是一个Openswan配置文件的示例。它为一个用户定义了一条IPsec连接。

注:如果你想使用这个配置,你需要修改你的ipsec.conf文件(或在你的ipsec.conf文件增加下边这句:include L2TP*.conf)。

# Configuration supporting multiple users with any type of

# IPsec/L2TP client. This includes the updated Windows 2000/XP

# (MS KB Q818043) and Mac OS X 10.3+ but excludes the non-updated

# Windows 2000/XP.

#

# Authenticates through a Pre-Shared Key. Supports clients that

# are not behind NAT. Does not support clients that are behind NAT.

 

conn L2TP-PSK

        #

        authby=secret

        pfs=no

        rekey=no

        keyingtries=3

        #

        # ----------------------------------------------------------

        # The VPN server.

        #

        # Allow incoming connections on the external network interface.

        # If you want to use a different interface or if there is no

        # defaultroute, you can use:   left=your.ip.addr.ess

        #

        left=%defaultroute

        #

        leftprotoport=17/1701

        # If you insist on supporting non-updated Windows clients,

        # you can use:    leftprotoport=17/%any

        #

        # ----------------------------------------------------------

        # The remote user(s).

        #

        # Allow incoming connections only from this IP address.

        right=234.234.234.234

        # If you want to allow multiple connections from any IP address,

        # you can use:    right=%any

        #

        rightprotoport=17/%any

        #

        # ----------------------------------------------------------

        # Change 'ignore' to 'add' to enable this configuration.

        #

        auto=ignore

你可以看到,配置比较简单,记住,上边的说明没有leftsubnet和rightsubnet。下边根据多数人的习惯,使用“left”表示服务器(“local”),使用“right”表示Road Warriors。最新的FreeS/WAN、Openswan和Strongwan支持预共享密钥和证书方式使用“right=%any”。

注:默认情况下,配置文件不是有效的(为了安全)。如果你想启用它们,需要把auto=ignore改为auto=add。

10.1.2 指定预共享密钥

将把预共享密钥输入到/etc/ipsec.secrets。

#

# Sample /etc/ipsec.secrets file for server at 123.123.123.123

#

123.123.123.123 234.234.234.234: PSK "thisismytopsecretkey"

123.123.123.123 111.222.111.222: PSK "keyforanotherclient"

# Line below only works on recent versions:

 

# 123.123.123.123 %any: "keysharedbyallusers"

格式解释:

#源IP指服务器,目标IP指客户。当目标IP地址为0.0.0.0时表示接受任何IP地址。

#新版的软件支持目标为%any。这两种情况适用于Road Warrior

源IP 目标IP :PSK         "口令"

10.2 完美安全传送(PFS:Perfect Forward Secrecy)

“完美安全传送”提供特佳的安全。当你启用了PFS,你的敌人(黑客、竞争者等)就不能破解通过IPsec连接传送的数据包,就是他们可以监听加密后的连接并且他们拥有你的密钥(通过黑客、法院指令、第三者等)也不可以。PFS的这个属性就是著名的“阻止第三者”(escrow-foilage)。

上边的示例中有这样一行:

      pfs=no

因为苹果和微软的L2TP/IPsec客户没有启用PFS,所以这一行是必需的。另一方面,Openswan默认是启用PFS的。(有人可能思考,为什么苹果和微软默认情况下没有使用PFS?这是因为<插入你中意的3个字母的政府部门>?)

解决这个互通性的问题非常简单,在FreeS/WAN明确地禁用它。但是这里有FreeS/WAN小组关于它的说明。

FreeS/WAN默认是[pfs=yes]。我们认为没有不的理由;这是更为安全而且成本很小。两个终端的PFS设置必须相同。如果你在FreeS/WAN的配置文件中ipsec.conf中用pfs=no关闭PFS,但是我们假设有可能你在另一端启用了PFS。这更加安全。

他们大概是对的,因为在这种情况它工作更好。“另一端”指微软客户端或Mac OS X v10.3+。编辑Windows注册表可以启用MSL2TP客户的PFS。这可能有一点危险,如果要求你的用户来做可能有点难度,因此我们只有每台客户上启用PFS或者在服务器上加一句来关闭PFS。不幸的是我不知道如何在Windows 2000/XP或Mac OS X10.3+的图形界面下打开PFS。

注:当客户端请求时Openswan将使用PFS,甚至在Openswan配置文件中指定pfs=no时也会启用。

11 配置L2TP/IPsec客户端

假设现在你已经配置好了Openswan,那么,现在就开始安装并配置L2TP/IPsec客户。这根据你的客户类型(Windows 2000/XP、SoftRemote、Panther、Pocket PC等)不同而不同。

在你配置完你的客户端后,你应该开始VPN连接,它将首先启动一个IPsec连接,然后是一个L2TP连接。

12 开始IPsec连接

开始(“拨号”)VPN连接。这一步的过程依赖于不同的客户端。客户端将报告一个错误(“你拨叫的计算机没有响应”或类似的信息)。出错是应该的,你仍没有配置L2TP服务,所以这时应该忽略错误。

不过,IPsec连接应该启动成功。你可以检查Openswan的日志文件(通常是/var/log/secure),它看起像这样:

Nov  1 14:09:59 xxx Pluto[yyy]: "L2TP-PSK" #7: responding to Main Mode

Nov  1 14:09:59 xxx Pluto[yyy]: "L2TP-PSK" #7: Peer ID is ID_IPV4_ADDR: '234.234.234.234'

Nov  1 14:09:59 xxx Pluto[yyy]: "L2TP-PSK" #7: STATE_MAIN_R3: sent MR3, ISAKMP SA established

Nov  1 14:09:59 xxx Pluto[yyy]: "L2TP-PSK" #8: responding to Quick Mode

Nov  1 14:10:00 xxx Pluto[yyy]: "L2TP-PSK" #8: STATE_QUICK_R2: IPsec SA established

如果你看到这样,祝贺你,你已经完成了IPsec部分,继续下边的L2TP部分。如果不是,检查你的配置或参阅“问题解答(22)”

13 L2TP概述

你刚才配置的IPsec连接是被用来开L2TP协议隧道的(RFC3193中定义了L2TP在IPsec之上)。L2TP在运行时会打开PPP隧道,而PPP为实际负荷开隧道。这意味着在你的Linux系统上你需要一个L2TP服务。

常见的L2TP服务软件有:l2tpd、rp-l2tp、OpenL2TP、l2tp、internat-l2tp等。

l2tpd和rp-l2tp守护进程使用相同的名字:/usr/sbin/l2tpd,这非常不幸,很多情况下你只能安装它们中的一个。rp-l2tp看来比l2tpd代码更好,可是rp-l2tp有一个缺点,它不能自己指动态内网(虚拟)IP地址,如果你为你的用户分配固定内网地址这就不是一个问题了。有三种解决方案:rp-l2tp可以被延伸,因为它动态分配IP地址,这更接受或有点违反OSI网络分层模型,但方个方法l2tpd可以做到。仍没有人可以为rp-l2tp执行这个解决方案。第二种解决方案是让PPP服务从一个DHCP服务(在你的网络上你已经拥有的)获得IP地址,要想这样,你需要一个pppd插件——ppp-dhcp。第三种解决方案是使用支持RADIUS的pppd 2.4.2或更高版本,这当然是最灵活的解决方案,但是需要一个RADIUS服务,增加复杂性,尤其是你只有很少用户时。如果你想让RADIUS服务器同PPP一起工作,它必须支持一个称为“IP pools”的特性。注:后两种方案在所有L2TP执行者上应该都可以工作,因为它们是pppd的特性,因而它们与你使用的L2TP服务无关。

除L2TP服务之外,你还需要一个PPP服务,因为L2TP被用来开PPP隧道。多数发行版包含一个PPP服务(pppd)。

14 安装和配置L2TP(Linux)

大概安装l2tpd最容易的方法就是使用你的发行版中的软件包。

; Sample l2tpd.conf

;

[global]

; listen-addr = 192.168.1.98

 

[lns default]

ip range = 192.168.1.128-192.168.1.254

local ip = 192.168.1.99

require chap = yes

refuse pap = yes

require authentication = yes

name = LinuxVPNserver

ppp debug = yes

pppoptfile = /etc/ppp/options.l2tpd

length bit = yes

l2tpd.conf中的参数介绍:

listen-addr    指定l2tpd监听的IP地址。默认情况下,l2tpd将监听本机所有IP地址。

ip range 指定供远程用户使用的一段内网IP地址范围。

local ip  指定供Linux服务器上由l2tpd创建的pppX接口使用的IP地址。这个IP地址必须是内网的有效地址。这意味着,这个IP地址必须属于ip range相同的网络,但是它又不在ip range中。

require chap 或refuse chap      和require pap或refuse pap     一般情况下启用CHAP并且禁止PAP,因为Windows客户端会提示口令没有加密(当然是废话,IPsec已经将连接加密了)。

length bit 一般情况下设为yes,因为没有它后连接会不太稳定。

14.1 L2TP认证和客户IP限制(不是重点)

IPsec支持通过“预共享密钥”和证书方式进行认证。PPP也提供了认证,比如通过口令。生产出来的L2TP也支持认证。问题是,在Windows/Mac的L2TP客户中,你不能在任何地方指定这些口令。可能没有哪个厂商认为L2TP认证是必要的。并且正因为如此,它看起不是那么有用。对于任何人来说,IPsec和PPP认证应该足够了。

在l2tpd.conf中,require authentication参数容易引起误会。这个参数在启用L2TP认证后没有任何作用。它实际上PPP认证(也就是PAP/CHAP)。Windows客户端会默认这样使用,因此你需要在l2tpd.conf配置文件中包含require authentication来启用PPP认证。

在另一方面,指定参数auth file和challenge后,可以启用L2TP认证。但就像上边说的那样,一般情况不需要L2TP认证。

L2TP也可以根据IP地址进行访问控制。这比L2TP认证稍微有点令人感兴趣。不过,Openswan已经根据IP地址进行了访问控制。你可以使用l2tpd的访问控制作为额外的安全方法(就像腰带与吊带)。只有在预先知道所有客户的IP地址时它才能使用,并且毫无错误。不包括动态IP地址的Road Warrior。假如你想把l2tpd访问限制为一个IP地址为234.234.234.234的客户,那么你的l2tpd.conf必须增加以下几行:

[global]

access control = yes

[lns default]

lac = 234.234.234.234

15 PPP认证、压缩和加密

15.1 PPP认证概述

IPsec被用来开L2TP隧道,L2TP在运行时开PPP隧道。PPP有几种认证方法。最常用的是PAP(不加密口令)和CHAP(基于认证的挑战/回应)。你可以自由地选择两者,最好是CHAP。如果你用PAP,Windows客户会提示口令没有加密。这有点离题,IPsec已经加密了。PAP和CHAP都是IETE标准,但微软收购并增强了CHAP,推出一一个新的MS-CHAP(最近确定为MS-CHAPv2)。

Windows 2000/XP客户端还支持EAP和PPP认证,这需要一个由Michael Heiart 提供的pppd插件(http://www.samba.org/cgi-bin/ppp-bugs/trashcan?id=1109;expression=heiart;user=guest),这样就允许你使用RADIUS服务器来实现EAP。

使用PAP或(MS-)CHAP最简单的方法就是通过一个口令文件(secrets),参考下面。当使用PAP或(MS-)CHAP时,口令分别保存在/etc/ppp/chap-secrets或/etc/ppp/pap-secrets中。在比较复杂的情况下而且用户数量较多时,最好寻找一些灵活的东西。这有点超出本文的范围(这属于后边的PPP问题),但有有这样一些可能的方法:

在l2tpd.conf中使用“unix authentrication”关键字。用户名和口令会被Linux用户数据库(/etc/password)再次验正。为什么为PPP选项增加“login”关键字。注:你必须使用PAP,因为(MS-)CHAP不能被用到预加密的用户口令,比如在/etc/passwd中。帐户仍在/etc/pap-secrets中声明,不过如果在这个文件中口令为空字符串(“”),pppd将使用UNIX口令。参考pppd手册。

pppd V2.4.2及以后的版本包含了一个RADIUS插件(radius.so,radattr.so),允许你依靠RADIUS服务器来验证PPP用户。这上面提到过。在Poptop网站上有一篇使用RADIUS和MySQL的文章,他们使用的是PPTP,但同样的原理可以很好地运用到L2TP。

pppd V2.4.3及以后的版本包含了一个由Samba工作组的Andrew Bartlet提供的 Winbind插件(winbind.so),它支持靠Samba或Windows域控制器(Active Directory或NT域控)使用MS-CHAP或MS-CHAPv2对用户进行验证。

多数ppp守护进程目前编译时都有PAM支持。这意味着你可以使用所有的认证机制来认证。例如:插入上面提到的winbind插件,你可以用像pam smb(包含pam_smb_auth)、pam_winbind或pam_ntdom(已经停止)的模块依靠Samba或Windows服务器认证。

在/etc/ppp/options.l2tpd中指定noauth,你就可以完全忘记PPP认证。它可以在任何版本的pppd上工作,因为它不再要求客户进行PPP认证(当然客户仍然有IPsec认证)。但是,这还算是一个比较激进的解决办法。你不应该简单地省去PPP认证,尽管它不会对整个安全增强多少。

15.2 在LINUX上不是总是支持MS-CHAP

默认情况下,Windows客户会使用MS-CHAP进行PPP认证。显然,这意味着在Linux服务器端提供的MS-CHAP是高性能的。不过使用MS-CHAP需要考虑两件事。第一,如果你确定你要使用l2tpns作为你的L2TP和PPP守护进程,那么你不能使用MS-CHAP,通常l2tpns不支持它。一些旧的发行版的问题是它所包含的PPP守护进程不支持MS-CHAP,比如RedHat 9及更早的版本。一个解决方法是配置每个Windows客户使用CHAP。另一个解决方法是更新pppd到包含MS-CHAP(v2)的2.4.2或更高版本。如果你连接一个不支持MS-CHAP的服务器,客户端配置为使用MS-CHAP,pppd将会提示“auth chap 81”和“peer will not authorize”。一但你安装一个支持MS-CHAP的pppd,你需要在/etc/ppp/options.l2tpd增一行(根据你的pppd版本,参照pppd 手册):

+mschap-v2

或者

require-chapms-v2

或者

require-mschap-v2

15.3 MPPE加密

微软开发了MPPE,一种PPP加密协议。它基于RSA安全体系RC4加密算法,并且被用到了PPTP中。通常,你不要想使用MPPE与L2TP/IPsec结合使用,因为它意味着IPsec和MPPE双重加密。有时Windows客户想强制使用MPPE。如果那样的话,在那些Windows客户上禁用加密。这可能把用户搞混,可能会认为禁用MPPE加密后根本没有任何加密,实际上用户可能不知道IPsec已经提供了加密。

有时候可能需要双重加密:当预共享密钥被大家所知道或被许多用户共享,或者发布在网站上的什么地方。比如一些组织希望不使用证书,但这样做后会危及IPsec加密,这样他们只好依靠PPP的MPPE加密。

15.4 MPPC压缩

一些Windows客户也支持压缩。注意,这是PPP压缩,不是IPsec压缩(IPCOMP)。Windows IPsec执行者不支持IPsec压缩(IPCOMP)。微软使用的压缩协议(MPPC)是有专利限制的。如果你仍想使用MPPC,参考配置LINUX PPP服务器(http://www.poptop.org)。

16.1 安装和配置PPP(LINUX)

一旦L2TP连接启用,它将控制权移交给PPP守护进程。明显地,你需要一个PPP服务。几乎每个发行版都有一个pppd。安装一个最新的版本,比如2.4.1或更高。另外,相同的PPP软件也可以用来做点别的事情(比如:用于拨号连接的模拟调制解调器)。幸运的是,你可以在l2tpd.conf文件中用pppoptfile参数来为L2TP守护进程指定一个单独的PPP选项文件。

注意:PPP守护进程的口令共享给所有PPP进程,不仅仅是l2tpd启动的那个。可是,你可以限制用户名/口令的有效性到某些IP地址,就像这个chap-secrets示例文件那样。

# Secrets for authentication using CHAP

# client        server  secret                  IP addresses

jacco           *       "mysecret"              192.168.1.128/25

*               jacco   "mysecret"              192.168.1.128/25

sam             *       "rumpelstiltskin"       192.168.1.5

*               sam     "rumpelstiltskin"       192.168.1.5

每个用户都有两个入口,两端的认证。在这种情况下,用户jacco将从像/etc/l2tpd/l2tpd.conf文件中指定的l2tpd的IP地址池(在示范配置文件中是192.168.1.128——192.168.1.254符合192.168.1.128/25) 获得一个地址。用户sam总是从PPP服务获得192.168.1.5。这是一种给用户在你的内部局域网上的固定虚拟地址的方法(它看起来能工作,但是不能100%确认在任何情况下都能工作)。如果你不想在IP地址作任何限制,你可以使用通配符“*”来代替IP地址(不推荐这样,因为它会允许用户自己确定自己的地址,有一定的风险)。

微软客户端有一个选项“登录到Windows”如果启用它,客户端尝试用“\\DOMAINNAME\username”验证。另外,你还可以在chap-secrets或者pap-secrets文件中指定这个用户名格式。

关于解决如何配置PPP服务器这个主题的资料很多,如PPP Howto(http://www.linux.org/docs/ldp/howto/PPP-HOWTO/)。

简单点,我们假设你的Linux服务器外网接口是eth0,并且内网接口是eth1。PPP服务允许远程用户用一个内网的IP地址,一旦用户连接上,ppp0介面将会自动启动。l2tpd.conf中有一行“local ip”,用这个参数指定内网的一个固定IP地址供L2TP守护进程使用。

你看到的PPP选项文件示范那样(/etc/ppp/options.l2tpd),你也可以指定DNS和WINS服务器,当连接成功后,远程客户将会自动获得这些参数。一般情况下,你应该为远程客户指定的DNS/WINS就像直接连接的内网客户一样。可是,Windows 2000/XP自己的L2TP/IPsec客户端好象只支持获这些DNS/WINS服务器(当它的Internet连接配置为动态IP地址时)。

注:options.l2tpd包含proxyarp参数。这个参数将在内网接口(示例中的eth1)为远程用户打开一个代理ARP入口。如果这个关键字没有指定,Windows客户端发出的数据包将到达内网服务器,但这些服务器不知道向哪儿发出回应,因为没有人回答它的ARP请求。用proxyarp参数,内网机器被到远程Windows客户到网关发送进来的数据包欺骗。网关让IP继续向前,因此它知道如何发送数据到Windows客户端。

16.2 指定DNS被忽略的问题

从PPP的示例文件(/etc/ppp/options.l2tpd)中可以看到,你可以指定DNS和WINS服务器,当连接被建立后,远程客户端会自动挑出它们。一般情况下,你可能希望远程用户与内网用户使用相同的DNS/WINS服务器。不过,看来Windows 2000/XP自带的客户端只有它的Internet连接被配置成使用动态IP地址(比如通过DHCP或PPP的IPCP)时才会挑出这些DNS/WINS服务器。

16.3 MTU问题

你的VPN连接有断断续续的问题,它可能是一个MTU问题。你大概会看这样的问题:你可以ping内网的机器,并且你可以复制非常小的文件,但是你不能复制大文件,因为连接中断。试着在/etc/ppp/options.l2tp文件中增加以下几行减少MTU到1410(或许更低)。

mtu 1400

mru 1400

当你的连接通过VPN到用broken Path MTU Discovery站点时,这个问题可能特别明显。大概用PPTP或PPPoE的ADSL连接同样有这样的问题。如果认证成功前连接失败,减少PPP数据包的大小是没有用的。如果可以,试着使用更小的证书或不使用被NAT的连接。如果在2.6内核上使用NETKEY,假如你经历过PMTU问题,推荐使用2.6.12以上版本。在2.6.12以上版本,你可以这样做:

echo “0” > /proc/sys/net/ipv4/ip_no_pmtu_disc

FreeS/WAN的邮件列表中有一些讨论,FreeS/WAN小组写到:“可以在配置文件ipsec.conf中使用overridemtu=参数来改变MTU。”一般情况下,这个参数仅支持KLIPS,不支持NETKEY。另外,减少你的证书大小(短姓名,更少的X.509v3选项等),或用IPCOMP压缩。你也可以试着强制你的以太网接口使用一个更小的MTU:ifconfig ethx mtu 1400。

另外,你也可以尝试这种选项:fragicmp=no

Cisco也有关于这一问题的一些文档。微软知识库中的Q314053解释了如何为一个指定的适配器设置MTU。

16.4多DSL线路用户技巧

大多数DSL用户拥有一个固定IP地址或通过DHCP获得一个动态IP地址,可是,一些DSL服务为的Internet连接使用PPP(比如通过PPTP或PPPoE),如果你的服务是这样的,你经常会使用接口ppp0来访问Internet,并且当你决定通过Internet连接使用L2TP/IPsec VPN时,L2TP守护进程产生的ppp守护进程会自动挑选下一个空闲的接口名称,比如ppp1。所以当你有多条DSL线路并且它们中的一个因为某些原因停止后又启动起来时,大概会产生一些问题。同时,PPP接口被某个L2TP/IPsec客户端挑选出来,因为pppd检测到它是空闲的,这大概会搞乱你的一些设置,比如你的防火墙规则大概期望DSL连接在一个固定的PPP接口。关于这个问题的,在PPP的选项文件中为你的DSL连接增加了一个“unit xxxx”参数,这里的“xxxx”是一个比较大的数字,比如1000,每个DSL连接将获得一个惟一的PPP接口(分别为ppp1000,ppp1001),不会与保留给L2TP/IPsec客户端(ppp0,ppp1等)的较小的PPP号码相冲突。你需要ppp-2.4.2以上版本才支持这个特殊的参数。ppp手册页说这个参数仅能工作于外出的连接,但它也能工作于进入的连接(看来像pppd的一个非正式特性)。“unit”参数不能用于/etc/ppp/options.l2tpd,只能用于DSL连接的PPP选项文件,这个工作区将一直工作于指定给DSL连接的最高PPP编号,这个号码总是大于客户端总数。

17 再次开始L2TP/IPsec连接

到这里,你已经配置好了IPsec、L2TP、PPP,在Windows或Mac客户端再次开始VPN连接,这个过程和上边的一样,但这一次L2TP连接应该正常启动,如果成功了,祝贺你,你获得了一个成功的L2TP/IPsec配置。如果它不成功,检查你的设置,也可以看下面的“检查并修理故障”。

有两种比较好的检查办法:

1、在客户端和服务器之间放一台计算机,你可以用这台计算机靠tcpdump或Ethereal这样的网络监视程序来sniff客户端和服务器之间的通信。数据包必须被加密,如果你看到未被加密的数据包(举例来说,出现文本“L2TP”),说明你的设置有问题。

2、在客户端使用nmap或其它更好的端口扫描工具来扫描服务器上开放的端口(用法:nmap –sU 123.123.123.123),你不应该能看到L2TP守护进程(UDP 1701),打开的端口应该只有IKE(UDP 500)和随意的UDP端口,比如4500(NAT-T)。

18 对L2TP/IPsec的一些评论

在第一次测试期间,我忘了在Windows工作站的TCP/IP配置里输入默认网关和主机名,对于Linux服务器在本地网络来说真的不是一个问题,可是当我从Windows客户端向Linux服务器发起一个连接时,l2tpd在/var/log/message里提示一个有点模糊的错误信息“Specify you hostname”,最初我想大概是l2tpd不能探测到正在运行的Linux服务器的主机名,我在Windows工作站里输入主机名后这个问题解决了,我只是简单地认为l2tpd不需要它。

19 NAT-Traversal

 

  评论这张
 
阅读(2799)| 评论(0)
推荐 转载

历史上的今天

最近读者

热度

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2014