互联网协议 — L2TP 二层隧道协议

Posted 范桂飓

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了互联网协议 — L2TP 二层隧道协议相关的知识,希望对你有一定的参考价值。

目录

VPDN

随着现今社会经济的发展,各个公司都努力拓展业务,使得业务涉及的范围也越来越大。为了使得分支机构的员工共享公司内部信息,需要使公司网络覆盖到外地甚至国外。

满足这些需求的一个办法就是公司租用专用线路来通信,但这种方式成本太高,并且企业还需购买专门的接入设备进行维护,这也增加了企业的管理负担。另一种更加经济实惠的办法是 — VPDN(Virtual Private Dial Network,虚拟私有拨号网)。

VPDN 是指利用公共网络(e.g. ISDN 和 PSTN)的拨号功能及接入网来实现的虚拟专用网,从而为企业、小型 ISP、移动办公人员提供接入服务。VPDN 采用专用的网络加密通信协议,在公共网络上为企业建立安全的虚拟专网。企业驻外机构和出差人员可从远程经由公共网络,通过虚拟加密隧道实现和企业总部之间的网络连接,而公共网络上其它用户则无法穿过虚拟隧道访问企业网内部的资源。

在 VPDN 的实现中,使用了廉价的 Internet 网取代专用线路,当外地用户需要访问企业内部资源时,只需要拨号到当地的 ISP,然后由 ISP 使用 VPDN 设备将用户接入到企业内部网。 这不仅为企业节省了费用而且还减轻了企业的管理负担。

VPDN 主要使用的是隧道技术,其中,常用的隧道协议是 L2TPv2,最新的版本是 L2TPv3。

L2TPv2

