我没有找到任何如何通过 IP 实现 L2TPv3 的示例
我发现只有几个 L2TP 的开源实现,它们是:
- openL2TP:https ://github.com/breed/openl2tp不支持 L2TPv3 并使用 UDP
- tunneldigger:https ://github.com/wlanslovenija/tunneldigger支持 L2TPv3 但也使用 UDP
L2TPv3 rfc 没有说明它是如何在 linux 中实现的,这很明显
内核文档: https ://github.com/torvalds/linux/blob/master/Documentation/networking/l2tp.txt说我们必须使用 netlink + 标准套接字来告诉我们一些事情。但我不明白为什么我们必须使用 netlink 和标准套接字?
内核头文件: https ://github.com/torvalds/linux/blob/master/include/uapi/linux/l2tp.h它有大量用于 netlink + l2tpip 结构的枚举和命令。我对如何正确使用它们感到困惑。
以及L2TPv3控制交换建立的最后部分(SCCRQ、SCCRP、SCCCN)。阅读内核文档后,我只有自己的理解,这可能不正确,但在这里。
服务器端:
- 准备隧道 0 套接字
- 为 l2tp 创建 genl 套接字
- 创建标准套接字填充 l2tpip 结构(套接字创建 + 绑定),其中 tunnel_id 为 0
- 使用 genl socket 创建隧道 0
等待 SCCRQ(据我了解,标头的控制连接 ID 等于零)
在隧道 0 套接字上收到 SCCRQ
- 从收到的 SCCRQ 中获取 AVL 的分配控制连接 ID,该 ID 在另一侧是 received_tunnel_id
- 为我方生成 local_tunnel_id
- 创建标准套接字填充 l2tpip 结构(套接字创建 + 绑定),其中 tunnel_id 为 local_tunnel_id
- 使用 genl socket 创建带有 local_tunnel_id 的隧道
- 发送 SCCRP,其标头的控制连接 ID 等于 received_tunnel_id 和 AVL 分配的控制连接 ID 等于 local_tunnel_id
- 在该套接字上等待 SCCN
客户端
- 我不知道那一边是怎么做的
据我了解,进一步的通信将通过第二个标准套接字进行,并且隧道 id 零仅接收 SCCRQ
很高兴能澄清这些细节