我有一个应用程序,它创建了一个TUN设备,然后检查该接口上的所有数据包,并将它们写回TUN,以防检查成功。(想想防火墙)数据包的来源是我的防火墙应用程序运行的同一个设备。这台机器(VM,10.0.2.15
)可以使用主路由表(不需要设置)到达另一台计算机(主机、192.168.1.151
)。我现在的问题是,每当我通过防火墙应用程序发送数据包时,内核似乎都会丢弃它们。具体而言,当我在TUN接口上运行tcpdump时,会看到以下内容:
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on tun0, link-type RAW (Raw IP), capture size 262144 bytes
12:24:21.548119 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64
12:24:21.548248 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 1, length 64
12:24:22.555972 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
12:24:22.556087 IP 10.0.2.15 > 192.168.1.151: ICMP echo request, id 9967, seq 2, length 64
你可以看到每个包都被记录了两次。一旦它进入我的申请,一旦它出来。然而,从那以后,它似乎消失了。在接口上执行tcpdump --它应该面向我的主机--没有显示任何内容。
我已经在VM机器上配置了以下内容:
# enable forwarding and disable reverse path filtering
sudo sysctl net.ipv4.conf.default.rp_filter=0
sudo sysctl net.ipv4.conf.all.rp_filter=0
sudo sysctl net.ipv4.ip_forward=1
# routes for the packets to take
sudo ip rule add to 192.168.1.151/32 lookup 11 prio 11
sudo ip rule add iif tun0 lookup main priority 10
表11告诉数据包进入我的TUN设备。如tcpdump所示,这是可行的。
我还设置了iptables向前,输出链默认接受。此外,我使用netcat和UDP测试了流量,以排除数据包无法返回的问题。
我遗漏了什么?内核丢弃我的数据包的原因是什么?
发布于 2020-07-07 18:18:09
我有一个应用程序,它创建了一个TUN设备,然后检查该接口上的所有数据包,并将它们写回TUN,以防检查成功。我现在的问题是,每当我通过防火墙应用程序发送数据包时,内核似乎都会丢弃它们。
内核看到它发送出去的数据包,因此它得出结论,网络中一定有一个路由循环,为了防止网络被淹没,丢弃数据包。
您已经尝试过在rp_filter
中禁用该行为,但是您可能还需要设置accept_local
,因为您的TUN接口有一个本地地址。
更好的方法是将应用程序真正用作防火墙,让它创建两个TUN接口,一个传入和一个传出,并将其中一个或两者移动到需要时的网络命名空间/VM。
这样,您就可以避免类似于路由循环的内容。
https://unix.stackexchange.com/questions/597213
复制相似问题