1、之前移植了 l2tp 的 client,用的是 rp-l2tp-0.4,由于 rp-l2tp 系列的版本无法动态分配 ip 地址(有解决方法,但太麻烦) ,因此决定移植 server 时不再使用rp-l2tp,而改为 xl2tpd。移植时 l2tp 用的是 xl2tpd-1.2.4,ppp 用的是 ppp-2.4.5,虚拟机是Fedora10,client 用的是电信 1-2C 语音网关。简要介绍移植 xl2tpd server1、编译阶段下载 xl2tpd-1.2.4.tar.gz,解压后进入解压目录,然后编译,安装,例如我是放在/usr/local 下,在编译过程中发现错误(安装的虚拟机不
2、通,库文件不通,遇到的错误可能会不同,也可能不会遇到错误) ,提示缺少头文件 pcap-bpf.h pcap.h,这个问题简单吧,从网上找到这几个头文件,放到相关目录即可(/usr/include/pcap.h,/usr/include/pcap-bpf.h) ,链接时提示 no find lpcap,该提示为缺少库文件,从网上下载 libpcap-1.3.0.tar.gz(网址我忘记了,或者联网后rpm 也可) ,解压后#./configure#make#make install之后再编译 xl2tpd-1.2.4,编译通过,2、修改配置文件(配置文件中有些可以注释掉的选项,没有列在本文档中
3、)修改配置文件/etc/xl2tpd/xl2tpd.confgloballisten-addr = 0.0.0.0port = 1701lns defaultip range = 192.168.22.128-192.168.22.254local ip = 192.168.22.99require chap = yesrefuse pap = yesrequire authentication = yesname = LinuxVPNserverppp debug = yespppoptfile = /etc/ppp/options.xl2tpdlength bit = yes解释下各个字段
4、的意义,listen-addr 这个字段我认为是 xl2tpd server 监听从哪个 ip 发来的数据包,0.0.0.0表示监听所有接口发来的数据包port 这个不多说了,如果你不知道 l2tp udp 端口号为 1701,那么请你补习一下功课ip range = 192.168.22.128-192.168.22.254,这个字段表示给客户端分配的 ip 地址池local ip 表示 xl2tpd server 的 ppp 接口的 ip 地址require chap = yesrefuse pap = yesrequire authentication = yes 这三个表示 xl2tp
5、d server 要求认证,且可以支持两种认证方式 chap 和 pap(chap 认证时密码用 MD5 算法加密,pap 则直接明文发送用户名及密码)name = LinuxVPNserver,名字而已,具体什么作用我还没研究ppp debug = yes,打开 ppp 的 debugpppoptfile = /etc/ppp/options.xl2tpd,options.xl2tpd 这个文件里定义了 ppp 的相关参数,稍后具体介绍,length bit = yes,这个是什么意思呢,不瞒你说,我也不知道,如果你知道,麻烦告诉我一下下面是/etc/ppp/options.xl2tpd 的
6、配置,ipcp-accept-localipcp-accept-remote#ms-dns 192.168.1.1#ms-dns 192.168.1.3#ms-wins 192.168.1.2#ms-wins 192.168.1.4noccpauthcrtsctsidle 1800mtu 1410mru 1410nodefaultroutedebuglockproxyarpconnect-delay 5000ipcp-accept-localipcp-accept-remote,分析一下这两行,ipcp 表示 ip control protcal,三层的东西,和 ip 有关,accept 表示
7、接受, local 和 remote 分别表示本端和对端,这两个字段是与本端和对端的 ip 地址相关的,注掉的那几行是和 dns 相关的,如果你不知道什么是 dns,那么这篇文章你就不用看了,因为你看不明白,注掉了表示不给对端(或者说 client,准确来说是LAC)分配 dns,剩下的几行不解释了,都是网络的基础知识,这个文件如果你不知道什么意思,请你看看 ppp-2.4.5 的源代码,里面有注释;有人说这个文件里应该加上一下两句:lcp-echo-interval 30lcp-echo-failure 4这两句是表示链路维护阶段发送链路维护报文的时间间隔,如果 30*4 秒内收不到链路维护
8、报文,则链路自动断开,这两句最好也加上,ppp-2.4.5 中他们的默认值均为 0,如果是 0 就意味着,如果网络比较差的话,那么 l2tp 会处于不停的拨号与断开的循环中,导致 vpn 不可用(pppoe 的时候曾经遇到过这个问题,一晚拨号断开几十次,就是因为网络不好导致的,所以建议加上以上两句,我在内网中调试 xl2tpd,没有加,所以以上两行的功能没经过亲自测试) 。下面介绍/etc/ppp/chap-secrets# Secrets for authentication using CHAP# client server secret IP addresses# system-conf
9、ig-network will overwrite this part! (begin) #Abcd LinuxVPNserver 111111 *# system-config-network will overwrite this part! (end) #简单吧,abcd 是用户名, 111111 是密码,LinuxVPNserver 见 xl2tpd.conf 中的 name = LinuxVPNserver,IP addresses 那一列为*3、代码中的默认配置文件路径配置文件都讲完了,其实这些文件不一定非要放到这些目录中,你可以看看代码,在 xl2tpd-1.2.4 的 file
10、.h 文件中有这么一行#define DEFAULT_CONFIG_FILE “/etc/xl2tpd/xl2tpd.conf“这行表示 xl2tpd 进程读取的配置文件的路径在 xl2tpd-1.2.4 的 l2tp.h 文件中有这么一行#define PPPD “/usr/sbin/pppd“这行表示 xl2tpd 进程要调用的 pppd 进程的路径,至于 xl2tpd 进程为什么要调用 pppd 进程,如果你不知道不怪你,在 ppp-2.4.5/pppd/pathnames.h 中#define _PATH_CHAPFILE _ROOT_PATH “/etc/ppp/chap-secre
11、ts“定义了 chap 方式验证时,文件的路径,至于 pap 方式的验证文件,这里不介绍了,大同小异,4、启动进程,# ./xl2tpd -D &-D 表示是调试模式,可以打印出一些 debug 信息,当 client 拨通之后,server 端会看到如下接口信息ppp0 Link encap:Point-to-Point Protocol inet addr:192.168.22.99 P-t-P:192.168.22.128 Mask:255.255.255.255UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1410 Metric:1RX pack
12、ets:4 errors:0 dropped:0 overruns:0 frame:0TX packets:5 errors:0 dropped:0 overruns:0 carrier:0collisions:0 txqueuelen:3 RX bytes:46 (46.0 b) TX bytes:62 (62.0 b)当然如果你是用 rpm 安装的,那么可以用#service xl2tpd start 启动进程;5、小结不管是用 openl2tp,rp-l2tp,xl2tpd 或者其他的 l2tp 的版本,过程都大同小异,无非就是把配置文件写入的相应的文件中,启动 l2tp 后调用 ppp
13、d 进程,当然开源程序有它自身的缺陷,望以后努力,把这些代码拆解开,加入 zebra 的那套机制,虽然 zebra 那套机制也挺烂的。看到这里你可能根本不知道什么是 L2TP,下面是 L2TP 的简要介绍:L2TP(Layer 2 Tunneling Protocol,二层隧道协议)是 VPDN(Virtual Private Dial-up Network,虚拟私有拨号网)隧道协议的一种。VPDN 是指利用公共网络(如 ISDN 或 PSTN)的拨号功能接入公共网络,实现虚拟专用网,从而为企业、小型 ISP、移动办公人员等提供接入服务。即VPDN 为远端用户与私有企业网之间提供了一种经济而有
14、效的点到点连接方式。VPDN 采用专用的网络加密通信协议,在公共网络上为企业建立安全的虚拟专网。企业驻外机构和出差人员可从远程经由公共网络,通过虚拟加密隧道实现和企业总部之间的网络连接,而公共网络上其它用户则无法穿过虚拟隧道访问企业网内部的资源。 VPDN 隧道协议可分为 PPTP、L2F 和 L2TP 三种,目前使用最广泛的是L2TP。L2TP(第二层隧道协议)是用来整合多协议拨号服务至现有的因特网服务提供商点。在 L2TP 构建的 VPDN 中,网络组件包括以下三个部分: 远端系统远端系统是要接入 VPDN 网络的远地用户和远地分支机构,通常是一个拨号用户的主机或私有网络的一台路由设备。
15、LAC(L2TP Access Concentrator,L2TP访问集中器)LAC 是附属在交换网络上的具有 PPP 端系统和 L2TP 协议处理能力的设备,通常是一个当地 ISP 的 NAS,主要用于为 PPP 类型的用户提供接入服务。LAC 位于 LNS 和远端系统之间,用于在 LNS 和远端系统之间传递信息包。它把从远端系统收到的信息包按照 L2TP 协议进行封装并送往 LNS,同时也将从 LNS 收到的信息包进行解封装并送往远端系统。LAC 与远端系统之间采用本地连接或 PPP 链路,VPDN 应用中通常为 PPP链路。 LNS(L2TP Network Server,L2TP网络服
16、务器)LNS 既是 PPP 端系统,又是 L2TP 协议的服务器端,通常作为一个企业内部网的边缘设备。LNS 作为 L2TP 隧道的另一侧端点,是 LAC 的对端设备,是 LAC 进行隧道传输的 PPP 会话的逻辑终止端点。通过在公网中建立 L2TP 隧道,将远端系统的 PPP 连接的另一端由原来的 LAC 在逻辑上延伸到了企业网内部的 LNS。PPP 定义了多协议跨越第二层点对点链接的一个封装机制。特别地,用户通过使用众多技术之一(如拨号 POTS、ISDN、ADSL 等)获得第二层连接到网络访问服务器(NAS) ,然后在此连接上运行 PPP。在这样的配置中,第二层终端点和 PPP 会话终点
17、处于相同的物理设备中(如 NAS) ,L2TP 扩展了 PPP 模型,允许第二层和 PPP 终点处于不同的由包交换网络相互连接的设备中。通过 L2TP,用户在第二层连接到一个访问集中器(如调制解调器池、ADSL DSLAM 等) ,然后这个集中器将建立 PPP 隧道到 NAS。这样,可以把 PPP 包的实际处理过程与 L2 连接的终点分离开来。对于这样的分离,其明显的一个好处是,L2 连接可以在一个(本地)电路集中器上终止,然后通过共享网络如帧中继电路或英特网扩展逻辑 PPP 会话,而不用在 NAS 上终止。从用户角度看,直接在 NAS 上终止 L2 连接与使用 L2TP 没有什么功能上的区别。L2TP 协议也用来解决“多连接联选组分离”问题。多链接 PPP,一般用来集中 ISDN B 通道,需要构成多链接捆绑的所有通道在一个单网络访问服务器(NAS)上组合。因为 L2TP 使得 PPP 会话可以出现在接收会话的物理点之外的位置,它用来使所有的通道出现在单个的 NAS 上,并允许多链接操作,即使是在物理呼叫分散在不同物理位置的 NAS 上的情况下。L2TP 使用以下两种信息类型,即控制信息和数据信息。控制信息用于隧道和呼叫的建立、维持和清除。数据信息用于封装隧道所携带的 PPP 帧。控制信息利用 L2TP 中的一个可靠控制通道来确保发送。当发生包丢失时,不转发数据信息。