使用Linux L2TP/IPsec VPN 服务器

红薯 发布于 2009/05/05 18:03
阅读 4K+
收藏 1

【开源中国 APP 全新上线】“动弹” 回归、集成大模型对话、畅读技术报告”

原文地址: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(高级路由)。这有点超出本文的范围。
>



加载中
OSCHINA
登录后可查看更多优质内容
返回顶部
顶部