L2TP(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 的运行原理

在这里插入图片描述

L2TPv2 的系统组成

  1. RH(远端拨号用户)
  2. LAC(L2TP Access Concentrator,L2TP 访问集中器):处于客户接入侧的 ISP 端,通过 PSTN/ISDN 网络为用户提供接入的 AAA 服务。
  3. LNS(L2TP Network Server,L2TP 网络服务器):处于企业内部,完成对用户的最终授权和验证。

L2TPv2 的两种隧道模式

  1. 强制隧道模式:RH(远端拨号用户)通过 PSTN 连接到 LAC,LAC 通过拨号用户的电话号码,或者用户名的域名部分,确定要指向的 LNS 地址,并开始和对端的 LNS 协商建立隧道和会话。当隧道建立之后,LNS 端可以继续和远端用户进行 PPP 层的协商和身份验证,当然 LNS 可以通过配置不再次进行验证。

  2. 自愿隧道模式:若没有 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 建立隧道的流程

  1. (可选的)用户拨号
  2. 建立 Tunnel(控制平面)
  3. 建立 Session(数据平面):Session 建立必须在 Tunnel 建立之后,且需要由 Ingress/Egress Call Request(呼叫请求)触发建立。Session 与 Call 是一一对应的,Call 的状态由 LAC 和 LNS 维护。另外,与建立 Tunnel 的过程不同,Session 的建立是有方向性的。例如:LAC 请求 LNS 接受一个 Ingress Call Session,或者 LNS 请求 LAC 接受一个 Egress Call Session。

L2TPv2 的安全性与可靠性

L2TPv2 在采用 PPP 协议来对数据帧进行封装的同时,也利用了 PPP 协议的 PAP、CHAP 身份认证功能。但 L2TPv2 本身不提供 “加密与可靠性验证” 功能,通常与其他安全协议(e.g. IPSec)搭配使用,从而实现数据的加密传输。但由于 IPSec 在 NAT-T 场景中具有局限性,减弱了 L2TPv2 的性能。

在这里插入图片描述

L2TPv3

针对 L2TPv2 安全上的漏洞,IETF 进而提出了 L2TPv3。

L2TPv3 的前身是 Cisco 的专有协议 — UTI(Universal Tunnel Interface,通用隧道接口)。UTI 能够在 IP 网络上提供简单高速且透明传输 L2 数据帧的功能,但缺乏了控制信令的能力以及大规模商用必须的标准化支持。而 L2TPv3 则对 UTI 进行了增强,补充了 UTI 在标准化和信令方面的缺失,与 L2TPv2 类似的,L2TPv3 也由控制平面和数据平面两个基本单元组成。

与 L2TPv2 相比,L2TPv3 进行了以下改进:

  1. 分离所有与 PPP 相关的 AVP 和 Ref,包括:L2TP Header 中专门针对 PPP 的字段。
  2. 为了适应大规模的扩展性要求,将原来 16bit 的 Session ID 和 Tunnel ID,扩展为了 32bit。
  3. 认证整个控制消息,而不是以前的只认证消息的一部分。

从应用场景的角度看,二者也明显不同:

  • L2TPv2 可用于在 IP 网络上传输 PPP 流量,一般用于远程接入的 VPN 业务。
  • L2TPv3 可用于在 IP 网络上传输 PPP、HDLC、以太网、帧中继和 ATM 等二层流量,有更广阔的业务范围。例如:L2TPv3 使运营商可以将所有类型的业务流量都汇聚到单一的 IP 网络基础设施上,充分利用 IP 通信的全球可达性,使得企业客户可以享受到成本更低的专线 VPN 服务。

有两种通过 IP 网络传输 L2TPv3 数据帧的方法:

  1. L2TPv3 over IP(使用 IP 协议 ID 115):开销较低。
  2. L2TPv3 over UDP(使用目标端口号 1701):支持 NAT-T。

L2TPv3 有 3 种隧道模型:

  1. LAC-LNS 隧道模型
  2. LNS-LNS 隧道模型
  3. 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 指令
$ 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 配置

  1. 安装软件包。
$ apt-get install xl2tpd
  1. 配置 LNS 节点的 PPP 连接地址。
$ 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
  1. 配置安全认证方式及 DNS 等信息。
$ vi /etc/ppp/options.xl2tpd

require-chap
ms-dns 172.17.92.188
lcp-echo-interval 10
lcp-echo-failure 3
auth
  1. 添加连接账户信息。
$ vi /etc/ppp/chap-secrets

test l2tpd 123456 *
# or 适用于所有 PPP Server,e.g. pppoe、pptp、l2tp。
test * 123456 *

LAC 配置

  1. 安装软件包。
$ apt-get install xl2tpd
  1. 配置 LAC 节点的 PPP 连接信息。
$ vi /etc/xl2tpd/xl2tpd.conf

[lac user1]
lns = 12.34.56.78
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
  1. 配置用户接入信息。
$ 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
  1. 配置 L3 连接到 LNS 的路由
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 连接的过程

在这里插入图片描述

  1. 用户端输入 Username/Password,通过 modem 向 ISP 发起呼叫。
  2. 如果 ISP 的 LAC(拨号服务器)支持 L2TPv3,并已经打开了 VPDN 服务,在接收到用户拨入请求之后,取得用户信息(Username/Password)。
  3. LAC 根据本地配置选择 PAP 或 CHAP 身份认证。
  4. LAC 将用户信息发送给 RADIUS 服务器进行身份认证。
  5. RADIUS 服务器认证该用户,如果认证通过,则返回该用户对应的 LNS 地址、隧道密码等相关信息。
  6. LAC 向指定 LNS 发起 Tunnel 连接请求。
  7. Tunnel 建立之后,LAC 和 LNS 协商建立 PPP Session。
  8. LNS 将接入请求信息发送给 RADIUS 服务器进行认证。
  9. RADIUS 服务器认证该请求消息,如果认证通过,则返回响应信息。
  10. Session 建立之后,远端用户的 PPP 进程还是通过隧道和隧道上的会话转发与 LNS 上的 PPP 进程通信,进行 PPP 层的链路控制协商,确定远端用户端的 IP 地址等。在 LNS 上可以配置是否再对远端用户进行一轮身份验证。
  11. 协商结束,远端用户开始和 LNS 上的 PPP 进程进行透明的数据通信。

以上是关于互联网协议 — L2TP 二层隧道协议的主要内容,如果未能解决你的问题,请参考以下文章

l2tp ipsec centos7

IPSEC的一些理解

PPTP,L2TP,IPSec和SSL VPN的区别

主要的交换机协议都有哪些

开中国的vpn可以用中国的流量么

VPN相关技术