首页 > 学技术 > 技术网文 > VPN > 正文

[保留] 使用Linux L2TP/IPsec VPN 服务器


来源 chinaunix.net 酷勤网整理

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

首先声明一下,我只有初中文化程度,在做Linux VPN接入服务器时发现网上这方面的中文资料太少,无奈只好自己用金山词霸一个单词一个单词地把它翻译了出来,不敢独享,现贴出来,希望大家不要嘲笑我的英文水平,也希望高手多多指教。同时也希望大家为了国家的兴旺,坚决抵制国外列强的经济侵略和文化侵略,一定要支持民族产业,少买洋货,少看洋片……。

1 绪论
这篇文章包含了如何使用微软、苹果或其它第三方厂商的L2TP/IPsec客户端来设置让Road Warrior连接到一个基于FreeS/WAN或后续软件的Linux服务器。
IPsec是一个安全通信的网络协议。它是一个正式的互联网标准。不同厂家生产的客户端和设备应该能够协同工作(从理论上说),只要他们支持IPsec标准。
2 目录
绪论
目录
背景
过程概况
安全注意事项
VPN的选择
用L2TP使用IPsec的优势和劣势
支持Road Warrior
安装(Linux 内核等)
配置FreeS/WAN
配置L2TP/IPsec客户端
开始L2TP/IPsec连接
L2TP概况
安装和配置L2TP(Linux)
PPP认证、压缩和加密
安装和配置PPP(Linux)
再一次开始L2TP/IPsec连接
L2TP/IPsec的一些评论
NAT-Traversal
Windows网络(WINS等)
分离隧道
发现并解决故障
证书
保护无线连接
Linux作为L2TP/IPsec客户端
一些思考
有关的链接
修订的版本
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 阻止外部访问L2TP守护进程。
应该对L2TP守护进程建立防火墙,使外部接口不能访问。也可以说:必须为L2TP守护进程建立防火墙,否则你将冒巨大的风险。因此,应该建立防火墙,除ipsec0接口外,阻止从所有接口进来的L2TP连接(UDP 1701)。
5.2 监听地址参数(仅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.3 监听地址参数和26sec
不幸的是,上面提到的“listen-addr”不能用在2.6内核的本地IPsec执行者(26sec)上,因为26sec没有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.4 ip_forward(IP传递)
另一个值得注意的安全点是,人们通常将/proc/sys/net/ipv4/ip_forward设置为1来启用路由(VPN已经启用),这样从IPsec隧道来的数据包将被转发到内网。可是有一些安全含意,当对某个接口做了限制后,也许一个或多个iptables forward规则同样可能被欺骗。否则你可以使用iproute2(高级路由)。这有点超出本文的范围。
>



 QUSHIQIANG 回复于:2005-06-04 17:21:46

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证书进行生成、发布、撤销等。
像CRACK、HYBRID、PIC等仍然存在,但当前它们没有针对Openswan或其它Linux IPsec执行者的执行体。


 QUSHIQIANG 回复于:2005-06-04 17:22:28

9 安装(Linux 内核等)
服务器端需要以下几部分:
• Linux内核。需要一个新的,完整的内核,2.4.18或更高,2.6.6或更高。2.6内核包含了“26sec”,一个基于KAME的本地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 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
看起来微软在Windows 2000/XP带的最初的L2TP/IPsec上犯了一个错误(如果不是错误就是矛盾)。因此在一个两种情况混合的环境(包括没有升级的Windows 2000/XP和其它客户端),不得不使用分类别的配置文件来支持这两种类型。
只有最新版的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)。
conn L2TP-PSK-orgWIN2KXP
        #
        # Use a Preshared Key. Disable Perfect Forward Secrecy.
        #
        authby=secret
        pfs=no
        #
        left=123.123.123.123
        #
        # Required for original (non-updated) Windows 2000/XP clients.
        leftprotoport=17/0
        #
        # The remote user.
        #
        right=234.234.234.234
        rightprotoport=17/1701
        #
        # Authorize this connection, and wait for connection from user.
        #
        auto=ignore
        keyingtries=3
