我已经在这个问题上纠结了好久,就是搞不清楚我做错了什么。我试图实现的是拦截数据包(IP 和 TCP),更改其标头,然后将其发送到其原始目的地。我当前的设置如下:
我有一个名为 的 TUN 接口tun_in
和我的 wifi 卡(名为wlp0s20f3
),其配置如下
3: wlp0s20f3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP group default qlen 1000
link/ether --:--:--:--:--:-- brd ff:ff:ff:ff:ff:ff
inet 192.168.178.69/24 brd 192.168.178.255 scope global dynamic noprefixroute wlp0s20f3
valid_lft 852237sec preferred_lft 852237sec
inet6 ----:----:----:--:----:----:----:----/64 scope global dynamic noprefixroute
valid_lft 6726sec preferred_lft 3126sec
inet6 ----::----:----:----:----/64 scope link noprefixroute
valid_lft forever preferred_lft forever
27: tun_in: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 500
link/none
inet 192.168.178.69/24 scope global tun_in
valid_lft forever preferred_lft forever
我还有一个程序,它使用 libpnet(一个用于低级网络的 rust 库https://github.com/libpnet/libpnet)) 监听 TUN 接口上的所有传入数据包,并将它们转发到我的 wifi 卡。该程序还会将所有 ICMP 数据包(传入我的 wifi 卡)发送回 TUN 接口。
因此,它有点像一座桥梁(例如TUN -> wlp和WLP -> TUN)。
这也有点用(例如在Wireshark中所有预期的数据包都存在)
(重复项一次在 wlp 接口上,一次在 tun_in 接口上(根据我的理解))
因此,基于此,我们可以看到数据包正确地穿越了网络。问题是我使用的 ping 命令 ( ping 8.8.8.8 -4 -I tun_in
) 没有看到任何传入数据包。这意味着数据包必须在内核的某个地方被丢弃(对吗?)(因为 Wireshark 可以看到它们,但 ping 看不到它们)。
我使用 dropwatch 来检查,它告诉我
39 drops at tun_net_xmit+2df (0xffffffffc1735d7f) [software]
94 drops at icmp_rcv+1fb (0xffffffffb9eaa6eb) [software]
37 drops at tun_net_xmit+2df (0xffffffffc1735d7f) [software]
7 drops at unix_stream_connect+344 (0xffffffffb9f14764) [software]
113 drops at tun_net_xmit+2df (0xffffffffc1735d7f) [software]
87 drops at tun_net_xmit+2df (0xffffffffc1735d7f) [software]
93 drops at tun_net_xmit+2df (0xffffffffc1735d7f) [software]
93 drops at icmp_rcv+1fb (0xffffffffb9eaa6eb) [software]
12 drops at tun_net_xmit+2df (0xffffffffc1735d7f) [software]
这也许可以解释为什么应用程序(ping)看不到响应,但我不知道为什么数据包会被丢弃(并且我也不知道我可以用数据包在icmp_rcv
和处被丢弃的信息做什么icmp_rcv
)。
其他我不太确定的是:当我的应用程序打开 tun 接口并写入时。这些数据包是被视为传入的(例如,好像它们来自“线路”)还是传出的(这可能是绑定到接口的 ping 命令tun_in
看不到数据包的另一种可能解释)?
如果有人能提供帮助,我将不胜感激。
提前致谢。