现在的位置: 首页 > 综合 > 正文

L2TP

2012年12月04日 ⁄ 综合 ⁄ 共 5823字 ⁄ 字号 评论关闭

本文转载自http://www.pcdog.com/edu/linux/27/11/u266893_4.html

 

 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)。

 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客户端。 

抱歉!评论已关闭.