【问题标题】:TUN/TAP write back to tunnelTUN/TAP 写回隧道
【发布时间】:2012-10-15 23:45:12
【问题描述】:

我的应用正在使用一个 TUN,比如 tun0。在设计中,我的应用程序将收到一个包含完整 IP 层的 UDP,然后我将取出 IP 层,然后使用“文件写入”将它们放入我自己的 tun0 设备中,据说在设计中,我应该可以读取再次从 tun0 发出数据包。

现在的情况是我可以通过 tcpdump 看到包被写入隧道,但我无法读回它们。

隧道设置或路由设置有问题?

提前致谢

【问题讨论】:

    标签: tun


    【解决方案1】:

    您的第二个 tun0 不是 FIFO 队列。您的设计中可能存在使用第二个 tun0 设备的方式和原因的问题。澄清你为什么使用它以及应该阅读哪个过程。正确的方法应该源于该澄清。

    如果您想读取发送给您的数据,您有一些选择。

    • 打开时将 tun0 连接到 TCP 或 UDP 回显服务。然后,这会将您塞入其中的数据包发回给您。
    • 为要连接的第二个 tun0 打开一个侦听器。然后连接到它并将数据包发送到该连接。从侦听器端读取您的数据。
    • 用两个文件描述符打开一个管道。写入一个描述符并从另一个描述符读取。派生子时,管道通常用于 IPC(进程间通信)。
    • 创建一个套接字并从中读取数据。打开套接字的另一端进行写入。套接字通常用于允许其他进程与一个进程进行通信。当调用进程的生命周期可能与侦听进程的生命周期不同时,这很有效。
    • 在内存中创建一个缓冲区或队列来存储数据。

    【讨论】:

    • 恩,我使用的方式与第二个选项类似:在初始化过程中,我打开一个文件描述符说 tunfd 连接 tun0,然后将其放入 epoll 以侦听任何传入。在我将IP包写入之后,假设一旦我从epoll收到任何信号,我就会通过读取tun0从tun0中读取数据包。方法对吗?
    • 顺便说一下,我用同一个tun0写然后读。我猜数据包可能会循环回 tun0 而不是物理发送出去。
    • 您确定您打开的是隧道连接而不是名为 tun0 的管道吗?如果你真的在使用网络隧道,你应该在使用它之前设置一个 IP 连接。
    • En。是的,在使用tun0之前,我绑定了一个IP。当数据包来自外部时,它工作正常。问题是:当我尝试将数据包写入 tun0 设备,然后通过文件读取将它们读回时,它不起作用。 strerr(errno) 说“资源暂时不可用”。它看起来不知何故 tun0 中的循环不起作用。
    • @Yang tun0 通常不是环回设备。当您写入 tun0 时,另一端应该在读取它们而不是您。我已经重写了我上面的回复。仅仅因为您可以或可以将 tun0 用作 FIFO 并不是一个好主意。
    猜你喜欢
    • 1970-01-01
    • 2014-01-26
    • 1970-01-01
    • 2011-08-26
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2021-08-15
    • 1970-01-01
    相关资源
    最近更新 更多