【发布时间】:2019-11-09 15:04:35
【问题描述】:
我没有找到任何如何通过 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 结构(套接字创建 + 绑定),其中隧道 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 套接字创建带有 local_tunnel_id 的隧道
- 发送 SCCRP,其标头的控制连接 ID 等于 received_tunnel_id 和 AVL 分配的控制连接 ID 等于 local_tunnel_id
- 在该套接字上等待 SCCN
客户端
- 不知道那边是怎么做的
据我了解,进一步的通信将通过第二个标准套接字进行,并且隧道 id 零仅接收 SCCRQ
很高兴了解这些细节
【问题讨论】:
标签: sockets linux-kernel tunnel netlink l2tp