总之
从 TUN 接口读取的数据包在写回同一 TUN 接口时找不到路径。
在全
设想:
在一台机器上只有1连接到互联网的NIC(eth0),我编写了一个从TUN接口读取IP数据包的应用程序;那么它可能:
- 将数据包不做任何更改写回到同一个 TUN 接口
- 块数据包
- 对数据包进行更改(例如加密其有效负载)并将受操作的数据包写回 TUN 接口。
完毕:
我已经完成了以下步骤:
- 我运行我的程序。它分配并实例化 TUN 设备并等待设备启动。
然后我执行以下命令:
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
现在我的程序开始成功读取数据包(并打印/记录其内容)。
- 我的程序,写回数据包没有任何改变返回 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
。除了在您的情况下听起来,数据包由于“反向路径过滤器”而被丢弃,即它拒绝将数据包从它们进入的同一接口中弹回。