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

1 绪论
    这篇文章包含了如何使用微软、苹果或其它第三方厂商的L2TP/IPsec客户端来设置让Road Warrior连接到一个基于FreeS/WAN或后续软件的Linux服务器。
    IPsec是一个安全通信的网络协议。它是一个正式的互联网标准。不同厂家生产的客户端和设备应该能够协同工作(从理论上说),只要他们支持IPsec标准。
2 目录
绪论
目录
背景
过程概况
安全注意事项
×××的选择
用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是另一个广泛被用于×××的协议,但它不是一个正式的标准。
    使用L2TP协议意味着你将使用一个L2TP守护进程。有许多可以使用的L2TP守护进程。当Windows L2TP/IPsec客户端连接到你的Linux方法。默认情况下,L2TP守护进程监听UDP 1701端口,假如防火墙关闭, L2TP守护进程将暴露在外部接口。因此,不需要任何人通过Linux ×××服务器外部接口访问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连接。第五,在×××服务器前边放一个有防火墙(也可能是NAT)的路由器,并且允许 L2TP监听所有接口。后边两种方法依赖于防火墙,是一种折衷的办法,万一禁用或者发生其它原因,L2TP就暴露了。 
5.4 ip_forward(IP传递)
另一个值得注意的安全点是,人们通常将/proc/sys/net/ipv4/ip_forward设置为1来启用路由(×××已经启用),这样从IPsec隧道来的数据包将被转发到内网。可是有一些安全含意,当对某个接口做了限制后,也许一个或多个iptables forward规则同样可能被欺骗。否则你可以使用iproute2(高级路由)。这有点超出本文的范围。

6 ×××的选择
在发掘安装Openswan和L2TP的技术细节前,先停一下。假设你有兴趣让你的用户通过Internet远程访问,主要原因是:价格、安全、友善的用户界面,有以下几种方案供选择:
1、客户端用硬件设施。
2、PPTP,例如Windows包含客户端的。
3、像Citrix、Windows终端服务器、pcAnywhere或VNC等远程桌面解决方案。
4、基于SSL的×××,例如HOB或者Citrix Secure Gateway。
5、非标准的,基于开源的解决方案,如CIPE、vtun、tinc和Open×××。
6、第三方IPsec解决方案,如PGP、SafeNet SoftRemote、SSH Sentinel或TheGreenBow ×××客户端。
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是一个安全的×××协议。例如,远远超过PPTP.L2TP没有把握,但无论如何L2TP数据包用IPsec加密了。
    6、支持“虚拟IP地址”。这意味着远程客户一旦登录后就可以从内网获得一个IP地址。对其它计算机来说,远程用户就像在内部网络上一样。
    7、支持TCP/IP和IPX隧道。使用L2TP,你可以建立一个第二层的隧道,因此从理论上任何三层协议都可以通过隧道。可是多数情况下 TCP/IP协议被使用到×××隧道中,据报道,IPX也能很好地工作。微软客户端支持NetBEUI,但pppd不支持,看来NetBEUI大概不能工作。
    8、L2TP over IPsec是IETE的一个正式标准(RFC2661)。这意味着许多厂商支持这个协议,像PPTP、MPPE、PEAP、L2sec和Open×××等这些相关的×××方案仍然不是正式标准。
    9、NAT-Travelsal.多数IPsec客户端支持它(但像Windows 2000/XP等只有更新后才支持。 
劣势: 
    1、可能在产品提供支持。
    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线路上,线路速度是瓶颈,不是×××,但如果×××运行在LAN上,那么×××是瓶颈。
    10、在非微软的客户端事上比较复杂。L2TP在IPsec顶上对Windows的本地客户端来说设置比较容易,但不是所有的第三方客户端都支持 L2TP.比如如果你有Linux用户,让他们运行L2TP客户端有点无聊,也意味着你需要做更多的工作,因为你希望提供的支持不只一个,而是不同的 ×××选项,也就是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支持
×××用户经常使用动态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证明如果知道“预共享密钥”可以使用一个被欺骗的服务器获得XAUTH用户名和口令,“预共享密钥”可以通过“暴力破解”(brute force cracking)获得或从客户端复制(磁盘或内存)。关于这个问题可以参看Cisco的“Mutual Group Authentication”(http://www.cisco.com/en/US/products/sw/secursw/ps2308/prod_release_note09186a00802d398a.html#wp1382364)(注:服务器认证和客户口令,目前只有Cisico的×××连接者支持,不是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执行者的执行体。
9 安装(Linux 内核等)
方法: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等)不同而不同。
在你配置完你的客户端后,你应该开始×××连接,它将首先启动一个IPsec连接,然后是一个L2TP连接。
12 开始IPsec连接
开始(“拨号”)×××连接。这一步的过程依赖于不同的客户端。客户端将报告一个错误(“你拨叫的计算机没有响应”或类似的信息)。出错是应该的,你仍没有配置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)”