VPDN随着现今社会经济的发展,各个公司都努力拓展业务,使得业务涉及的范围也越来越大。为了使得分支机构的员工共享公司内部信息,需要使公司网络覆盖到外地甚至国外。
满足这些需求的一个办法就是公司租用专用线路来通信,但这种方式成本太高,并且企业还需购买专门的接入设备进行维护,这也增加了企业的管理负担。另一种更加经济实惠的办法是 — VPDN(Virtual Private Dial Network,虚拟私有拨号网)。
VPDN 是指利用公共网络(e.g. ISDN 和 PSTN)的拨号功能及接入网来实现的虚拟专用网,从而为企业、小型 ISP、移动办公人员提供接入服务。VPDN 采用专用的网络加密通信协议,在公共网络上为企业建立安全的虚拟专网。企业驻外机构和出差人员可从远程经由公共网络,通过虚拟加密隧道实现和企业总部之间的网络连接,而公共网络上其它用户则无法穿过虚拟隧道访问企业网内部的资源。
在 VPDN 的实现中,使用了廉价的 Internet 网取代专用线路,当外地用户需要访问企业内部资源时,只需要拨号到当地的 ISP,然后由 ISP 使用 VPDN 设备将用户接入到企业内部网。 这不仅为企业节省了费用而且还减轻了企业的管理负担。
VPDN 主要使用的是隧道技术,其中,常用的隧道协议是 L2TPv2,最新的版本是 L2TPv3。
L2TPv2L2TP(Layer Two Tunneling Protocol,二层隧道协议),也就是 L2TPv2,属于 L2 数据链路层协议,是一种基于连接的虚拟隧道协议,用于在隧道之间传递 PPP 数据帧。
L2TPv2 是 IETF 吸纳了 Cisco 公司的 L2F 以及 Microsoft 公司的 PPTP(Point to Point Tunneling Protocol,点对点隧道协议)的优点而制定的一个标准。虽然 L2TP 和 PPTP 都基于 PPP(Point to Point Protocol,点对点协议),在 “点对点” 的基础之上增加了 “隧道” 功能,成为了 “点对点隧道” 协议,即:L2TP 和 PPTP 都提供了对 PPP 数据帧的 Tunnel 传输支持。但实际上,L2TP 和 PPTP 有着诸多不同。
L2TPv2 的协议栈结构
L2TPv2 的系统组成
RH(远端拨号用户) LAC(L2TP Access Concentrator,L2TP 访问集中器) :处于客户接入侧的 ISP 端,通过 PSTN/ISDN 网络为用户提供接入的 AAA 服务。LNS(L2TP Network Server,L2TP 网络服务器) :处于企业内部,完成对用户的最终授权和验证。
L2TPv2 的安全性与可靠性
L2TPv2 在采用 PPP 协议来对数据帧进行封装的同时,也利用了 PPP 协议的 PAP、CHAP 身份认证功能。但 L2TPv2 本身不提供 “加密与可靠性验证” 功能,通常与其他安全协议(e.g. IPSec)搭配使用,从而实现数据的加密传输。但由于 IPSec 在 NAT-T 场景中具有局限性,减弱了 L2TPv2 的性能。
L2TPv2 的两种隧道模式
强制隧道模式 :RH(远端拨号用户)通过 PSTN 连接到 LAC,LAC 通过拨号用户的电话号码,或者用户名的域名部分,确定要指向的 LNS 地址,并开始和对端的 LNS 协商建立隧道和会话。当隧道建立之后,LNS 端可以继续和远端用户进行 PPP 层的协商和身份验证,当然 LNS 可以通过配置不再次进行验证。自愿隧道模式 :若没有 RH,LAC 直接通过隧道访问 LNS,并通过 LNS 访问企业内部资源。
L2TPv2 的控制平面与数据平面
L2TPv2 Tunnel 建立在 LAC 和 LNS 之间,两端点之间可以建立多条 Tunnel,每条 Tunnel 由一条 Control Connection 和至少一个 Session 组成。
Control Connection(控制平面) :用于完成对端的身份验证,以及协商交换对端的 L2TP 版本号、帧类型和硬件承载能力等信息。另外,身份验证功能是可选的,如果使用,则在 LAC 和 LNS 之间必须存在唯一的共享认证密钥。Session(数据平面) :每个 Session 对应 LAC 和 LNS 之间的一个 PPP 数据流。
相应的,L2TPv2 也存在两种消息类型:
控制消息 :用户 Control Connection 和 Session 的建立与维护。控制消息中的参数用 AVP (Attribute Value Pair,属性值对)来表示,使得协议具有很好的扩展性,在控制消息的传输中还应用了滑动窗口机制,以实现控制消息的重传和拥塞控制。数据消息 :承载用户的 PPP 数据流。数据消息的传输不采用重传机制,所以它无法保证传输的可靠性,但这一点可以通过上层协议,(如:TCP 等)得到保证,数据消息的传输可以根据应用的需要灵活地采用流控或非流控机制,甚至可以在传输过程中动态地使用消息序列号从而动态地激活消息顺序检测和流控功能。在采用流控的过程中,对于失序消息的处理采用了缓存重排序的方法来提高数据传输的有效性。
L2TPv2 隧道建立流程
建立隧道 :
SCCRQ Start-Control-Connection-Request:控制连接发起请求,用于协商隧道 ID 、隧道认证等内容。由 LAC 或 LNS 向对端发送,用来初始化 LAC 和 LNS 之间的 Tunnel,开始 Tunnel 的建立过程。 SCCRP Start-Control-Connection-Reply:表示接受了对端的连接请求,Tunnel 的建立过程可以继续。 SCCCN Start-Control-Connection-Connected:对 SCRRP 的回应,完成 Tunnel(由隧道 ID 标识)的建立。 ZLB:零长度消息报文。一般为查询报文,LAC 可以用 Hello 报文进行恢复,也可以直接丢弃。
建立会话 :协商会话 ID,会话中携带了 LAC 的 LCP 协商信息和用户认证。
ICRQ Incoming-Call-Requst:当 LAC 检测到有用户拨入电话的时候,向 LNS 发 ICRQ,请求在已建立的 Tunnel 中建立 Session。 ICRP Incoming-Call-Reply:用来回应 ICRQ,表示 ICRQ 成功,LNS 也会可在 ICRP 中标识 L2TP Session 必要的参数。 ICCN Incoming-Call-Connected:用来回应 ICRP,表示 L2TP Session 建立完成。
L2TPv2 隧道拆除流程
发起端通过发送 StopCCN 消息报文到对端来通知对端拆除控制连接。 对端收到后发送 ZLB ACK 消息作为回应,同时在一定时间内保持控制连接以防止 ZLB ACK 消息丢失。
L2TPv2 的通信过程报文格式
[tr] 必选字段非必选字段[/tr]SCCRQ Message Type AVP,
Protocol Version,
Host Name,
Framing Capabilities,
Assigned Tunnel ID Bearer Capabilities,
Receive Window Size,
Challenge,
Tie Breaker,
Firmware Revision,
Vendor Name SCCRP Message Type,
Protocol Version,
Framing Capabilities,
Host Name,
Assigned Tunnel ID Bearer Capabilities,
Firmware Revision,
Vendor Name,
Receive Window Size,
Challenge,
Challenge Response SCCCN Message Type Challenge Response StopCCN Message Type,
Assigned Tunnel ID,
Result Code. ICRQ Message Type,
Assigned Session ID,
Call Serial Number Bearer Type,
Physical Channel ID,
Calling Number,
Called Number,
Sub-Address ICRP Message Type,
Assigned Session ID ICCN Message Type,
(Tx) Connect Speed,
Framing Type Initial Recevied LCP CONFREQ,
Last Sent LCP CONFREQ,
Last Received LCP CONFREQ,
Proxy Authen Type,
Proxy Authen Name,
Proxy Authen Challenge,
Proxy Authen ID,
Proxy Authen Response,
Private Group ID,
Rx Connect Speed,
Sequencing Required. OCRQ Message Type,
Assigned Session ID,
Call Serial Number,
Minimum BPS,
Maximum BPS,
Bearer Type,
Framing Type,
Called Number. Sub-Address OCRP Message Type,
Assigned Session ID. Physical Channel ID OCCN Message Type,
(Tx) Connect Speed,
Framing Type. Rx Connect Speed,
Sequencing Required CDN Message Type,
Result Code,
Assigned Session ID. Q.931 Cause Code WEN Message Type,
Call Errors SLI Message Type,
ACCM
L2TPv3针对 L2TPv2 安全上的漏洞,IETF 进而提出了 L2TPv3。
L2TPv3 的前身是 Cisco 的专有协议 — UTI(Universal Tunnel Interface,通用隧道接口)。UTI 能够在 IP 网络上提供简单高速且透明传输 L2 数据帧的功能,但缺乏了控制信令的能力以及大规模商用必须的标准化支持。而 L2TPv3 则对 UTI 进行了增强,补充了 UTI 在标准化和信令方面的缺失,与 L2TPv2 类似的,L2TPv3 也由控制平面和数据平面两个基本单元组成。
与 L2TPv2 相比,L2TPv3 进行了以下改进:
分离所有与 PPP 相关的 AVP 和 Ref,包括:L2TP Header 中专门针对 PPP 的字段。 为了适应大规模的扩展性要求,将原来 16bit 的 Session ID 和 Tunnel ID,扩展为了 32bit。 认证整个控制消息,而不是以前的只认证消息的一部分。
从应用场景的角度看,二者也明显不同:
L2TPv2 可用于在 IP 网络上传输 PPP 流量,一般用于远程接入的 *** 业务。 L2TPv3 可用于在 IP 网络上传输 PPP、HDLC、以太网、帧中继和 ATM 等二层流量,有更广阔的业务范围。例如:L2TPv3 使运营商可以将所有类型的业务流量都汇聚到单一的 IP 网络基础设施上,充分利用 IP 通信的全球可达性,使得企业客户可以享受到成本更低的专线 *** 服务。
有两种通过 IP 网络传输 L2TPv3 数据帧的方法:
L2TPv3 over IP(使用 IP 协议 ID 115) :开销较低。L2TPv3 over UDP(使用目标端口号 1701) :支持 NAT-T。
L2TPv3 有 3 种隧道模型:
LAC-LNS 隧道模型 LNS-LNS 隧道模型 LAC-LAC 隧道模型
应用示例
配置简易的 L2TPv3 隧道
Host-A Host-B
|-------------------| |-------------------|
| | | |
| 192.168.1.46 | <---------> | 192.168.1.211 |
| | | |
|-------------------| |-------------------|
使用了 Linux Kernel 的 L2TPv3 模块 l2tp_ip
$ modprobe l2tp_ip
$ ip l2tp help
Usage: ip l2tp add tunnel
remote ADDR local ADDR
tunnel_id ID peer_tunnel_id ID
[ encap { ip | udp } ]
[ udp_sport PORT ] [ udp_dport PORT ]
[ udp_csum { on | off } ]
[ udp6_csum_tx { on | off } ]
[ udp6_csum_rx { on | off } ]
Usage: ip l2tp add session [ name NAME ]
tunnel_id ID
session_id ID peer_session_id ID
[ cookie HEXSTR ] [ peer_cookie HEXSTR ]
[ offset OFFSET ] [ peer_offset OFFSET ]
[ seq { none | send | recv | both } ]
[ l2spec_type L2SPEC ]
Usage:
ip l2tp del tunnel tunnel_id ID
ip l2tp del session tunnel_id ID session_id ID
ip l2tp show tunnel [ tunnel_id ID ]
ip l2tp show session [ tunnel_id ID ] [ session_id ID ]
Where: NAME := STRING
ADDR := { IP_ADDRESS | any }
PORT := { 0..65535 }
ID := { 1..4294967295 }
HEXSTR := { 8 or 16 hex digits (4 / 8 bytes) }
L2SPEC := { none | default }
Host-A 配置
# 建立 Tunnel
ip l2tp add tunnel tunnel_id 10 peer_tunnel_id 20 encap ip local 192.168.1.46 remote 192.168.1.211
# 建立 Session
ip l2tp add session tunnel_id 10 session_id 100 peer_session_id 200
# 建立路由子接口
ip addr add 10.1.1.1/24 dev l2tpeth0
ip link set dev l2tpeth0 up
NOTE 1 :本示例建立 Tunnel 采用 IP 封装模式,只有 UDP 封装模式支持 NAT-T(NAT 穿透)。
NOTE 2 :本示例建立 Session 忽略了 cookie 和 peer_cookie 参数,若指定,则在 L2TPv3 Header 携带此参数,通信两端将对 cookie 值进行校验。cookie 值可以防范盲目插入***(blind insertion attack)。
Host-B 配置
# 建立 Tunnel
ip l2tp add tunnel tunnel_id 20 peer_tunnel_id 10 encap ip local 192.168.1.211 remote 192.168.1.46
# 建立 Session
ip l2tp add session tunnel_id 20 session_id 200 peer_session_id 100
# 建立路由子接口
ip addr add 10.1.1.2/24 dev l2tpeth0
ip link set dev l2tpeth0 up
# 测试
$ ping 10.1.1.1
抓包
配置基于 L2TPv3 的 ISP 拨号隧道
LNS 配置
$ apt-get install xl2tpd
$ vi /etc/xl2tpd/xl2tpd.conf
[global]
ipsec saref = no
[lns default]
ip range = 100.0.0.100-100.0.0.200
local ip = 100.0.0.10
require chap = yes
require authentication = yes
ppp debug = yes
pppoptfile =/etc/ppp/options.xl2tpd
length bit = yes
$ vi /etc/ppp/options.xl2tpd
require-chap
ms-dns 172.17.92.188
lcp-echo-interval 10
lcp-echo-failure 3
auth
$ vi /etc/ppp/chap-secrets
test l2tpd 123456 *
# or 适用于所有 PPP Server,e.g. pppoe、pptp、l2tp。
test * 123456 *
LAC 配置
$ apt-get install xl2tpd
$ vi /etc/xl2tpd/xl2tpd.conf
[lac user1]
lns = 12.34.56.78
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
$ vi /etc/ppp/options.l2tpd.client
ipcp-accept-local
ipcp-accept-remote
refuse-eap
require-mschap-v2
noccp
noauth
idle 1800
mtu 1410
mru 1410
defaultroute
replacedefaultroute
usepeerdns
debug
lock
connect-delay 5000
name my_user
password pass1
ip ro ad 12.34.56.78 via 192.168.1.1
route add -net 0.0.0.0 netmask 0.0.0.0 dev ppp0
建立安全 VPDN 连接的过程
用户端输入 Username/Password,通过 modem 向 ISP 发起呼叫。 如果 ISP 的 LAC(拨号服务器)支持 L2TPv3,并已经打开了 VPDN 服务,在接收到用户拨入请求之后,取得用户信息(Username/Password)。 LAC 根据本地配置选择 PAP 或 CHAP 身份认证。 LAC 将用户信息发送给 RADIUS 服务器进行身份认证。 RADIUS 服务器认证该用户,如果认证通过,则返回该用户对应的 LNS 地址、隧道密码等相关信息。 LAC 向指定 LNS 发起 Tunnel 连接请求。 Tunnel 建立之后,LAC 和 LNS 协商建立 PPP Session。 LNS 将接入请求信息发送给 RADIUS 服务器进行认证。 RADIUS 服务器认证该请求消息,如果认证通过,则返回响应信息。 Session 建立之后,远端用户的 PPP 进程还是通过隧道和隧道上的会话转发与 LNS 上的 PPP 进程通信,进行 PPP 层的链路控制协商,确定远端用户端的 IP 地址等。在 LNS 上可以配置是否再对远端用户进行一轮身份验证。 协商结束,远端用户开始和 LNS 上的 PPP 进程进行透明的数据通信。