![如何为实际物理网络接口创建 tun 设备?](https://linux22.com/image/122211/%E5%A6%82%E4%BD%95%E4%B8%BA%E5%AE%9E%E9%99%85%E7%89%A9%E7%90%86%E7%BD%91%E7%BB%9C%E6%8E%A5%E5%8F%A3%E5%88%9B%E5%BB%BA%20tun%20%E8%AE%BE%E5%A4%87%EF%BC%9F.png)
我正在尝试编写一个 C 程序,为我的电脑物理接口创建一个 tun 设备接口。整个想法是,当我在隧道设备上写入任何原始数据包时,它会将其放入我的实际物理接口中。我的问题是如何将 tun 设备映射到实际的物理接口?
例如,我的 eth1 的 IP 地址为 - 10.16.1.152。如何创建 tun 设备以便可以在 eth1 接口上读取/写入?我需要提供相同的 IP 地址还是不同的 IP 地址?是我在 tun 设备上写入数据包并创建一条将 tun 设备的默认网关作为 phy 设备的路由的唯一方式。
我正在关注这个例子,但我还不清楚这个概念。
我通过以下命令创建了隧道设备。我的电脑有一个真正的以太网接口。该以太网接口IP地址10.16.1.152连接到一堆PC,然后连接到网关服务器以访问互联网。
我正在尝试编写一个 C 程序,将 OSPF hello 数据包写入接口。
为此,我创建了一个隧道设备,以便可以在其上写入 OSPF hello 数据包。但在这样做之前,我要检查隧道设备。这里我的隧道设备是 11.11.11.2/24,我正在设置路由获取 10.16.1.152。我的理解是,在实际接口(即10.16.1.152)上接收或发送的所有数据包都将被该隧道设备接口接收,其IP地址为11.11.11.2。但是,当我对 10.16.1.152 执行 ping 操作时,收到的 RX/Tx 数据包仍然为零。所以,我认为我的隧道没有收到任何数据包。
ip tuntap add mode tun dev tun0
ip addr add 11.11.11.2/24 dev tun0
ip link set dev tun0 up
ip route get 10.16.1.152
我在这里缺少任何概念吗?我怎样才能这样做呢?我仍然在努力弄清楚我的隧道设备概念。
答案1
您不能使用tun
接口“将实际数据包放入现有接口中”。接口tun
始终是新的网络接口,与所有现有接口不同。
但你可以使用数据包套接字将原始数据包写入现有网络接口(或从中读取原始数据包)。man 7 packet
详情请参阅。但是你用这个绕过了所有协议层,所以你必须自己实现正确的协议行为,所以除非你真的,真的知道自己在做什么,不要这样做。
你没有说出你真正想要实现的目标,而且你似乎对这些概念有点困惑,所以这可能是一个XY问题,并且完全有可能tun
接口和数据包套接字都不是您真正需要的。