我一直试图通过用户空间程序传递系统中的所有流量。为此,我编写了一个程序,该程序创建了一个 TUN 设备,从中读取数据包并按原样写回。然后我尝试以以下方式操纵路由:
首先,将除本地之外的所有内容重定向到隧道。这可以正常工作。
ip link set tun0 up
ip addr add 10.0.0.1/24 dev tun0
echo 100 test >> /etc/iproute2/rt_tables
ip route add default via 10.0.0.2 dev tun0 table test
ip rule add from all lookup test priority 10000
其次,将数据包从隧道路由到我的物理设备。这是有问题的步骤。
echo 101 test0 >> /etc/iproute2/rt_tables
ip route add default via 172.31.4.1 dev wlp3s0 table test0
ip rule add from all iif tun0 lookup test0 priority 9000
按照我的想法,这样的配置应该可以让我默认访问互联网。但是却没有。
使用 iptables 日志记录我发现数据包正确到达并离开 tun0 设备,但随后它们消失了更详细地说,我正在做这样的事情:
iptables -t mangle -A PREROUTING -i tun0 -j LOG --log-prefix "From tun0: "
iptables -t mangle -A PREROUTING -i tun0 -j MARK --set-mark 0x7
iptables -t mangle -A POSTROUTING -m mark --mark 0x7 -j LOG --log-prefix "From tun0 (postrouting): "
PREROUTING
在 syslog 中发现了 step上的数据包,但是没有在POSTROUTING
step 以及 mangle 表的其他链(INPUT
、FORWARD
、 )上发现。OUTPUT
我已经在考虑使用原始 IP 套接字来发送数据包而不是写入设备,但仍然相信使用 TUN 和路由策略一定是可能的。
期待任何想法。
答案1
部分答案:
Linux 内核检测到来自网络接口(在本例中为tun0
)的数据包源自同一台机器,认为网络中某处存在路由配置错误(肯定存在路由环路,否则数据包不会返回),并立即丢弃该数据包以防止网络洪泛。
您可以关闭此功能(我忘记了如何执行此操作的详细信息,我必须查找它们),但正确的解决方案可能是做其他事情而不是您正在做的事情。
例如,为了模拟第二台主机进行 MITM 攻击,您可以创建二TUN 接口,从第一个接口读取并将操作过的数据包写入第二个接口,对于传出的数据包,对传入的数据包执行相同的操作(可能使用不同的操作),然后将第二个 TUN 接口与物理接口一起放在网络命名空间中。
详细信息取决于你的最终目标,你没有告诉我们(因此也请阅读XY问题,这里你的 Y 是“我需要一个与路由一起的单一回显 TUN 接口”)。