你可以看到,配置比较简单,记住,上边的说明没有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服务器上ppp0接口使用的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认证、压缩和加密
IPsec被用来开L2TP隧道,L2TP在运行时开PPP隧道。PPP有几种认证方法。最常用的是PAP(不加密口令)和CHAP(基于认证的挑战/回应)。你可以自由地选择两者,最好是CHAP。如果你用PAP,Windows客户会提示口令没有加密。这有点离题,IPsec已经加密了。PAP和CHAP都是IETE标准,但微软收购并增强了CHAP,推出一一个新的MS-CHAP(最近确定为MS-CHAPv2)。
默认情况下,Windows客户会使用MS-CHAP进行PPP认证。问题是大多数发行版包含的PPP服务不支持MS-CHAP,比如Red Hat Linux 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版本,参照man pppd):
+mschap-v2
或者
require-chapms-v2
使用PAP或(MS-)CHAP最容易的方法是一个口令文件(secrets)。口令文件指定为/etc/ppp/chap-secrets或者/etc/ppp/pap-secrets(分别对应于PAP还是CHAP/MS-CHAP)。当用户数量较多而更为复杂的情况下,你也许会寻找更为灵活的东西。这是来自文档(毕竟它是PPP出版)的一小部分,但是这有多种可能的解决方案:
在l2tpd.conf中使用“unix authentication”关键字。账户名和口令将依靠Linux用户数据库(/etc/passwd)来检查。为PPP选项增加“login”关键字后会它会做什么。记住,你最好使用PAP,因为(MS-)CHAP不能使用保存在/etc/pssswd文件中的预加密用户口令。账户名仍由/etc/ppp/pap-secrets指定,但是在这个文件中口令为空字符串(“”)时,pppd使用Unix口令。参见:man pppd。
pppd2.4.2以上版本包含了RADIUS插件(radius.so,radattr.so),允许你依靠RADIUS服务对用户进行认证。在http://poptop.sourceforge.net/dox/radius_mysql.html有利用RADIUS和MySQL的安装示范。他们使用pppd,同样也适用于L2TP。
pppd2.4.3及以上版本包含了一个由Samba小组的Andrew Bartlet提供的winbind插件(winbind.so),它提供依靠Samba或Windows域控制器使用MS-CHAP或MS-CHAPv2对用户认证的能力。Andrew发布了安装文档:http://hawkerc.net/staff/abartlet/comp3700/final-report.pdf。
多数ppp守护进程目前编译时都有PAM支持。这意味着你可以使用所有的认证机制来认证。例如:插入上面提到的winbind插件,你可以用像pam smb(包含pam_smb_auth)、pam_winbind或pam_ntdom(已经停止)的模块依靠Samba或Windows服务器认证。还有,你可以用pam_ldap来依靠LDAP服务认证。
在/etc/ppp/options.l2tpd中指定noauth,你就可以完全忘记PPP认证。它可以在任何版本的pppd上工作,因为它不再要求客户进行PPP认证(当然客户仍然有IPsec认证)。但是,这还算是一个比较激烈的解决办法。你不应该简单地省去PPP认证,尽管它不会对整个安全增强多少。
微软也开发了MPPE,一种PPP加密协议。它基于RSA安全体系RC4加密算法,并且被用到了PPTP中。通常,你不要想使用MPPE与L2TP/IPsec结合使用,因为它意味着IPsec和MPPE双重加密。有时Windows客户想强制使用MPPE。如果那样的话,在那些Windows客户上禁用加密。这可能把用户搞混。他禁用MPPE加密,认为根本没有任何加密,IPsec已经提供了加密,但是用户大概不会知道这些。一些Windows客户也支持压缩。你注意,这是PPP压缩,不是IPsec压缩(IPCOMP)。微软使用的压缩协议(MPPC)是有专利限制的。如果你仍想使用MPPC,参考配置一个LINUX PPP服务器(http://www.poptop.org)。


 QUSHIQIANG 回复于:2005-06-04 17:23:32

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 MTU问题
你的VPN连接有断断续续的问题,它可能是一个MTU问题。你大概会看这样的问题:你可以ping内网的机器,并且你可以复制非常小的文件,但是你不能复制大文件,因为连接中断。试着在/etc/ppp/options.l2tp文件中增加以下几行减少MTU到1410(或许更低)。
mtu 1400
mru 1400
当你的连接通过VPN到用broken Path MTU Discovery站点时,这个问题可能特别明显。大概用PPTP或PPPoE的ADSL连接同样有这样的问题。如果认证成功前连接失败,减少PPP数据包的大小是没有用的。试着使用更小的证书或不使用被NAT的连接。
FreeS/WAN的邮件列表中有一些讨论,FreeS/WAN小组写到:“可以在ipsec.conf的配置安装用一节用overridemtu=参数改变MTU。”一般情况下,这个参数仅支持KLIPS,不支持26sec。其它的提有,减少你的证书大小(短姓名,更少的X.509v3选项等),或用IPCOMP压缩。你也可以试着强制你的以太网接口使用一个更小的MTU:ifconfig ethx mtu 1400。
Cisco也有关于这一问题的一些文档。微软知识库中的Q314053解释了如何为一个指定的适配器设置MTU。
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
19.1 绪论
在客户端和IPsec服务器之间有时需要网络地址转换(NAT:Network Address Translation)。比如:当用户把他所有的计算机联网并通过一个NAT路由器共享上互联网。还有一种情况是VPN服务器自己位于NAT设备(UDP 500、4500传送到VPN服务器)之后。甚至在有些情况下客户端和服务器都位于NAT之后。有些ISP也使用在他们的路由器上使用NAT,我们看到许多GPRS服务商使用NAT,比如,他们给GPRS电话分配10.x.x.x或192.168.x.x地址。
NAT将在数据包穿过时改变它。问题是VPN会设法防止数据包改变。一些NAT设备支持“IPsec passthrough”,允许一次一个用户的IPsec通过,相同的NAT设备后的不允许多个连接的用户。
如果同L2TP/IPsec一起使用NAT-T,考虑到是实验性的并且不安全。Linux kernel 2.6包含的一个不同的IPsec执行者(“26sec”)也支持NAT-T。显然它也有与Openswan等的NAT-T补丁相同的安全问题。26sec执行者支持KAME用户态程序(多数发行版的ipsec-tools)也支持Openswan/Strongswan/FreeS/WAN 2.x。切换到ipsec-tools并不能改变安全问题。
19.2 局限性和需求
NAT-T支持26sec(推荐kernel 2.6.6及以上),最新的发行版如Fedora Core2+、Debian unstable、Mandrake 10.0+、SuSE 9.1+使用了带26sec的内核,支持NAT-T。如果你在内核中使用KLIPS代替26sec,你需要Mathieu Lafon的NAT-Traversal补丁(http://open-source.arkoon.net/)。注:根据Mathieu,NAT-T在传输模式(Transport Mode)可能不安全。微软、SSH、SafeNet不支持NAT-T,但他大概会对非安全工作区拿出一个方案。老版的Red HAT、Mandrake、SuSE内核没有包含KLIPS的NAT-T补丁,对于这些版,你将需要重新编译内核,因为NAT-T补丁涉及到了内核的TCP/IP部分。如果你用的是FreeS/WAN用户态工具,你还要打这个补丁。Openswan和Strongswan已经包含了这个补丁。打过补丁后的FreeS/WAN在Makefile明确启用了传送模式下NAT-T。Openswan和Strongswan已经支持传送模式下NA-T。
Openswan的NAT-T支持对26sec和KLIPS都有效,在配置文件ipsec.conf中添加“nat_traversal=yes”即可,客户端不在NAT后面不受影响,客户端的任何程序都仍将正常工作。
KLIPS的NAT-T补丁目前不支持使用“预共享密钥”认证的连接。如果你在KILPS和NAT-T使用了“预共享密钥”,Openswan将不允许连接,因为发送者的端口不是500,并且NAT-T补丁不能支持它,这应该引起程序员的注意。“预共享密钥”有一些缺点,因此你应该使用证书。26sec执行者支持“预共享密钥”,但你将不得不使用right=%any、leftid=和rightid=。如果你用right=a.b.c.d指定了一个IP地址,但没有left=和right=,Openswan会提示“no connection authorized”。
如果你在同一NAT设备后面有多个客户端,只有第一个客户端可以连接,这大概是Linux内核的一个限制。另一个限制大概是客户端不能共享相同的NAT-ed(internal)地址。当然这十分难以消除,尤其是远程客户端之间的一个小的团队。另一个限制是如果客户端和服务器都位于NAT后,我没有亲自测试过,但是我收到这方面的一份报告,它不能工作,不过我不能确定到底是双重NAT引起的还是其它原因。
几乎所有L2TP/IPsec客户端都支持NAT-T。Windows Server 2003也支持NAT-T。像承诺的那样,微软为Windows XP和Windows 2000 Professional发布了一个IPsec升级包(MS KB Q818043)。这个升级包同样也包含在Windows XP Service Pack 2,可是它制造出来的NAT-T升级包有导致第三方应用程序出现一大堆错误印刷的问题,因此微软要召回它的升级包,2003年8月他们重新发布了一个补丁,这个补丁可能通过Windows Update安装,如果你使用的是Windows 2000 Professional,你需要先安装Service Pack 3或更高版本,另外,IPsec升级包不会在Windows Update显示,对于Windows XP,你需要Service Pack 1或更高版本。如果升级包仍没有在Windows Update中显示,转到Windows Update Catalog并且使用“高级搜索选项”搜索“818043”,如果你想下载NAT-T升级程序到硬盘并发给更多的客户端,你可以使用Windows Update的Download Basket(见:http://support.microsoft.com/default.aspx?scid=kb;ZH-CN;323166)或Software Update Services(见:http://www.microsoft.com/windowsserversystem/sus/default.mspx)。
依据微软员工的信件,也将可以对Windows 2000 Server和ISA Server更新,不过微软宁愿你升级到Windows 2003。引用微软的话(KB Q818043):“在 Windows 2000 路由和远程访问中不会增加 NAT-T 服务器端支持。”如果你的服务器运行的Linux,微软的这个决定不会影响到你。
除SSH Sentinel之外所有的客户端都会自动检测NAT-T是否启用。SSH Sentinel需要手动在VPN连接的“属性”窗口的“高级”选项中启用“NAT-Traversal”。
19.3 L2TP/IPsec客户端支持NAT-T的情况
成功测试的(也就是看起来能工作,但是仍认为是试验性的并且不安全的)。
&#8226; Windows XP Home/Professional(带有IPsec update Q818043或Service Pack2)。支持Windows需要最新的高于0.6c的NAT-T补丁(检查/var/log/messages里的Openswan的启动信息来查看你服务器上的NAT-T版本)。这个补丁已经包含在Openswan2.x和Strongswan中,如果你的服务器没有这个补丁,你将在LOG文件中看到“unsupported ID type ID FQDN”错误信息。如果没有http://www.advancevpn.com/public/super-freeswan-818043NATv3.patch补丁(Openswan 2.x和Strongswan 2.0.2+包含有这个补丁),你将得到“no connection is know”的错误信息(LOG中显示的IP地址和端口号被一个大数代替)。如果你用的是带SP2的Windows XP并且你的Openswan服务器位于NAT后面,你可能需要修改系统注册表。
&#8226; Windows 2000 Professional(带IPsec update Q818043,这个更新不包含在任何服务包中),参考上边提到的Windows XP。
&#8226; Windows 2000 Server(当客户端使用):据一黑客报道,它可以工作,这个版本的Windows在Windows Update中不会显示IPsec update Q818043,但如果下载Windows 2000 Professional的IPsec update Q818043补丁并安装。微软大概不支持这样,也就是说它可能会破坏你的“支持合同”。在Widnows Update,到Windows Update Catalogue并选择“Windows 2000 Professional SP3和你的语言版本,在“高级搜索”中选择“包含这些字符:818043”,把这个更新加入到“Download Basket”,下载并安装。
&#8226; Windows Server 2003(当客户端使用):内建了NAT-T支持,也使用ID_FQDN方法(参考上边提到的Windows XP)。
&#8226; MSL2TP客户端连接到一个基于Linux的KLIPS服务器。
&#8226; SafeNet SoftRemote V7.0.5和9.2.1(可能仅用于KLIPS)。
&#8226; SSH Sentinel V1.4.1 build 98连接到基于KLIPS的服务器。可是有一个断开连接的问题,Sentinel看起来不会发送“Delete SA”数据包,Openswan仍认为这是一个IPsec连接,因此客户端在IPsec连接超时前不能访问Linux机器的在外部接口。
&#8226; Pocket PC 2003(“Windows Mobile 2003 for Pocket PC”)用证书连接。可以工作,但只有证书比较尺寸比较小时可以。
&#8226; Pocket PC 2003用“预共享密钥”连接到基于26sec的服务器。
不能工作的:
&#8226; MSL2TP客户端连接到基于26sec的服务器。
&#8226; SSH Sentinel V1.41 build 98连接到基于26sec的服务器。
&#8226; SSH Sentinel V1.4 build 177。
&#8226; SSH Sentinel V1.3或更低。
&#8226; Pocket PC 2003用“预共享密钥”连接到基于KLIPS的服务器。
至今不能工作的:
&#8226; Mac OS 10.3 Panther。
19.4 准备NAT-T
启用NAT-T的过程:开始取决于你的发行版的内核是否包含26sec或KLIPS,如果你的内核支持26sec那么内核已经支持NAT-T。如果你的发行版的内核既没有包含26sec也没有包含KLIPS,那么很明显没有为IPsec提供NAT-T支持。即使你的内核支持KLIPS,大概仍不支持NAT-T。发行版根本不带任何IPsec支持或带一个基于内核没有NAT-T补丁的KLIPS大概需要安装一个新的内核。如果你需要安装并且重新启用一个新内核RPM,确认获得了对内核RPM的一般警惕,也就是不要更新内核,要重新安装新内核来代替当前内核,并且在lilo.conf中为新内核增加一个入口,然后重新运行一下lilo(也可能使用GRUB)。
19.4.1 基于内核的26sec使用NAT-T
不像KLIPS的NAT-T补丁,26sec执行者支持“预共享密钥”认证的NAT-T。可是你不能用right=a.b.c.d参数指定一个固定IP地址,将将只好指定right=%any并且使用leftid=/rightid=,这意味着“预共享密钥”被所有Road Warriors共享。你也只好在ipsec.secrets中使用%any:
123.123.123.123 %any : PSK “thisismytopsecretkey”
不能使用l2tpd的listen-addr参数,因为26sec没有使用ipsec0样式的接口。
19.4.2 基于内核的KLIPS使用NAT-T
KLIPS的NAT-T补丁不支持“预共享密钥”。
19.5 关于NAT-T的发行版细节信息

19.6 启用NAT-T的过程
当你有一个支持NAT-T的内核和用户态工具,你可以依照下面的过程为L2TP/IPsec客户端启用NAT-T。
&#8226; 确认L2TP/IPsec客户端支持NAT-T,这常意味着你需要获得最新版或安装更新。
&#8226; 如果你的NAT设备支持IPsec passthrough,修改它的配置来禁用IPsec passthrough。
&#8226; 如果你的Openswan服务位于一个NAT设备后面并且你使用的客户端运行的是带SP2的Windows XP,你可能需要修改客户端的注册表。
&#8226; 在Openswan的配置文件ipsec.conf里添加一行nat_traversal=yes。
&#8226; 如果用户的工作站位于NAT设备后面,IP地址是私网地址,Openswan在它可以商谈一个连接前需要知道关于这个地址的一点情况,用户NAT设备的公网IP用right=参数指定,有三种方法指定位于NAT设备后面的用户工作站的私网地址:
方法1:rightsubnet=192.168.111.40/32
方法2:rightsubnetwithin=192.168.111.0/24
方法3:rightsubnet=vhost:%no,%priv (推荐)
第一种方法Openswan、Strongswan和所有的FreeS/WAN都支持,但明显它不是特别灵活,你的每个Road Warriors可能使用单独的/32,这种方法不方便。第二种方法是X.509补丁的一个特点,这意味着只有Openswan和Strongswan支持,FreeS/WAN打过X.509补丁后才能支持。可以接受你指定的一个子网并且客户端使用的私有的地址(/32)位于这个子网。注,这和简单的配置rightsubnetwinthin=0.0.0.0/0相比不是一个好的主意。第三种方法是NAT-T补丁的一个特性。这意味着Openswan和Strong在KLIPS和26sec上都支持,FreeS/WAN需要打过补丁后才支持。首先你在ipsec.conf文件中用virtual_private=192.168.101.0/24参数指定子网。一些人更愿意使用这个参数来列举所有的RFC1918子网,除这些之外都用在你的Linux服务器上。参考NAT-T文档的示例,客户端的私有地址(/32)在任何这些子网都可以接受。另外,%no允许相同的配置文件用到没有位于NAT设备后面的客户。
20 Windows网络(WINS等)
在许多方案中,VPN是用来开NetBIOS/SMB/CIFS网络传输(Windows网络)隧道的,不幸的是Windows网络是一个很糟的协议(可以咨询Samba的开发人员)并且它经常导致各种问题,这不是一篇Windows网络指南,因此我不能在那方面帮助你,但是我可以提供一些提示:
如果你想通过子网(包含WAN和VPN)浏览“网上邻居”,非常推荐有一台WINS服务器,如果你没有一台可用的Windows NT/2000/2003或你不想购买它,你可以下载Samba(网址:http://www.samba.org)并且将它配置成WINS服务器。记住这个重要的部分:所有计算机必须配置成使用WINS服务,否则一些计算机看其它计算机可能有点麻烦。
我也注意到,最好的结果是所有的客户端应该配置成使用相同的工作组名或域名,也就是办公网络。许多客户端都有一个默认的工作组名或域名(比如WORKGROUP或MSHOME),与实际办公网络的工作组名域名不同,最好将这些改成相同的名字。在ISA Server.org网站(http://www.tacteam.net/isaserverorg/vpnkitbeta2/vpnclientbrowsing.htm)可以找到类似的技巧。
微软的客户端有一个“登录到网络”的选项,如果你想登录到域控制器就启用它。
Windows XP Home不能加入一个域,可是你应该可以访问域中的资源。
自从微软认可L2TP/IPsec协议以来,我还没有真正试过让登录脚本(批处理文件)工作,理论上它应该可以工作。在连接向导的最后一步,计算机询问你这个连接是供“我自己”还是“使用这台计算机的所有人”使用,应该选择“所有人”。你也许喜欢不输入口令,在你下一次登录时点击“选项”按钮,你可以看到出现一个复选框“通过拨号网络登录”,选中这个复选框,用你的Windows用户名和口令登录,你可以看到一个窗口让你选择的连接,其中有你刚才创建的VPN连接,选择它你就可以通过VPN连接登录,并且登录脚本就会启动。


 QUSHIQIANG 回复于:2005-06-04 17:24:23

21 分离隧道
如果你一个连接到办公室的VPN,一般情况所有的数据包通过VPN隧道发送,这不仅是传送到内网服务器上的,而且也有传送到互联网上的,比如当你在互联网上冲浪时。这是一个缺点,互联网通信要通过办公室的互联网连接两次,一次从本机到办公室,第二次从办公室到互联网。
另一方面,如果你使用“分离隧道”,所有内部通信将通过VPN进行隧道传输,但所有互联网传输将被直接发送到互联网,也就是不通过办公室的互联网连接。但这样做缺乏安全,这时客户端用户有两条连接:一条到办公室,另一条到互联网,理论上黑客可以突破并进入用户的家庭计算机并从那里访问办公室。如果禁用“分离隧道”,这将难以做到。
在Windows 2000/XP和MSL2TP,通过修改你创建的VPN的“高级”TCP/IP设置,可以启用或禁用“分离隧道”。你可以取消选择称为“使用远程网络的默认网关”来启用“分离隧道”。在SSH Sentinel 1.4或更高版本上,你可以在“高级”选项中启用或禁用“分离隧道”。
通常,推荐避免启用“分离隧道”。你得到一点额外的带宽但你也引入了一个安全问题。如果你担心用户没有经过你的许可秘密地启用了“分离隧道”,你可以考虑给VPN客户端分配不在子网内的虚拟IP地址,这不是一个万全之策,但可以保证防范多数用户。不在子网内意味着虚拟IP地址(用l2tpd的“ip range”参数指定)不属于内网。你将只好在VPN服务器上做一些额外的路由,这样在虚拟IP子网上的客户仍然可以访问在内网上的资源。假设你配置了不在内网的虚拟IP地址,因此当一个用户连接时会发生什么?当一个用户禁用了“分离隧道”,默认路由将到达VPN服务器,用户可以访问内网资源,因为VPN服务器上有额外的路由。互联网端也通过VPN服务器的路由操作从而可以访问。可是当用户启用“分离隧道”,事情就有一点不同了,VPN客户默认路由将成为到达互联网,因此互联网端将可以访问。但内网的资源将不再可以访问。客户端是不在内网的虚拟IP地址,因此到达内部网的数据包将被送到默认路由(互联网)而不是VPN服务器。如果你在内网使用私有的不可路由的IP地址(根据RFC 1618 e.g.192.168.1.0/24),那么IPS将丢弃这些数据包。换句话说,启用“分离隧道”后VPN客户将不能访问在内网的资源,这完全是客观事实。不幸的是,这个方法可以被用户绕过,只要用户在他们的工作站上定义了一个到内网的静态路由即可。对粗心大意的用户没有办法,除非根本不用VPN。
22.1 发现并修理故障
很自然,VPN使维修工作更困难,VPN不想对假设潜在的攻击问题给出更多的信息,数据包被服务器默默地丢弃,发送到的客户端的错误信息大概没有多大帮助。所以说要对你的L2TP/IPsec连接可能出现的问题给出一些技巧。
使用ipsec verify命令。不是报告的每个错误是真实的问题,不过在某一种情况可能有帮助。例如,如果你不是用“随机加密”(Opportunistic Encryption),你应该忽略关于“丢失反向DNS记录”(missing reverse DNS entries)的错误信息。
一些IPsec数据包被封锁。例如,当在路由器上有一个限制过分的防火墙或者ISP总是阻碍VPN协议。用tcpdump验证IPsec数据包(UDP 500/4500和IP 50)真正到达你的Linux服务器,你也可以使用Openswan的ipsec ikeping命令,通过一层一层地跟踪数据包就可以把问题诊断出来。
tcpdump -n -i eth0 not port 22
tcpdump -n -i ipsec0 -s 1500
tcpdump -n -i ppp0 -s 1500
tcpdump -n -i eth1
(eth0是敌对网络也就是互联网,ipsec0是运行在敌对网上的IPsec连接,ppp0是通过IPsec隧道的L2TP/PPP连接,eth1是内网,如果你的设备命名不同,依照你的设备修改。)
在eth0接口上,你不应该看到任何未加密的数据包(比如出现“L2TP”),如果你看到未加密的数据包,这不是一个安全的VPN。有一个例外,2.6内核自带的IPsec执行者(“26sec”)没有ipsec0接口,你在外部接口eth0上运行tcpdump,你可以在一个方向上看到未加密的数据包。在Mandrake 10上,tcpdump可能在对数据包解码时会出现错误,大概是校验和无效。最好的解决方案是在客户端和服务器之间用第三个系统检查,在这两者之间的通信上用tcpdump或Ethereal等嗅探,你将看到所有的数据包被加密。
使用ping测试数据包流程。
ping <external IP>; 
ping <internal IP >; 
ping <local ip in l2tpd.conf>; 
ping <any IP address on internal network>;
22.2 IPsec日志
Openswan的错误信息日志在/var/log/secure。如果你需要更详细的,你可以在ipsec.conf中添加plutodebug=all启用Pluto(IKE守护进程)诊断功能,如果出现严重的问题,比如执行或协同工作的问题,你甚至可以添加klipsdebug=all启用KLIPS(内核)诊断功能。这也将显示被内核默默地丢弃的数据包。激活这些设置需要重新启动Pluto。更多的信息请参考FreeS/WAN Troubleshooting Guide(http://www.freeswan.org/freeswan_snaps/CURRENT-SNAP/doc/trouble.html)。不要在产品安装中使用这些设置,因为它们非常容易让坏家伙进行DOS(Denial Of Service)攻击。
如果你的IPsec能工作,但你仍不能登录,你也许需要看一下L2TP和PPP错误信息,它们保存在/var/log/messages。但不是所有的错误信息都记录在这里,Mandrake把详细诊断信息记录在/var/log/deamons/*。在RedHat上,你可以修改/etc/syslogd.conf并且在包含/var/log/messages的这行增加“*.debug;”来增大诊断等级,然后输入service syslog restart来重新启动系统日志服务(syslogd)。
22.3 网关不可到达
如果你使用KLIPS并且得到下面的错误:
route-host output: /usr/lib/ipsec/_updown: doroute `ip route add x.x.x.x/32 via x.x.x.x dev ipsec0 ' failed
(RTNETLINK answers: Network is unreachable)
这意味着数据包不能路由到适当的ipsecN接口,因此它们没有被KLIPS处理。你可以在Openswan的配置文件中增加额外的一行来解决这个问题。如:
conn L2TP-CERT
        authby=rsasig
        pfs=no
        left=123.123.123.123
        leftnexthop=<IP_address_of_your_gateway>;
        leftrsasigkey=%cert
        leftcert=/etc/ipsec.d/ssl/localCERT.pem
        etc.
如果你用26sec代替KLIPS的话就没有ipsecN接口,所以从理论上说“leftnexthop”参数不会工作,但我注意到,当Openswan服务器位于NAT后面时需要使用这个参数。 
22.4 战神攻击
如果tcpdump显示Linux服务器看起来没有对来自Windows/Mac客户端的数据包做出响应,那么可能没有禁用反向路径过滤(Reverse Path Filtering)。如果你在/var/log/messages里看到这样:
martian destination 127.0.0.1 from 192.168.0.222, dev ipsec0
martian source 192.168.0.200 from 192.168.0.222, on dev eth0
ll header: 00:00:00:00:00:00:00:40:33:2c:70:c8:08:00
那么你需要清空rp_filter。如果在/var/log/messages向回翻,你可以看到FreeS/WAN有这样的提示:
ipsec_setup: (/proc/sys/net/ipv4/conf/eth0/rp_filter = `1', should be 0)
如是eth0设备,使用echo 0 >; /proc/ss/net/ipv4/conf/eth0/rp_filter可以快速修复这个问题。作为选择,你可以在/etc/sysctl.conf中添加net.ipv4.conf.default.rp_filter=0。
22.5 Windows诊断
另外,你可以检查Windows客户端的日志,我对在Windows上的错误信息没有较好的印象,我发现Linux端的论断信息(Openswan、l2tpd、pppd)更加有用。下面有两篇微软的关于启用Windows 2000/XP的IPsec和PPP日志功能的文章:
启用对IKE商议详细过程日志(http://www.microsoft.com/technet/prodtechnol/windowsserver2003/proddocs/standard/sag_ipsec_tools.asp)。
HOW TO:在Windows上启用PPP日志(Q234014)(http://support.microsoft.com/default.aspx?scid=kb;en-us;234014)。(技巧:set tracing * enable将记录更多)
如果你为IPsec和PPP启用日志,你将分别得到OAKLEY.LOG和PPP.LOG文件。PPP.LOG不总是有用,因为很多细节被记录成十六进制转储的二进制。你可以使用Windows 2000 Professional的网络监视器(Network Monitor)检查客户端和服务器之间的通信。Windows XP没有带网络监视器,但你可以安装网络监视器驱动程序(Network Monitor Driver)然后使用Netcap把通信过程写入一个文件,这个文件可以被Windows 2000的网络监视器或像Ethereal这样的软件分析。
悲哀的是在Windows的比较晦涩的错误信息中很难找到好的信息,例如,一次想连接到一个Windows服务器,但是失败了,启用IKE踊跃后,OAKLEY.LOG显示出这些错误:
7-26: 13:50:20:656:1e4 Policy mismatch on offer method 1 policy method 1
7-26: 13:50:20:656:1e4 Attribute Phase II Diffie-Hellman group descriptor
7-26: 13:50:20:656:1e4      Expected: 0
7-26: 13:50:20:656:1e4      Received: 2
它简单地意味着Windows不想用FPS,但另外一端使用了PFS(DH Group2),当我在另一端禁用PFS后,你在哪里可以发现这些论断信息?你告诉我……
MSL2TP客户端更多的“发现并修理故障”信息在“Administrator’s Guide to Microsoft L2TP/IPsec VPN Client”( http://www.microsoft.com/technet/itsolutions/network/maintain/security/vpnclnta.asp或者http://www.microsoft.com/windows2000/docs/VPNClient_AdminGuide.doc)。你应该做的一件是是:在MSL2TP客户端启用日志。“开始”菜单里有一个目录“Microsoft L2TP/IPSec VPN Client”,这个目录里的有一个L2TPConfig.exe(称为:Microsoft IPsec VPN Configuration),里面有一个设置“Enable IPsec logging”,然后它会在C:\Program Files\Microsoft IPSec VPN Client目录下创建一个名为Isakmp.log的日志文件。在微软TechNet的Cable Guy(http://www.microsoft.com/technet/columns/cableguy/cg0502.asp)也有这方面的诊断技巧。如果你用的是Windows 2000/XP,下面的微软知识库文档也许有用:
Basic L2TP/IPSec Troubleshooting in Windows XP
(http://support.microsoft.com/?kbid=314831)
Basic IPSec Troubleshooting in Windows 2000
(http://support.microsoft.com/?kbid=257225)
Basic IPSec Troubleshooting in Windows
(http://support.microsoft.com/?kbid=259335)
在VPN上DNS问题比较普遍,下面这个网站有解答这方面问题的技巧:http://www.tacteam.net/isaserverorg/vpnkitbeta2/dnsvpn.htm
23.1 证书
X.509证书可以像“预共享密钥”那样来使用。你需要设立多种公钥基础设施(PKI:Public Key Infrastructure)来为Openswan主机和Windows IPsec客户端创建私有密钥和X.509证书。
不要忘了,一旦你开始使用证书,就要禁用“预共享密钥”配置文件。如果“预共享密钥”和证书配置文件在同一个客户端(或IP地址)上,将会把Openswan搞混。“预共享密钥”配置将优先。如果你需要证书和“预共享密钥”为Road Warriors同时工作,请参考Sverre Gunnersen的使用说明(http://www.nthdegree.com.au/sverre/publications/141004.html)。
OpenSSL是生成证书的常见选择,因为它是开放源代码的并且自由使用,
应避免在证书中使用特殊字符。像OpenCA、TinyCA、IDX-PKI这样的软件在建立“认证中心”时非常有用。作为选择,你可以购买一些软件来生成证书。Windows NT/2000/2003带了“认证中心”软件。SSH销售Certifier,一个“在管理服务提供者和企业环境发布和管理数字证书的PKI平台产品”。还有许多像Verisign和Baltimore等厂商。
任一种方法,最终都将得到PKCS#12格式的证书。PKCS#12是一个发布密钥和证书的标准。PKCS#12文件的扩展名为.p12或.pfx,包含了客户端的私有密钥,相应的证书和根CA的证书(甚至可能是一个CA证书链)。既然它包含了客户端的私有密钥,PKCS#12文件被使用口令加密。记住,客户端证书不得不通过相同的“认证中心”签名,像Openswan的证书一样。
在Windows 2000/XP下使用MMC(Microsoft Management Console)为L2TP/IPsec导入证书。因为Windows 95/98/Me没有带MMC,只好在Internet Explorer中导入PKCS#12文件,也就是在“工具”——“Internet 选项”下的“保存证书”。OpenSSL命名文件的扩展名是.p12,介是Internet Explorer只识别扩展名为.pfx文件,所以必须选择“显示所有文件”,然后再导入.p12文件。一旦证书(带机器的私有密钥)被导入到Internet Explorer中,它也适用于MSL2TP客户端。
Windows 2000/2003 Server包含的CA,对证书支持 “增强型密钥用法”(EKU:Enhanced Key Usages)属性。这些EKU限制证书,所以它只能用到IPsec连接。其它用途(比如,用到WEB服务器)则不允许,这为服务器的PKI增加了一点额外的安全。如果你使用OpenSSL,你大概也可以建立带这些EKU属性的证书。
有一份Bugtraq邮件列表报告部分IPsec执行者有 “潜在的中间人攻击”(potential Man-in-the-Middle vulnerability)。如果客户端证书受到危害(这不太困难,例如手提电脑被盗),它可能被攻击者用来为第二台客户端伪造一个服务器证书,毕竟第一台客户端受到危害的证书是由CA发布的有效证书。可以在FreeS/WAN的邮件列中找到更多的信息。
23.2 在智能卡上的证书
为了额外的安全,证书可以存储在智能卡上(包括USB token)。在MSL2TP客户端上已经测试过了,并且它可以工作。当我开始连接时,它提示需要Ikey 2032 token的PIN号码,于是建立起连接。SSH Sentinel也应该能工作(它有一个称为Accession Lite的seperate智能卡应用程序),但有点与IKey驱动不兼容。Windows 2000/XP自带的IPsec客户端使用智能卡可能有问题,好象没有办法将“本地计算机证书”保存到USB token上。根据微软的文档,它可以指定不同的“密码服务提供者”(CSP:Cryptographic Service Provider),比如某个能支持你智能卡或USB token的,但仅当你通过WEB接口(“web enrollment”)申请证书,不是当你通过一个PKCS#12格式的文件导入你的证书。
24 保护无线连接
WEP加密算法是无线802.11标准(WiFi)的一部分,它完全可以被破解。任何小孩用像Airsnorp这样的工具都可以破解WEP口令,只要他有足够的时间来收集确定数量的数据包。另一个问题是发布WEP密钥没有很好的等级,比如你正好多了一些用户。许多无线访问节点(access point)有额外的安全方法(比如SSID认证,禁用SSID广播和基于MAC地址的访问控制),但这仍然不牢固,利用Airsnort或Kismet等工具很容易被绕过。一些人提议用像IPsec或PPTP这样的VPN协议代替WEP,这些协议时间上经受了考验,并且它们的安全性也很被大家所熟悉。很明显,你不应该只依靠WEP。
在无线连接上运行VPN的问题是,不能被阻止坏家伙们访问你的无线网络,他们仍可以做像攻击访问节点(AP:access point)或无线客户端的下流事情。如果一个用户的工作站没有被安全保护,通过无线连接它可以被黑客或病毒利用,例如:工作站可能开有端口,文件和打印共享没有被关闭,没有安装个人防火墙或缺少安全补丁。WEP和它的继承者如WPA、802.1x、EAP/LEAP/PEAP和802.11x防止没有正确的证书的人加入你的无线网络。微软为Windows XP/2003中的无线网络积极推行PEAP,因此,如果你没有使用一个好的无线安全协议(WEP不算在内),在客户端工作站上至少安装一个个人防火墙和可以防病毒的软件是明智的。
IPsec支持“预共享密钥”和证书。如果用户比较少“预共享密钥”比较容易使用,但劣势是用户必须有固定(静态)IP地址。幸运的是,RFC 1918范围的固定地址(192.168.x.x、10.x.x.x等)可以分配给无线用户。有一个例外:使用Windows 2000的“新建连接向导”不能工作,因为这个“向导”不支持“预共享密钥”。
另一个需要密切注意的事情是,如果VPN连接停止,明显地客户端应该不能访问你被保护的网络。这种说法是愚蠢的,如果你打开IP传送(IP forwarding),从无线网络来的数据包将被恰当地传送到你的内部网络。请确信为无线网络建立了防火墙或仅为内网地址配置IP传送。
在基于802.11标准的无线网络中从一个访问节点到另一个访问节点漫游时是一个普遍的问题,如果我没有犯错的话,无线连接将断开连接,这意味着IPsec连接也将断开连接,因为新的访问节点也许分发了一个新的IP地址。可是在L2TP标准中规定应该快速重新连接,但我不知道它和Openswan和l2tpd之间工作的如何。
在无线网络上的最初测试没有像一般的网络(比如:在以太岗上)那样出现较多的MTU大小问题,复杂因素大概是内建的L2TP/IPsec客户端从丢失的数据包中不能很好的恢复。
德国Stuttgart的学生在他们的宿舍里的无线网络上使用了Linksys WRT54g路由器和一个中枢FreeS/WAN服务器,通过FreeRADIUS进行认证。
25 Linux作为一个L2TP/IPsec客户端
可能有这种情况,你希望使用Linux作为一个客户端连接到一个L2TP/IPsec VPN服务器(比如Windows 2000/2003),这些情况下多数不是真正需要L2TP的,简单的IPsec应该足够了,并且Linux支持它。实际上,在Linux客户端上使用L2TP会使事情变得复杂。但实际情况是你不能绕过它,比如,L2TP/IPsec VPN服务器的管理员会拒绝容纳Linux用户。我没有设法把Linux当作L2TP/IPsec客户端,也许它可以工作。我希望它像上面所说的配置L2TP/IPsec服务器那样相似。主要的差异大概是在l2tpd.conf中加入一个“client”节。
; Connect as a client to a server at 123.123.123.123
[lac windowsVPNserver]
lns = 123.123.123.123
; (rest of the parameters similar to the [lns default] section)
同样可能也要使用pppd的“usepeerdns”参数。Openswan的配置大概不需要改变。但开始一个到L2TP/IPsec服务器的连接将会清楚,比如:用命令:ipsec auto –up L2TP-CERT。
一旦IPsec连接启动,L2TP连接将(用类似下面的方法)被启动。
echo “c windowVPNserver” >; /var/run/l2tp-control
参考包含在l2tpd中的README获取关于L2TP连接的更多细节(less `rpm –ql l2tpd | grep \/README`)。默认情况下l2tpd监听所有接口,如果你想使用Linux作为L2TP/IPsec客户端,看来不需要把l2tpd 也作为一个服务运行。你可以使用“listen-addr”参数将它只绑定到内网接口,避免L2TP服务完全暴露在外部。
26 这完全是思考,但是……
微软大概也试着把IPsec协议作为商品,所以支持它并扩充了由微软和Cisco开发的L2TP协议。微软把L2TP当成一个VPN协议来书写,比如:在微软的FAQ上有这样的对话:
问:我可以使用PPTP或L2TP吗?
答:L2TP被认为是比PPTP更安全并且允许你同第三方互相协同工作。
他们说的“L2TP”实际上是“L2TP/IPsec”,在L2TP/IPsec连接中是IPsec提供机密性和认证。看起来他们想把公众的注意力从IPsec(许多厂商拥有几个执行者)转移到L2TP(没有那么的产品可用)。另外,没有任何人愿意使用L2TP。它导致了“双重隧道”(额外的信息包顶部装置)并且大概只有一种手段进行额外的认证(当然,更适宜依靠NT SAM用户数据库,这意味着购买更多的Windows客户访问许可)。
我有一点迷惑,为什么微软发布MSL2TP客户端。他们最近已经停止了对“老版本”Windows的支持,而且这时候他们发布一个甚至能运行在Windows 95上的软件。说得更广一点,发布免费的MSL2T,也因SafeNet正在蚕食它自己的第三方Windows IPsec客户端市场,引起了它的注意。
我也同意这样的观点:MSL2TP客户端是由SafeNet为微软开发的,Windows 2000/XP、Pkcket PC 2003的IKE/IPsec支持是和Cisco共同开发的,这显示出微软在内部全部的开发中所做的,没有足够高的优先权。


 QUSHIQIANG 回复于:2005-06-04 17:29:04

原文:http://www.funknet.org/doc/tunnel/l2tp.xml

本人初中毕业,请不要嘲笑我的英文水平!

绪论
本文描述了如何为IPsec/L2TP客户端建立一个VPN网关,例如:Windows 2000/XP内建的客户端、MSL2TP客户端、MacOS10.3的VPN客户端。
这里的许多信息来自于Jacco de Leeuw描写的使用Linx 2.4、FreeS/WAN和l2tpd。这里使用Linux 2.6,因此一些IPsec细节不同,防火墙需求也不同。
2.6内核
在内核中需要以下几部分:
CONFIG_INET_ESP=m
CONFIG_NET_KEY=m
CONFIG_CRYPTO_HMAC=y
CONFIG_CRYPTO_MD5=m
CONFIG_CRYPTO_SHA1=m
CONFIG_CRYPTO_DES=m
当然,你也需要常用的网络选项,包括netfilter。
IPsec tools - racoon和setkey
对于使用预共享密钥(好斗模式)的Road Warrior VPN客户端,racoon.conf需要这样:
log debug;
path pre_shared_key "/etc/racoon/psk.txt";
 
listen {
        isakmp a.b.c.d [500];
}
 
padding
{
        maximum_length 20;      # maximum padding length.
        randomize off;          # enable randomize length.
        strict_check off;       # enable strict check.
        exclusive_tail off;     # extract last one octet.
}
 
remote anonymous {
        exchange_mode aggressive,main;
        doi ipsec_doi;
        situation identity_only;
        generate_policy on;
        proposal_check obey;
 
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method pre_shared_key;
                dh_group modp1024;
        }
}
 
sainfo anonymous {
        lifetime time 28800 sec;
        encryption_algorithm 3des ;
        authentication_algorithm hmac_md5;
        compression_algorithm deflate ;
}
把a.b.c.d换成网关的公网IP地址。
在Road Warrior可以使用主模块(main mode)的情况下,也可以使用X.509证书。注:racoon不能让你指定私钥口令(passphrase),因此在这里你需要为你的密钥生成一个无口令(passphraseless)版本。
remote anonymous {
        exchange_mode main;
        doi ipsec_doi;
        situation identity_only;
        generate_policy on;
 
        my_identifier asn1dn;
        peers_identifier asn1dn;
        verify_identifier on;
        certificate_type x509 "mygateway.pem" "mygateway.key.un";
 
        proposal {
                encryption_algorithm 3des;
                hash_algorithm sha1;
                authentication_method rsasig;
                dh_group modp1024;
        }
}
 
sainfo anonymous {
        lifetime time 28800 sec;
        encryption_algorithm 3des ;
        authentication_algorithm hmac_md5;
        compression_algorithm deflate ;
}
看起来在同一个配置文件中指定两种选项不是一个容易的方法,在我的试验中,如果rsasig像一个选项一样可用,那么客户端试着进行预共享密(Pre-Shared Keys)将被拒绝。
声明IPsec策略
当racoon将为Road Warrior连接生成需要的策略部分时候,其它的策略需要用setkey设置。我创建了一个文件/etc/init.d/ipsec-policy,而且如果esp4模块没有自动加载的话也趁机加载了,还除去了任意以前存在的IPsec策略。把a.b.c.d换你网关的公网IP地址。
#!/bin/sh
/usr/sbin/setkey -FP
/usr/sbin/setkey -F
/usr/sbin/setkey -c << EOF
 
spdadd a.b.c.d[1701] 0.0.0.0/0[0] any
   -P out ipsec esp/transport//require ;
 
EOF
得到已经加载的esp模块
为了实现esp模块自动加载,下面几行涉及到的esp4需要写入/etc/modprobe.conf中。全套的ipsec模块要完全显示。
alias xfrm-type-2-50 esp4
alias xfrm-type-2-51 ah4
alias xfrm-type-2-108 ipcomp
alias xfrm-type-10-50 esp6
alias xfrm-type-10-51 ah6
alias xfrm-type-10-108 ipcomp6
l2tpd
我使用了Jacco的l2tpd rpm,l2tpd的非稳定版和Windows XP之间确实有一个“loopback”问题,所以我使用了这个l2tpd.conf:
[global]
port = 1701
 
[lns default]
ip range = 10.1.161.1 - 10.1.163.254
local ip = 10.1.160.2
require chap = yes
refuse pap = yes
require authentication = yes
hostname = LinuxVPNserver
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd
length bit = yes
我的/etc/ppp/options.l2tpd:
ipcp-accept-local
ipcp-accept-remote
ms-dns  10.1.128.171
ms-wins 10.1.96.3
auth
crtscts
idle 1800
mtu 1400
mru 1400
nodefaultroute
nodetach 
debug
lock
#proxyarp
connect-delay 5000
注:在这种情况下我不使用ARP代理(我不希望VPN客户端可以访问网关所在的局域网上——客户端使用其它的IPsec隧道)。但是如果你需要ppp这样做,你应该在这里指定。
PPP chat-secrets文件应该包含你的PPP认证密钥——Windows将询问用户的用户名和口令。
# Secrets for authentication using CHAP
# client        server  secret                  IP addresses
*               xpuser  "sekrit"                10.1.161.0/24
xpuser          *       "sekrit"                10.1.161.0/24
防火墙
像Linux 2.6的KAME IPsec不提供ipsec0样式的接口,同样像FreeS/WAN、iptables的安装也不同,因此我们试着完成同样的效果——禁止未解密的数据包访问L2TP守护进程。
我们使用iptables的“fwmark”匹配来完成——把数据包作一个标记,从它加密后一直到解密后保持不变,我们可以它来确定哪些数据包是通过IPsec SA到达的。“mark”是在内核里的,不能用于离开系统的数据包,因此用这个匹配是安全的。
iptables -t mangle -A PREROUTING -i eth0 -p esp -j MARK --set-mark 1
iptables -A INPUT -i eth0 -m mark --mark 1 -j ACCEPT
 
iptables -A OUTPUT -s a.b.c.d -p udp -m udp --sport 1701 -j ACCEPT 
 
iptables -A INPUT -p esp -j ACCEPT 
iptables -A OUTPUT -p esp -j ACCEPT 
 
iptables -A INPUT -d a.b.c.d -p udp -m udp --dport 500 -j ACCEPT 
iptables -A OUTPUT -s a.b.c.d -p udp -m udp --sport 500 -j ACCEPT
把a.b.c.d换你网关的公网IP地址。
突出的问题
用证书和预共享密钥共同访问。


 QUSHIQIANG 回复于:2005-06-04 17:30:47

本人初中毕业,不要嘲笑我的英文水平。

需求
要配置“网络到网络”的连接你必须有:
两个有固定IP地址的Linux网关。
一个位于每个网关后面的网络,网络上没有重叠IP范围。
两个网关上必须都安装FreeS/WAN
在本地网关上有tcpdump等软件,用来测试连接。
为Road Warrior配置,你需要:
一个有固定IP地址的Linux机器
一个动态IP的Linux笔记本电脑
两台计算机上都安装FreeS/WAN
在两台计算机的任意一台上安装tcpdump,用来测试连接。
如果两台计算机都是动态IP地址,这种情况比较棘手。
网络到网络的连接
对于每个网关,收集下面这些信息:
&#8226; 网关的IP地址
&#8226; 用保护的网络的IP地址范围。这肯定不是你的整个物理网络。
&#8226; 网关的名字,在IPsec商议过程中用来识别网关自己。它的格式是一个完全合格的域名(Fully Qualified Domain Name)加上一个@符号。比如@xy.example.com。
这不一定要求在你现有的域中,它可以是一个捏造(made-up)的名字。
获得leftrsasigkey
在你的本地Linux FreeS/WAN网关上打印你的IPsec公钥。
ipsec showhostkey --left
输出结果应该像这样(为了便于阅读,缩短了密钥长度)。
# RSA 2048 bits   xy.example.com   Fri Apr 26 15:01:41 2002
leftrsasigkey=0sAQOnwiBPt...
没有密钥?使用ipsec newhostkey创建一个吧!
然后是rightrsasingkey
获得远程计算机的控制权:
ssh2 ab.example.com
在那个窗口中输入:
ipsec showhostkey --right
你将看到像下面这样的输出:
# RSA 2192 bits   ab.example.com   Thu May 16 15:26:20 2002
rightrsasigkey=0sAQOqH55O...
编辑/etc/ipsec.conf
返回本地网关,复制样本到/etc/ipsec.conf。用你收集的信息替换样本中的数据。
conn net-to-net
    left=192.0.2.2                 # Local vitals
    leftsubnet=192.0.2.128/29      # 
    leftid=@xy.example.com         #   
    leftrsasigkey=0s1LgR7/oUM...   #
    leftnexthop=%defaultroute      # correct in many situations 
    right=192.0.2.9                # Remote vitals
    rightsubnet=10.0.0.0/24        #
    rightid=@ab.example.com        # 
    rightrsasigkey=0sAQOqH55O...   #
    rightnexthop=%defaultroute     # correct in many situations
    auto=add                       # authorizes but doesn't start this 
                                   # connection at startup
“Left”和“Right”代表安装FreeS/WAN软件的机器,“leftsubnet”和“rightsubnet”代表被保护的计算机。/32为left/right和left/rightsubnet指定的参数。
把conn net-to-net复制到另一端的/etc/ipsec.conf。如果你没对两个ipsec.conf有做额外的修改,简单地复制即可:
scp2 ipsec.conf root@ab.example.com:/etc/ipsec.conf
开始连接
在本地输入
ipsec auto –up net-to-net
你应该看到这样的信息:
104 "net-net" #223: STATE_MAIN_I1: initiate
106 "net-net" #223: STATE_MAIN_I2: sent MI2, expecting MR2
108 "net-net" #223: STATE_MAIN_I3: sent MI3, expecting MR3
004 "net-net" #223: STATE_MAIN_I4: ISAKMP SA established
112 "net-net" #224: STATE_QUICK_I1: initiate
004 "net-net" #224: STATE_QUICK_I2: sent QI2, IPsec SA established
重要的事是IPsec SA被确定,即:IPsec SA established。
不要对通过隧道的数据包伪装或地址转换
如果你任意一个网关上使用IP伪装(IP masquerade)或网络地址转换(NAT:Network Address Translation),你现在必须避免对想通过隧道传输的数据包进行这样的处理。例如,你有这样的规则:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE
应该改成这样:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -d \! 192.0.2.128/29 -j MASQUERADE
每个网关上都必须这样做。
测试连接
在本地子网的任意一个节点上(不能在网关上)ping另一个子网中的任意一个节点(同样不能是网关)。
ping fileserver.toledo.example.com
继续ping,到本地网关上嗅探输出接口,例如:
tcpdump –i ppp0
你应该看到在两个网关之间来来回回的ESP(Encapsulating Security Payload)数据包,频率就像你ping的一样。
19:16:32.046220 192.0.2.2 >; 192.0.2.9: ESP(spi=0x3be6c4dc,seq=0x3)
19:16:32.085630 192.0.2.9 >; 192.0.2.2: ESP(spi=0x5fdd1cf8,seq=0x6)
如果看到了,说明已经成功地建立了一个用来保护从一个子网到另一个子网任意IP数据的隧道,就像它通过了两个网关。
注:这个隧道只能保护网络到网络(net-net)的通信,不是网关到网关(gateway-getway)或网关到网络(gateway-subnet),如果需要这样配置(例如,如果在一个网络上的机器需要安全地访问在IPsec网关上的文件服务器),需要创建额外的连接。
完成后
连接正常工作后,把它命名为有意义的名字,例如:
conn winstonnet-toledonet
如果让隧道一启动就运行,把auto=add换成auto=start。
把这些变动复制到另外一端:
scp2 ipsec.conf root@ab.example.com:/etc/ipsec.conf
配置Road Warrior
需要收集的信息:
&#8226; 网关的静态IP地址。
&#8226; 网关后面子网的IP范围。
&#8226; 在IPsec商谈过程中双方可以识别自己的名字。它的格式是一个完全合格的域名(Fully Qualified Domain Name)加上一个@符号。比如@xy.example.com。
这不一定要求在你现有的域中,它可以是一个捏造(made-up)的名字。
获得leftrsasigkey
在你的笔记本电脑打印你的IPsec公钥。
ipsec showhostkey --left
输出结果应该像这样(为了便于阅读,缩短了密钥长度)。
# RSA 2048 bits   xy.example.com   Fri Apr 26 15:01:41 2002
leftrsasigkey=0sAQOnwiBPt...
没有密钥?使用ipsec newhostkey创建一个吧!
然后是rightrsasingkey
获得远程计算机的控制权:
ssh2 ab.example.com
查看网关的公钥:
ipsec showhostkey --right
你将看到像下面这样的输出:
# RSA 2048 bits   xy.example.com   Fri Apr 26 15:01:41 2002
rightrsasigkey=0sAQOnwiBPt...
定制/etc/ipsec.conf
在你的笔记本电脑上,复制样本到/etc/ipsec.conf。用你收集的信息替换样本中的数据。
conn road
    left=%defaultroute             # Picks up our dynamic IP 
    leftnexthop=%defaultroute      # 
    leftid=@road.example.com       # Local information
    leftrsasigkey=0sAQPIPN9uI...   #
    right=192.0.2.10               # Remote information
    rightsubnet=10.0.0.0/24        #
    rightid=@xy.example.com        # 
    rightrsasigkey=0sAQOnwiBPt...  #
    auto=add                       # authorizes but doesn't start this
                                   # connection at startup
这个模板与网关的不同。注意:它的“Left”和“Right”相反,与我们的习惯一致,Left代表本地(Left is Local),Right代表远程(Right is Remote)。确认rsasigkey与它保持一致。
ssh2 xy.example.com
vi /etc/ipsec.conf
增加:
conn road
    left=192.0.2.2                 # Gateway's information
    leftid=@xy.example.com         #
    leftsubnet=192.0.2.128/29      #
    leftrsasigkey=0sAQOnwiBPt...   #
    rightnexthop=%defaultroute     # correct in many situations
    right=%any                     # Wildcard: we don't know the laptop's IP
    rightid=@road.example.com      #
    rightrsasigkey=0sAQPIPN9uI...  #
    auto=add                       # authorizes but doesn't start this
                                   # connection at startup
开始连接
你必须从Road Warrior这一端启动连接,在笔记本电脑上输入:
ipsec auto –start net-to-net
你应该看到这样的信息:
104 "net-net" #223: STATE_MAIN_I1: initiate
106 "road" #301: STATE_MAIN_I2: sent MI2, expecting MR2
108 "road" #301: STATE_MAIN_I3: sent MI3, expecting MR3
004 "road" #301: STATE_MAIN_I4: ISAKMP SA established
112 "road" #302: STATE_QUICK_I1: initiate
004 "road" #302: STATE_QUICK_I2: sent QI2, IPsec SA established
重要的事是IPsec SA被确定,即:IPsec SA established。
不要对通过隧道的数据包伪装或地址转换
如果你任意一个网关上使用IP伪装(IP masquerade)或网络地址转换(NAT:Network Address Translation),你现在必须避免对想通过隧道传输的数据包进行这样的处理。例如,你有这样的规则:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -j MASQUERADE
应该改成这样:
iptables -t nat -A POSTROUTING -o eth0 -s 10.0.0.0/24 -d \! 192.0.2.128/29 -j MASQUERADE
测试连接
从笔记本电脑上ping位于网关后子网中的任意一个节点。不要选择网关自己做这个测试。
ping ns.winston.example.com
嗅探笔记本电脑输出的数据包,例如:
tcpdump –i wlan0
你看到了两个方向的ESP(Encapsulating Security Payload)数据包: 
19:16:32.046220 192.0.2.2 >; 192.0.2.9: ESP(spi=0x3be6c4dc,seq=0x3)
19:16:32.085630 192.0.2.9 >; 192.0.2.2: ESP(spi=0x5fdd1cf8,seq=0x6)
如果看到了,说明Road Warrior与位于网关后面网络的通信被保护。
注:这个新隧道只能保护地址到网络(addressed to the net)的通信,不是IPsec网关自身,如果需要后者,需要创建额外的隧道。
完成后
连接正常工作后,把它命名为有意义的名字,例如:
conn mike-to-office
如果让隧道一启动就运行,只要在笔记电脑上把auto=add换成auto=start。
多个Road Warrior
如果你使用RSA密钥,就像上面的示例,只要你愿意,你可以增加许多Road Warrior。left/rightid参数使Linux FreeS/WAN区别多个Road Warrior,每个都有自己的公钥。
这种情况与预共享密钥(PSK)不同,在一个PSK商谈过程中,当Pluto试着决定哪个密钥可用时,ID信息不可用,因此,你可以只定义一个Road Warrior连接,因此,所有的PSK Road Warrior必须共享一个密钥。
还能做什么?
用这里的法则,你要以变化出不同的情况,如:
&#8226; 静态IP地址的远程工作者。
&#8226; 位于一个子网的Road Warrior。


 QUSHIQIANG 回复于:2005-06-04 17:33:18

希望朋友们继续将其它相关文章翻译出来。


 visualj 回复于:2005-07-14 09:37:19

初中生能这样很不错了! 哈哈


 hongfengyue 回复于:2005-09-13 12:28:03

非常感谢,谢谢!


 zhongzhiwen4321 回复于:2005-09-13 22:00:00

继续努力呀,


 phpman 回复于:2005-09-13 23:26:43

努力


 xiaofeng2008 回复于:2005-09-29 10:24:21

very good!
excellent


 admstep 回复于:2005-09-29 16:52:58

楼主如果真是初中毕业,真的佩服了 
==========
能力比学历重要  精神比能力重要


 soway 回复于:2005-09-30 08:35:24

对文章不说什么

只是从楼主学习能力和精神方面来说,你很不错。


 hongfengyue 回复于:2005-09-30 13:24:41

引用:原帖由 "soway" 发表:
对文章不说什么




兄弟意犹未尽啊,对文章的内容有意见和建议提出来方便大家共同学习嘛 :lol:  :lol:


 潸然 回复于:2005-11-06 09:58:29

支持一下


 dragondillon 回复于:2005-11-07 11:55:01

顶顶顶


 cncswzq 回复于:2005-11-23 11:27:34

:em02:我要坚决上来顶一下!!谢谢楼主!还有你谦虚幽默的作风。


 linuxguan 回复于:2005-12-11 10:40:14

请问搂主,为什么在使用了IPsec协议之后,还需要一个二层的l2tp协议,我有点糊涂了!我的理解是在linux服务器上安装2.6内核,openswan或strongswan,然后进行配置就行了吧,在Windows客户端还需要配置吗


 cnhero 回复于:2005-12-14 10:48:44

引用:原帖由 linuxguan 于 2005-12-11 10:40 发表
请问搂主,为什么在使用了IPsec协议之后,还需要一个二层的l2tp协议,我有点糊涂了!我的理解是在linux服务器上安装2.6内核,openswan或strongswan,然后进行配置就行了吧,在Windows客户端还需要配置吗 



我也有这个疑问。

我看过原版的文章,12月12日更新的,还说LINUX上的 L2TP/IPSEC 还是实验阶段呢。

只用IPSEC 有什么缺陷吗?


 QUSHIQIANG 回复于:2005-12-14 10:57:53

使用L2TP的主要是原因是兼容Windows客户端,Windows下的客户端没有办法做到L2TP/IPsec的分离,
Windows 下的客户端是这样使用IPsec的,先把需要传送的数据包用PPP协议封装,然后再把这个PPP包用L2TP协议封装进UDP数据包,最后用IPsec协议再次封装数据包(如果需要NAT-T,还要再把这个IPsec数据包再次封装到UDP协议中,用普通IP协议传送)。解包过程正好相反。

[ 本帖最后由 QUSHIQIANG 于 2005-12-14 11:07 编辑 ]


 cnhero 回复于:2005-12-14 11:04:07

引用:原帖由 QUSHIQIANG 于 2005-12-14 10:57 发表
主要是因为客户端的问题,Windows下的客户端没有办法做到L2TP/IPsec的分离。
Windows 下的客户端是这样使用IPsec的,先把数据包用PPP协议封装,然后再把这个PPP包用L2TP协议封装进UDP数据包,最后再用IPsec协议再 ... 



原来如此!
多谢!


 redsnow 回复于:2005-12-20 14:45:58

正需要中文的文档,多谢多谢


 smallfish 回复于:2005-12-21 11:56:12

楼主精华可佳,佩服!


 mxli 回复于:2005-12-27 14:58:20

真厉害,看到这么长的文章我就晕了~~~强烈支持一下


 QUSHIQIANG 回复于:2005-12-28 10:50:55

25 Linux作为一个L2TP/IPsec客户端
可能有这种情况,你希望使用Linux作为一个客户端连接到一个L2TP/IPsec VPN服务器(比如Windows 2000/2003)。首先请确认你确实需要使用L2TP/IPsec,你是否可以使用单纯的IPsec替代它?在Linux下使用单纯的IPsec更加简单,Linux从内部支持它。Linux客户端使用L2TP只会使事情更加复杂。不过,这样的情况你也许无法绕过它,比如:出于某种策略上的原因,L2TP/IPsec VPN服务器管理员会简单地拒绝支持单纯的IPsec。
假如你使用Linux作为L2TP/IPsec VPN客户端需要截然不同的两个阶段,首先连接到IPsec服务器,然后再通过IPsec隧道连接到L2TP服务器。在Linux下把Openswan配置成客户端与前边提到的配置成服务端稍微有些不同。
# Configuration for connecting to an L2TP/IPsec server,
# for example Windows 2003 Server.
#
# Authenticates through certificates. The Linux client can be
# behind NAT or not.

conn L2TP-CERT-CLIENT
        #
        # Configuration for clients that are not behind NAT.
        # ----------------------------------------------------------
        # Use certificates. Disable Perfect Forward Secrecy.
        # Respond to rekeying requests but do not initiate rekeying.
        # Connection type _must_ be Transport Mode.
        #
        authby=rsasig
        pfs=no
        rekey=no
        keyingtries=3
        type=transport
        #
        # ----------------------------------------------------------
        # The local Linux machine that connects as a client.
        #
        # The external network interface is used to connect to the server.
        # If you want to use a different interface or if there is no
        # defaultroute, you can use:   left=your.ip.addr.ess
        left=%defaultroute
        #
        # The certificate of this client.
        #
        leftcert=/etc/ipsec.d/certs/YourClientCertHere.pem
        leftrsasigkey=%cert
        leftprotoport=17/1701
        #
        # ----------------------------------------------------------
        # The remote server.
        #
        # Connect to the server with this IP address.
        right=123.123.123.123
        #
        # The server should the present the following certificate.
        rightcert=/etc/ipsec.d/certs/YourServerCertHere.pem
        rightrsasigkey=%cert
        rightca=%same
        rightprotoport=17/1701
        # ----------------------------------------------------------
        #
        # Change 'ignore' to 'add' to enable this configuration.
        #
        auto=ignore
在上边的例子中,想让服务器通过证书来进行验证,需要与包含在证书(YourServerCertHere.pem)中的ID完全相同的ID。还有另一种方法来验证服务器的证书,比如使用rightid=“CN=vpnserver.example.com”或rightid=“@vpnserver.example.com”来代替rightcert=这一行。另外,一旦你启用了这个配置文件,就可以使用下列命令启动IPsec连接:
ipsec auto --up L2TP-CERT-CLIENT
如果一切正常,你将可以从日志中看到类似下面的一些行:
"L2TP-CERT-CLIENT" #1: initiating Main Mode
"L2TP-CERT-CLIENT" #1: ignoring Vendor ID payload [MS NT5 ISAKMPOAKLEY 00000004]
"L2TP-CERT-CLIENT" #1: ignoring Vendor ID payload [FRAGMENTATION]
"L2TP-CERT-CLIENT" #1: received Vendor ID payload [draft-ietf-ipsec-nat-t-ike-02_n] method set to=106
"L2TP-CERT-CLIENT" #1: enabling possible NAT-traversal with method RFC 3947 (NAT-Traversal)
"L2TP-CERT-CLIENT" #1: transition from state STATE_MAIN_I1 to state STATE_MAIN_I2
"L2TP-CERT-CLIENT" #1: STATE_MAIN_I2: sent MI2, expecting MR2
"L2TP-CERT-CLIENT" #1: NAT-Traversal: Result using draft-ietf-ipsec-nat-t-ike-02/03: i am NATed
"L2TP-CERT-CLIENT" #1: I am sending my cert
"L2TP-CERT-CLIENT" #1: I am sending a certificate request
"L2TP-CERT-CLIENT" #1: transition from state STATE_MAIN_I2 to state STATE_MAIN_I3
"L2TP-CERT-CLIENT" #1: STATE_MAIN_I3: sent MI3, expecting MR3
"L2TP-CERT-CLIENT" #1: Main mode peer ID is ID_DER_ASN1_DN: 'C=NL, ST=ST, L=L,O=TESTORG, CN=duron'
"L2TP-CERT-CLIENT" #1: transition from state STATE_MAIN_I3 to state STATE_MAIN_I4
"L2TP-CERT-CLIENT" #1: STATE_MAIN_I4: ISAKMP SA established {auth=OAKLEY_RSA_SIG cipher=oakley_3des_cbc_192 prf=oakley_sha group=modp1024}
"L2TP-CERT-CLIENT" #2: initiating Quick Mode RSASIG+ENCRYPT+DONTREKEY+UP {using isakmp#1}
"L2TP-CERT-CLIENT" #2: IKE message has the Commit Flag set but Pluto doesn't implement this feature; ignoring flag
"L2TP-CERT-CLIENT" #2: ignoring informational payload, type IPSEC_RESPONDER_LIFETIME
"L2TP-CERT-CLIENT" #2: transition from state STATE_QUICK_I1 to state STATE_QUICK_I2
"L2TP-CERT-CLIENT" #2: STATE_QUICK_I2: sent QI2, IPsec SA established {ESP=>0x6f7e432c <0x43ccbfd7 xfrm=3DES_0-HMAC_SHA1 NATD=none DPD=none}
"L2TP-CERT-CLIENT" #2: IKE message has the Commit Flag set but Pluto doesn't implement this feature; ignoring flag
"L2TP-CERT-CLIENT" #2: message ignored because it contains an unexpected payload type (ISAKMP_NEXT_HASH)
"L2TP-CERT-CLIENT" #2: sending encrypted notification INVALID_PAYLOAD_TYPE to 192.168.0.200:4500
这里有一些错误,即使你已经拥有了一个可以工作的IPsec连接。下一步是使L2TP连接工作起来。首先,你需要在l2tpd.conf中增加“client”节。
; Connect as a client to a server at 123.123.123.123

[lac L2TPserver]
lns = 123.123.123.123
require chap = yes
refuse pap = yes
require authentication = yes
; Name should be the same as the username in the PPP authentication
name = jacco
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
看来,“name”是必须的,并且要与PPP认证中的用户名相同,即使这里没有L2TP认证。注:我分别为服务器配置和客户端配置创建了不同的pppd选项文件。如下是/etc/ppp/options.l2tpd.client的大致内容:
ipcp-accept-local
ipcp-accept-remote
refuse-eap
noccp
noauth
crtscts
idle 1800
mtu 1410
mru 1410
nodefaultroute
debug
lock
proxyarp
connect-delay 5000
“refuse-eap”和“noauth”这几行只能用到客户端配置文件“options.l2tpd”中,不能用到Linux服务器配置文件“options.l2tpd”中。默认情况下,Windows 2000/2003 Server会首先尝试使用EAP进行PPP认证,如果你不能(或不想)使用EAP(例如:你想使用CHAP或MS-CHAP代替它),你只有拒绝EAP,否则将开始EAP认证并且将会失败。“noauth”是必须的,因为Windows Server拒绝对它自己进行PPP认证。只有客肩必须认证。你可以随意增加参数“usepeerdns”,因此可以从远程PPP服务器得到两个DNS服务器的IP地址。
你运行下面的命令可以启动L2TP/PPP连接。
echo “c L2TPserver” > /var/run/l2tp-control
现在l2tpd作为一个客户端连接到远程L2TP服务器,L2TP数据包将通过IPsec隧道。通过网络嗅探器(比如:tcpdump,Ethereal等)验证客户端和服务器端之间的L2TP数据包被真正地加密。
当你想中断连接,使用下面的命令:
echo “d L2TPserver” > /var/run/l2tp-control
ipsec auto --down L2TP-CERT-CLIENT
参考l2tpd自带的README来了解更多更详细的L2TP连接。默认情况下,l2tpd监听所有接口。如果你想使用Linux作为L2TP/IPsec客户端,那么同时把l2tpd作为服务端来运行看起来是多余的。你可以通过使用“listen-addr”参数只绑定到内部接口或者干脆绑定到本地(127.0.0.1)来减少L2TP服务在外界的曝露。
一些L2TP执行者比如l2tpns不能作为客户端使用。




原文链接:http://bbs.chinaunix.net/viewthread.php?tid=556457
转载请注明作者名及原文出处



收藏本页到: