从 TUN 设备发送数据包

从 TUN 设备发送数据包

我一直试图通过用户空间程序传递系统中的所有流量。为此,我编写了一个程序,该程序创建了一个 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上的数据包,但是没有在POSTROUTINGstep 以及 mangle 表的其他链(INPUTFORWARD、 )上发现。OUTPUT

我已经在考虑使用原始 IP 套接字来发送数据包而不是写入设备,但仍然相信使用 TUN 和路由策略一定是可能的。

期待任何想法。

答案1

部分答案:

Linux 内核检测到来自网络接口(在本例中为tun0)的数据包源自同一台机器,认为网络中某处存在路由配置错误(肯定存在路由环路,否则数据包不会返回),并立即丢弃该数据包以防止网络洪泛。

您可以关闭此功能(我忘记了如何执行此操作的详细信息,我必须查找它们),但正确的解决方案可能是做其他事情而不是您正在做的事情。

例如,为了模拟第二台主机进行 MITM 攻击,您可以创建TUN 接口,从第一个接口读取并将操作过的数据包写入第二个接口,对于传出的数据包,对传入的数据包执行相同的操作(可能使用不同的操作),然后将第二个 TUN 接口与物理接口一起放在网络命名空间中。

详细信息取决于你的最终目标,你没有告诉我们(因此也请阅读XY问题,这里你的 Y 是“我需要一个与路由一起的单一回显 TUN 接口”)。

相关内容