摘要:L2TP(Layer 2 Tunneling Protocol)是广泛应用的二层隧道协议,常与 IPSec 结合提供远程接入 VPN 服务。本文将从 L2TP 协议架构、隧道建立机制、与 IPSec 的协同工作原理等多个维度进行深度解析,并提供完整的 Linux 生产环境配置实践。
关键词:L2TP、IPSec、VPN、PPP、隧道协议、远程接入
一、L2TP 概述
1.1 什么是 L2TP?
L2TP(Layer 2 Tunneling Protocol)是由 IETF 定义的二层隧道协议,标准文档为 RFC 2661(1999 年发布)。L2TPv3 的标准文档为 RFC 3931(2005 年发布)。L2TP 本身不提供加密,通常与 IPSec 结合使用(L2TP/IPSec),由 IPSec 提供加密和完整性保护。
核心特性:
- 🔌 二层隧道:在数据链路层封装 PPP 帧
- 🔐 依赖 IPSec:自身无加密,需配合 IPSec 使用
- 💻 原生支持:Windows、macOS、iOS、Android 均内置客户端
- 🌐 NAT 穿越:支持 UDP 封装,可穿越 NAT 设备
1.2 L2TP 与 IPSec 的关系
L2TP 和 IPSec 是互补关系,而非竞争关系:
| 特性 | L2TP | IPSec |
|---|---|---|
| OSI 层级 | 第 2 层(数据链路层) | 第 3 层(网络层) |
| 加密能力 | ❌ 无 | ✅ 有(ESP/AH) |
| 认证能力 | ✅ PPP 认证(CHAP/MS-CHAPv2) | ✅ IKE 认证 |
| 典型应用 | 远程接入 VPN | Site-to-Site / 远程接入 |
| 客户端支持 | 全平台原生支持 | 部分平台需额外配置 |
L2TP/IPSec 双重封装:
1.3 应用场景
| 场景类型 | 典型应用 | 优势 |
|---|---|---|
| 移动办公接入 | 员工远程访问内网 | 客户端无需安装,系统原生支持 |
| 临时安全接入 | 合作伙伴短期访问 | 快速部署,用户认证灵活 |
| 多协议承载 | 传输非 IP 协议 | PPP 可承载 IPX、AppleTalk 等 |
| 混合 VPN 架构 | L2TP + IPSec 双栈 | 兼容老旧设备,支持 IKEv2 |
二、L2TP 协议架构
2.1 协议栈位置
2.2 L2TP 核心概念
2.2.1 隧道(Tunnel)
隧道是 LAC(L2TP 访问集中器)和 LNS(L2TP 网络服务器)之间的逻辑连接。
- 每个隧道由唯一的 Tunnel ID 标识
- 隧道可承载多个会话
- 隧道建立使用控制连接(Control Connection)
2.2.2 会话(Session)
会话是隧道内的逻辑子连接,代表一个 PPP 连接。
- 每个会话由唯一的 Session ID 标识
- 会话 ID 在隧道内唯一
- 每个远程用户对应一个会话
2.2.3 LAC 和 LNS
| 角色 | 全称 | 功能 | 典型位置 |
|---|---|---|---|
| LAC | L2TP Access Concentrator | 发起隧道连接 | 远程接入客户端(Windows/macOS 内置客户端) |
| LNS | L2TP Network Server | 终止隧道,处理 PPP 认证 | VPN 服务器 |
注意:在 L2TP/IPSec 远程接入场景中,客户端软件(Windows/macOS 内置 VPN 客户端)充当 LAC 角色,直接向 LNS 发起连接,不需要独立的 LAC 设备。
三、L2TP 数据包结构
3.1 L2TP 头部格式
L2TP 控制消息和数据消息共享相同的头部格式:
关键标志位:
| 位 | 名称 | 含义 |
|---|---|---|
| T | Type | 0=数据消息,1=控制消息 |
| L | Length | 1=包含 Length 字段 |
| A | Acknowledgment | 1=包含 Nr(确认号) |
| S | Sequence | 1=包含 Ns/Nr(序列号) |
| O | Offset | 1=包含 Offset 字段(L2TPv2 较少使用) |
| P | Reserved | 保留位,必须为 0 |
3.2 控制消息 vs 数据消息
| 特性 | 控制消息 | 数据消息 |
|---|---|---|
| T 位 | 1 | 0 |
| 可靠性 | ✅ 可靠(重传机制) | ❌ 不可靠 |
| 序列号 | 必需 | 可选 |
| 用途 | 隧道/会话管理 | 用户数据传输 |
| UDP 端口 | 1701 | 1701(或动态) |
3.3 L2TPv2 vs L2TPv3
L2TPv3(RFC 3931)是 L2TPv2 的增强版本:
| 特性 | L2TPv2 | L2TPv3 |
|---|---|---|
| RFC | RFC 2661 | RFC 3931 |
| 承载协议 | 仅 PPP | PPP、Ethernet、VLAN 等 |
| 头部复杂度 | 简单 | 支持可选字段 |
| 扩展性 | 有限 | 强大的 AVP 扩展 |
| 应用场景 | 远程接入 | 二层 VPN(L2VPN) |
四、L2TP 隧道建立流程
4.1 控制连接建立
L2TP 控制连接建立采用三次握手:
消息内容:
- SCCRQ:协议版本、主机名、隧道 ID、帧类型支持
- SCCRP:分配的隧道 ID、挑战响应(认证)
- SCCCN:连接确认、挑战响应
4.2 会话建立
控制连接建立后,进行会话协商:
4.3 PPP 认证阶段
会话建立后,进行 PPP 链路协商和认证:
常用认证协议对比:
| 协议 | 安全性 | 加密 | 挑战 - 响应 | 推荐度 |
|---|---|---|---|---|
| PAP | ⭐ | ❌ 明文 | ❌ | ❌ 禁用 |
| CHAP | ⭐⭐⭐ | ✅ MD5 | ✅ | ⭐⭐ |
| MS-CHAPv2 | ⭐⭐⭐⭐ | ✅ 改进 MD5 | ✅ | ⭐⭐⭐⭐ |
| EAP | ⭐⭐⭐ | ✅ 可扩展 | ✅ | ⭐ (L2TP 支持有限) |
注意:EAP 在 L2TP/PPP 中支持有限,Windows 原生客户端不支持 L2TP+EAP 组合。EAP 主要用于 802.1X 认证场景。
4.4 完整连接流程
五、L2TP/IPSec 协同工作机制
5.1 为什么需要 IPSec?
L2TP 本身存在以下安全缺陷:
- ❌ 无数据加密
- ❌ 无完整性保护
- ❌ 无身份认证(仅依赖 PPP 认证)
- ❌ 易受中间人攻击
IPSec 弥补的缺陷:
- ✅ ESP 加密 L2TP 载荷
- ✅ 完整性校验防止篡改
- ✅ IKE 双向认证
- ✅ 抗重放攻击
5.2 封装顺序
L2TP/IPSec 的封装顺序为:先 L2TP,后 IPSec
5.3 端口使用
| 协议 | 端口 | 方向 | 用途 |
|---|---|---|---|
| IKE | UDP 500 | 双向 | IPSec 密钥协商 |
| IKE NAT-T | UDP 4500 | 双向 | NAT 穿越 |
| L2TP | UDP 1701 | 双向 | L2TP 控制/数据 |
| ESP | IP 50 | 双向 | 加密数据传输 |
防火墙规则(入站):
# IPSec
-A INPUT -p udp --dport 500 -j ACCEPT
-A INPUT -p udp --dport 4500 -j ACCEPT
-A INPUT -p esp -j ACCEPT
# L2TP
-A INPUT -p udp --dport 1701 -j ACCEPT
六、生产环境配置实践
6.1 典型拓扑
6.2 环境信息
| 角色 | 公网 IP | 内网网段 | IP 地址池 | 主机名 |
|---|---|---|---|---|
| VPN 服务器 | 1.2.3.4 | 192.168.1.0/24 | 192.168.2.100-200 | vpn-server |
6.3 【服务器端】配置步骤
步骤 1:安装软件包
# Ubuntu/Debian
sudo apt-get update
sudo apt-get install -y strongswan xl2tpd net-tools
# CentOS/RHEL
sudo yum install -y strongswan xl2tpd net-tools
步骤 2:配置 IPSec(/etc/ipsec.conf)
# /etc/ipsec.conf - L2TP/IPSec 服务器配置
config setup
charondebug="ike 2, knl 2, cfg 2"
uniqueids=never
strictcrlpolicy=no
cachecrls=no
# L2TP/IPSec 连接配置
conn l2tp-psk
type=transport
keyexchange=ikev1
authby=secret
# 服务器端配置
left=1.2.3.4
leftprotoport=17/1701
leftfirewall=yes # 需要 /etc/ipsec.d/ipsec 脚本支持,或使用手动 iptables 规则
# 客户端配置(任意)
right=%any
rightprotoport=17/%any
# IKEv1 加密算法
ike=aes256-sha256-modp2048!
# ESP 加密算法
esp=aes256-sha256!
# 禁用 DPD(某些客户端不兼容)
dpdaction=clear
dpddelay=30s
# 生命周期
ikelifetime=8h
lifetime=1h
# 自动启动
auto=add
# 标记连接
mark=100/0xff
步骤 3:配置 IPSec 密钥(/etc/ipsec.secrets)
# /etc/ipsec.secrets
1.2.3.4 : PSK "L2TP@StrongPSK2025!"
步骤 4:配置 L2TP(/etc/xl2tpd/xl2tpd.conf)
# /etc/xl2tpd/xl2tpd.conf
[global]
port = 1701
bind = 1.2.3.4
; 日志级别 (debug, info, warn, error)
debug = info
; 日志文件
logfile = /var/log/xl2tpd.log
[lns default]
# IP 地址池(分配给客户端)
ip range = 192.168.2.100-200
# 本地 IP(服务器端 PPP 接口)
local ip = 192.168.2.1
# 要求认证
require authentication = yes
# 认证协议(mschapv2, chap, pap)
require chap = yes
require pap = no
# PPP 选项文件
ppp debug = yes
pppoptfile = /etc/ppp/options.xl2tpd
length bit = yes
步骤 5:配置 PPP 选项(/etc/ppp/options.xl2tpd)
# /etc/ppp/options.xl2tpd
# PPP 全局选项
# 启用调试
debug
# 认证协议
refuse-pap
refuse-eap
require-mschap-v2
# 加密要求
# 注意:L2TP/IPSec 中 IPSec 已提供 AES 加密,MPPE 为冗余加密
# 推荐显式禁用 MPPE,避免双重加密浪费 CPU 且降低安全性(MPPE 使用过时 RC4)
nomppe
nomppc
# DNS 服务器(推送到客户端)
ms-dns 8.8.8.8
ms-dns 8.8.4.4
# 或使用内网 DNS
# ms-dns 192.168.1.1
# 其他选项
proxyarp
nodefaultroute
lock
步骤 6:配置用户认证(/etc/ppp/chap-secrets)
# /etc/ppp/chap-secrets
# 格式:用户名 服务器 密码 允许 IP
vpnuser1 l2tpd User1@Pass2025 *
vpnuser2 l2tpd User2@Pass2025 *
vpnuser3 l2tpd User3@Pass2025 *
设置正确的文件权限:
sudo chmod 600 /etc/ppp/chap-secrets
sudo chown root:root /etc/ppp/chap-secrets
步骤 7:配置防火墙
# Ubuntu (UFW)
sudo ufw allow 500/udp # IKE
sudo ufw allow 4500/udp # NAT-T
sudo ufw allow 1701/udp # L2TP
sudo ufw allow proto esp # ESP
# CentOS (firewalld)
sudo firewall-cmd --permanent --add-service=ipsec
sudo firewall-cmd --permanent --add-port=1701/udp
sudo firewall-cmd --reload
# 启用 IP 转发
sudo sysctl -w net.ipv4.ip_forward=1
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
# 配置 NAT(使客户端能访问互联网)
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
# 保存 iptables 规则(Ubuntu)
sudo apt-get install -y iptables-persistent
sudo netfilter-persistent save
步骤 8:启动服务
# 重启 IPSec
sudo ipsec restart
# 重启 L2TP
sudo systemctl restart xl2tpd
# 查看服务状态
sudo ipsec status
sudo systemctl status xl2tpd
# 查看日志
sudo tail -f /var/log/charon.log
sudo tail -f /var/log/xl2tpd.log
sudo tail -f /var/log/syslog | grep ppp
6.4 【客户端】Linux 配置步骤
方式 1:使用 NetworkManager(推荐)
# 安装 NetworkManager L2TP 插件
sudo apt-get install -y network-manager-l2tp network-manager-l2tp-gnome
# 通过 GUI 配置
nm-connection-editor → 添加 → L2TP
# 或通过命令行配置
nmcli connection add type l2tp \
con-name "Company VPN" \
gw 1.2.3.4 \
user vpnuser1 \
password User1@Pass2025 \
ipsec-enabled yes \
ipsec-psk L2TP@StrongPSK2025!
# 启动连接
nmcli connection up "Company VPN"
# 查看连接状态
nmcli connection show
方式 2:使用 xl2tpd(命令行)
# 安装 xl2tpd 和 strongSwan
sudo apt-get install -y xl2tpd strongswan
# 配置 IPSec
cat > /etc/ipsec.conf <<EOF
config setup
charondebug="ike 2, knl 2, cfg 2"
uniqueids=never
conn l2tp-client
type=transport
keyexchange=ikev1
authby=secret
left=%defaultroute
leftprotoport=17/1701
right=1.2.3.4
rightprotoport=17/1701
ike=aes256-sha256-modp2048!
esp=aes256-sha256!
auto=add
EOF
# 配置预共享密钥
echo "1.2.3.4 : PSK \"L2TP@StrongPSK2025!\"" > /etc/ipsec.secrets
# 配置 xl2tpd
cat > /etc/xl2tpd/xl2tpd.conf <<EOF
[lac default]
lns = 1.2.3.4
ppp debug = yes
pppoptfile = /etc/ppp/options.l2tpd.client
length bit = yes
EOF
# 配置 PPP 选项
cat > /etc/ppp/options.l2tpd.client <<EOF
noipdefault
defaultroute
replacedefaultroute
hide-password
noauth
debug
lock
mtu 1380
mru 1380
noipx
refuse-pap
refuse-eap
require-mschap-v2
# 注意:IPSec 已加密,禁用 MPPE 避免冗余加密
nomppe
nomppc
user vpnuser1
password User1@Pass2025
EOF
# 启动 IPSec
sudo ipsec restart
sudo ipsec up l2tp-client
# 启动 xl2tpd
sudo systemctl restart xl2tpd
# 建立连接
echo "c default" > /var/run/xl2tpd/l2tp-control
# 查看 PPP 接口
ip addr show ppp0
方式 3:使用 openl2tp(简化方案)
# 安装 openl2tp
sudo apt-get install -y openl2tp
# 配置连接
cat > /etc/openl2tp/openl2tp.conf <<EOF
server=1.2.3.4
username=vpnuser1
password=User1@Pass2025
ipsec_psk=L2TP@StrongPSK2025!
EOF
# 启动连接
sudo systemctl start openl2tp
6.5 客户端连接验证
# 查看 PPP 接口
ip addr show ppp0
# 查看路由表
ip route show
# 测试连通性
ping 192.168.1.1
# 查看 IPSec 状态
sudo ipsec status
# 查看 xl2tpd 状态
sudo systemctl status xl2tpd
# 查看日志
sudo tail -f /var/log/charon.log
sudo tail -f /var/log/xl2tpd.log
6.6 故障排查命令
# ==================== IPSec 排查 ====================
# 查看 IPSec SA 状态
sudo ipsec status
sudo ipsec statusall
# 查看流量统计
sudo ipsec trafficstatus
# 重启 charon 守护进程
sudo ipsec restart
# 查看 IKE 日志
sudo tail -f /var/log/charon.log
# 手动触发连接
sudo ipsec up l2tp-psk
# ==================== L2TP 排查 ====================
# 查看 xl2tpd 状态
sudo systemctl status xl2tpd
# 查看 L2TP 日志
sudo tail -f /var/log/xl2tpd.log
# 查看 PPP 日志
sudo tail -f /var/log/syslog | grep ppp
sudo journalctl -u ppp -f
# 查看活动的 PPP 接口
ifconfig ppp0
ip addr show ppp0
# ==================== 网络排查 ====================
# 检查端口监听
sudo netstat -nlup | grep -E '500|1701|4500'
sudo ss -nlup | grep -E '500|1701|4500'
# 检查防火墙规则
sudo iptables -L -n -v
sudo iptables -t nat -L -n -v
# 检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward
# 检查路由表
ip route show
七、性能优化建议
7.1 加密算法选择
| 算法组合 | 安全性 | 性能 | 兼容性 | 推荐场景 |
|---|---|---|---|---|
| AES-256-SHA256 | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐ | 现代客户端 |
| AES-128-SHA1 | ⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | 老旧设备兼容 |
| 3DES-SHA1 | ⭐⭐ | ⭐⭐ | ⭐⭐⭐⭐ | 遗留系统 |
| DES-MD5 | ❌ | ⭐⭐⭐ | ⭐⭐ | 已废弃,禁用 |
推荐配置:
ike=aes256-sha256-modp2048!
esp=aes256-sha256!
7.2 MTU 优化
L2TP/IPSec 的多层封装会增加数据包开销,可能导致 MTU 问题:
# 计算有效 MTU
# 原始 MTU 1500 - IPSec ESP(50-73) - L2TP+UDP(20) - PPP(4-6) ≈ 1380-1414
# 设置 PPP MTU(推荐值,过低会牺牲吞吐量)
# /etc/ppp/options.xl2tpd
mtu 1380
mru 1380
# 或使用 ppp mtu 自适应
# ppp 会自动协商合适的 MTU
MTU 取值建议:
- 1380:兼容大多数场景(IPv4 + AES-256-GCM ESP + L2TP)
- 1400:精简加密算法时(AES-128-CTR + SHA-1)
- 1280:经过多重 NAT 或不稳定链路时的安全值
- 避免 1200:除非有明确链路问题,1200 会显著降低吞吐量
MTU 问题症状:
- ✅ 小数据包正常,大数据包失败
- ✅ 网页能打开但图片加载失败
- ✅ ping 小包通,大包不通
测试方法:
# Windows(推荐 MTU 1380 → ICMP payload = 1380 - 28 = 1352)
ping -f -l 1352 192.168.1.1
# Linux(推荐 MTU 1380 → ICMP payload = 1380 - 28 = 1352)
ping -M do -s 1352 192.168.1.1
7.3 并发连接数优化
# /etc/xl2tpd/xl2tpd.conf
[global]
# 隧道协商超时(秒)
timeout = 60
注意:xl2tpd 自身无
max tunnels/max sessions限制指令。如需限制并发,可通过系统级资源控制(如 systemdLimitNPROC)或 PPP 选项实现。
7.4 心跳检测
# /etc/ppp/options.xl2tpd
# 空闲超时断开(秒):无流量自动断开
idle 3600
# LCP 心跳检测(PPP 层保活)
lcp-echo-interval 30
lcp-echo-failure 4
注意:xl2tpd 无
idle timeout/heartbeat timeout指令。空闲超时和保活应通过 PPP 选项(idle、lcp-echo-interval)实现。
八、安全加固建议
8.1 预共享密钥管理
密钥强度要求:
- 长度 ≥ 20 字符
- 包含大小写字母、数字、特殊字符
- 定期轮换(建议 90 天)
- 不同用户组使用不同密钥
生成强密钥:
openssl rand -base64 32
8.2 用户认证加固
# /etc/ppp/chap-secrets
# 限制用户 IP 范围
vpnuser1 l2tpd StrongPass123 192.168.2.100
vpnuser2 l2tpd StrongPass456 192.168.2.101
# 禁用弱认证协议
# /etc/ppp/options.xl2tpd
refuse-pap
refuse-eap
require-mschap-v2
8.3 最小化访问控制
# 限制特定网段访问
sudo iptables -A INPUT -p udp --dport 1701 \
-s 10.0.0.0/8 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 1701 -j DROP
# 或使用 ipsec.conf
conn l2tp-psk
rightsourceip=192.168.2.0/24
right=%any
8.4 日志与审计
# 启用详细日志
# /etc/xl2tpd/xl2tpd.conf
debug = debug
# /etc/ppp/options.xl2tpd
debug
kdebug 1
# 日志轮转
# /etc/logrotate.d/xl2tpd
/var/log/xl2tpd.log {
daily
rotate 30
compress
missingok
notifempty
}
8.5 防止 DoS 攻击
# 限制连接速率
sudo iptables -A INPUT -p udp --dport 1701 \
-m limit --limit 10/minute --limit-burst 20 -j ACCEPT
sudo iptables -A INPUT -p udp --dport 1701 -j DROP
# 限制 IPSec 连接
sudo iptables -A INPUT -p udp --dport 500 \
-m limit --limit 5/minute -j ACCEPT
九、常见问题 FAQ
Q1: 连接时提示"协商超时"?
可能原因:
- 防火墙未放行 UDP 500/1701
- 预共享密钥不匹配
- NAT 设备未启用 IPSec Passthrough
排查步骤:
# 检查端口是否开放
sudo netstat -nlup | grep -E '500|1701'
# 检查 IPSec 日志
sudo tail -f /var/log/charon.log
# 客户端测试端口
telnet 1.2.3.4 500
Q2: 连接成功但无法访问内网?
可能原因:
- IP 转发未启用
- NAT 规则未配置
- 路由未正确推送
解决方案:
# 检查 IP 转发
cat /proc/sys/net/ipv4/ip_forward # 应为 1
# 检查 NAT 规则
sudo iptables -t nat -L -n -v
# 添加 NAT 规则
sudo iptables -t nat -A POSTROUTING -s 192.168.2.0/24 -o eth0 -j MASQUERADE
Q3: Windows 客户端提示"错误 789"?
原因:Windows 注册表问题(常见于 Windows 7/8)
解决方案:
# 以管理员身份运行
reg add HKLM\SYSTEM\CurrentControlSet\Services\PolicyAgent /v AssumeUDPEncapsulationContextOnSendRule /t REG_DWORD /d 2 /f
# 重启计算机
Q4: macOS 连接后频繁断开?
**可能原因:**DPD(Dead Peer Detection)超时
解决方案:
# /etc/ipsec.conf
conn l2tp-psk
dpdaction=clear
dpddelay=60s
dpdtimeout=300s
Q5: 如何支持更多并发用户?
优化方向:
- 增加系统文件描述符限制
- 调整内核网络参数
- 使用 RADIUS 集中认证
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
# /etc/sysctl.conf
net.core.somaxconn = 65535
net.ipv4.ip_local_port_range = 1024 65535
Q6: L2TP 还是 OpenVPN/WireGuard?
| 特性 | L2TP/IPSec | OpenVPN | WireGuard |
|---|---|---|---|
| 原生支持 | ✅ 全平台 | ❌ 需客户端 | ⚠️ 部分平台 |
| 性能 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 安全性 | ⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ | ⭐⭐⭐⭐⭐ |
| 配置复杂度 | ⭐⭐⭐ | ⭐⭐⭐⭐ | ⭐⭐ |
| 推荐场景 | 移动办公 | 高安全需求 | 新建项目 |
十、总结
L2TP/IPSec 作为成熟的远程接入 VPN 方案,在企业移动办公场景中仍广泛应用。其核心优势在于:
核心要点回顾:
- 双重封装:L2TP 隧道 + IPSec 加密,兼顾灵活性与安全性
- 原生支持:无需安装客户端,降低部署成本
- PPP 认证:支持 MS-CHAPv2 等多种认证方式
- NAT 穿越:UDP 封装,可穿越大多数 NAT 设备
适用场景:
- ✅ 移动办公远程接入
- ✅ 临时合作伙伴访问
- ✅ 需要原生客户端支持的场景
- ⚠️ 高并发/高性能场景建议考虑 WireGuard
随着 WireGuard 等新一代 VPN 协议的兴起,L2TP/IPSec 在性能上不再占优,但其广泛的客户端兼容性使其在特定场景下仍是首选方案。
参考文献
- RFC 2661 - Layer Two Tunneling Protocol
- RFC 3931 - Layer Two Tunneling Protocol (Version 3)
- RFC 7296 - Internet Key Exchange Protocol Version 2
- Linux L2TP Kernel Documentation
- strongSwan Documentation
- xl2tpd GitHub Repository