我没有找到如何在IP上实现L2TPv3的示例
我只发现了L2TP的几个开源实现,
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具有大量的enum和用于netlink + l2tpip结构的命令。我对如何正确使用它们感到困惑。
L2TPv3控制交换建立的最后一部分(SCCRQ,SCCRP,SCCCN)。阅读内核文档后,我只有自己的理解,这可能不正确,但这里是正确的。
服务器端:
等待SCCRQ(据我了解,标头的控制连接ID等于0)
在隧道0套接字上收到的SCCRQ上
客户端
据我了解,进一步的通信将通过第二个标准套接字,并且隧道ID零仅接收SCCRQ
很高兴澄清这些细节
答案 0 :(得分:0)
很抱歉,此回复太晚了!但希望它对您或其他人仍然有用。
我将尝试依次解决您问题的各个方面。
但是我不明白为什么我们必须将netlink与标准套接字一起使用?
Linux L2TP子系统仅处理数据平面(即,通过L2TP会话承载的用户数据包)。用户空间的任务是处理控制平面(L2TP控制协议交换)。
从广义上讲,用户空间创建一个隧道套接字,以便与对等方交换L2TP控制消息。建立隧道(SCCRQ / SCCRP / SCCCN)后,在创建内核隧道上下文时,将使用netlink API将隧道FD传递给内核。然后将该隧道FD用于该隧道中的会话数据包。
内核头文件:https://github.com/torvalds/linux/blob/master/include/uapi/linux/l2tp.h,其中包含大量的enum和用于netlink + l2tpip结构的命令。我对如何正确使用它们感到困惑。
此博客文章可能会帮助您:Linux and L2TP -- a peek under the hood。它涵盖了netlink API中的命令,并概述了如何使用它们。
L2TPv3控制交换建立的最后一部分(SCCRQ,SCCRP,SCCCN)。阅读内核文档后,我只有一个自己的理解,那就是不正确,但在这里是正确的。
在服务器端,您大致上是正确的,但需注意以下几点:
connect(2)
到对等方的地址和隧道ID。客户端...我不知道该怎么做
这与服务器端的基本过程相同。
用户空间应该执行控制协议消息交换(SCCRQ / SCCRP / SCCCN),一旦成功完成,就使用netlink消息在内核中实例化L2TP隧道上下文。
sendto(2)
语义。据我了解,进一步的通信将通过第二个标准套接字,并且隧道ID零仅接收SCCRQ
是的。认为隧道ID为零的套接字的一种方法是类似于您listen(2)
用于HTTP服务器的套接字。套接字的目的是接收对知名端口的请求,随后的消息交换将通过不同端口上特定于连接的套接字进行。
当然IP没有端口,但是零隧道ID对于L2TPv3 IP封装服务器起着相同的作用。