8. L2TP Over Specific Media (特定媒体上的 L2TP)
本章描述 L2TP 在特定媒体类型上的实现细节。L2TP 被设计为可以在多种数据包传输媒体上运行,包括 UDP/IP、帧中继、ATM 等。
8.1 L2TP over UDP/IP (基于 UDP/IP 的 L2TP)
L2TP 使用注册的 UDP 端口 1701 用于隧道端点之间的通信。UDP 为 L2TP 控制消息和数据消息提供数据包传输服务。
端口分配:
- 源端口: 发送端可以使用任何可用的 UDP 端口作为源端口。
- 目标端口: 必须使用 UDP 端口 1701。
数据包封装:
L2TP 数据包在 UDP/IP 上的封装格式如下:
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| IP 头部 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| UDP 头部 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| L2TP 头部 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
| L2TP 控制消息或 |
| PPP 载荷 |
+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
UDP 校验和:
UDP 校验和应该被计算并包含在所有 L2TP 数据包中。接收端必须验证校验和(如果存在)。如果校验和验证失败,数据包必须被丢弃。
MTU 考虑:
由于 L2TP 添加了额外的封装层(L2TP 头部 + UDP 头部 + IP 头部),实现必须考虑路径 MTU。典型的封装开销:
- IP 头部: 20 字节 (IPv4) 或 40 字节 (IPv6)
- UDP 头部: 8 字节
- L2TP 头部: 至少 6 字节(可能更多,取决于选项)
分片:
建议 L2TP 实现避免 IP 分片。可以通过以下方式实现:
- 路径 MTU 发现
- 在隧道建立时协商 MRU (最大接收单元)
- 在 PPP 层进行分片而不是 IP 层
8.2 IP (互联网协议)
L2TP 数据包使用 IP 作为其数据包传输协议。IP 为 L2TP 提供端到端的数据包传输服务。
IP 版本支持:
L2TP 被设计为可以在 IPv4 [RFC791] 和 IPv6 [RFC2460] 上运行。实现应该支持至少一种 IP 版本,并可以选择支持两者。
IPv4 特定考虑:
- 协议类型: 当使用 UDP 封装时,IP 协议字段设置为 17 (UDP)。
- 服务类型 (TOS): L2TP 实现可以设置 IP TOS 字段以指示服务质量要求。控制消息可能需要比数据消息更高的优先级。
- 生存时间 (TTL): 应该设置合适的 TTL 值以防止数据包在网络中无限循环。
IPv6 特定考虑:
- 下一个头部: 当使用 UDP 封装时,设置为 17 (UDP)。
- 流标签: 可以使用 IPv6 流标签来识别属于同一隧道的数据包流,以便进行 QoS 处理。
- 跳数限制: 相当于 IPv4 的 TTL。
地址选择:
LAC 和 LNS 必须能够确定对端的 IP 地址。这可以通过以下方式实现:
- 静态配置
- DNS 解析
- 动态发现机制
多宿主考虑:
如果隧道端点有多个 IP 地址(多宿主),实现必须确保隧道的所有数据包都使用一致的源地址。这对于保持隧道状态和防止混淆至关重要。
安全性:
当 L2TP 在 IP 上运行时,强烈建议使用 IPsec [RFC2401] 来保护隧道流量。IPsec 可以提供:
- 机密性: 通过 ESP 加密
- 完整性: 通过 AH 或 ESP 认证
- 端点认证: 通过 IKE
详细的安全考虑请参见第 9 章。
实现注意事项:
-
端口复用: 多个隧道可以在同一对 IP 地址之间建立,通过 Tunnel ID 进行区分。
-
NAT 穿越: 当 L2TP 需要穿越 NAT 设备时,可能需要额外的机制 (如 L2TP/IPsec NAT-T)。
-
防火墙考虑: 防火墙必须允许 UDP 端口 1701 的双向通信以支持 L2TP。
-
QoS 映射: 实现可以将 PPP 层的 QoS 要求映射到 IP 层的 DSCP 或 TOS 字段。