设想:

设想:

总之

从 TUN 接口读取的数据包在写回同一 TUN 接口时找不到路径。

在全

设想:

在一台机器上只有1连接到互联网的NIC(eth0),我编写了一个从TUN接口读取IP数据包的应用程序;那么它可能:

  • 将数据包不做任何更改写回到同一个 TUN 接口
  • 块数据包
  • 对数据包进行更改(例如加密其有效负载)并将受操作的数据包写回 TUN 接口。

完毕:

我已经完成了以下步骤:

  1. 我运行我的程序。它分配并实例化 TUN 设备并等待设备启动。
  2. 然后我执行以下命令:

    ifconfig tun0 up ifconfig tun0 10.0.0.2 route add -net 0.0.0.0 netmask 0.0.0.0 dev tun0 echo 1 > /proc/sys/net/ipv4/ip_forward

  3. 现在我的程序开始成功读取数据包(并打印/记录其内容)。

  4. 我的程序,写回数据包没有任何改变返回 tun0 设备

问题

写回的数据包,找不到返回的路由,例如到 eth0 或到应用层。例如,当我执行 ping 时:

ping 4.2.2.4

在另一个终端上:

tshark -i tun0

我看到 tun0 看到了 ICMP echo 数据包(也是我的程序):

 10.0.0.2 → 4.2.2.4      ICMP 84 Echo (ping) request  id=0x14b1, seq=2/512, ttl=64
 10.0.0.2 → 4.2.2.4      ICMP 84 Echo (ping) request  id=0x14b1, seq=3/768, ttl=64
 10.0.0.2 → 4.2.2.4      ICMP 84 Unknown ICMP (obsolete or malformed?)

我的程序将数据包写回到 tun0 并tshark看到它(在上面的代码片段中)

但是ICMP请求没有到达以太网0所以它可以找到它的方式4.2.2.4。恕我直言,路由规则有问题,但我不知道如何修改它。

欢迎任何评论,问候

答案1

当然,路由规则有问题,您告诉内核将所有数据包路由出去tun0:)。当您将该数据包发送回 时tun0,它会再次路由回tun0,而不是eth0。除了在您的情况下听起来,数据包由于“反向路径过滤器”而被丢弃,即它拒绝将数据包从它们进入的同一接口中弹回。

相关内容