我已经使用以下脚本在主机上设置了 TUN 设备:
echo 1 > /proc/sys/net/ipv4/ip_forward
#do NAT on packets from our 'local' net
iptables -t nat --flush POSTROUTING
iptables -t nat -A POSTROUTING -s 10.0.0.0/8 -o eth0 -j MASQUERADE
#initialise the tun device (tun0)
ip tuntap add dev tun0 mode tun
#give the tun device IP 10.0.0.1
ifconfig tun0 10.0.0.1 netmask 255.255.255.0 up
#disable IPv6 on tun device
sysctl net.ipv6.conf.tun0.disable_ipv6=1
#some firewall rules
iptables -A INPUT -i tun0 -d 127.0.0.0/8 -j DROP
我正在尝试通过 wifi 将 UDP 数据包从主机发送到笔记本电脑。连接到 TUN 设备的应用程序是一个服务器应用程序,它使用类似于 SOCKS5 的协议来获取格式化的 TCP 数据包,构建 UDP/IP 数据包,并将它们发送到具有虚构的源 IP 的指定地址(出于某种原因)。
通过源地址为 10.0.0.2 的 TUN 发送 UDP 数据包可以正常工作。我可以通过更改网络掩码将其提高到 10.0.0.0/8,但是当我将要通过 TUN 设备发送的 IP 数据包的源 (!) ip 设置为 192.168.2.112(我主机的实际 IP)时,TUN 设备会接收它,但我的笔记本电脑不会收到它。使用 python 发送 UDP 数据报通常可以按预期工作,并且我的笔记本电脑会读取正确的源 IP。当源 IP 在 10.0.0.0/8 范围内时,TUN 设备会发送构造的数据包,但当源 IP 在 192.* 范围内时则不会。
在使用脚本之前,两台机器上的 iptables 都是空的。我遗漏了什么?
/proc/sys/net/ipv4/conf/all/rp_filter: 1
/proc/sys/net/ipv4/conf/default/rp_filter: 1
/proc/sys/net/ipv4/conf/enp0s31f6/rp_filter: 1
/proc/sys/net/ipv4/conf/lo/rp_filter: 0
/proc/sys/net/ipv4/conf/tun0/rp_filter: 1
/proc/sys/net/ipv4/conf/wlp4s0/rp_filter: 1
/proc/sys/net/ipv4/conf/wwp0s20f0u3c2/rp_filter:1
答案1
重复一遍,您的应用程序生成一个带有某个源地址的数据包,将其放入 tun 接口,您的主机转发它,在 上伪装它eth0
,然后从 eth0 以某种神秘的方式通过 WLAN 发送到您的笔记本电脑。这适用于 10.0.0.2 作为源,但不适用于 192.168.2.112。
然而实际上你没有eth0
接口,但是接口是enp0s31f6
、wlp4s0
和wwp0s20f0u3c2
。
它是否正确?
如果是,那么可能的原因是您需要在 WLAN 接口上进行伪装,而不是eth0
,并且您需要伪装所有源地址,而不仅仅是 10.0.0.0/8。真正的问题是它最初是如何对 10.0.0.2 起作用的,但这可能是由您未告诉我们的配置部分解释的。
您可能需要在 WLAN 上进行伪装,因为否则您必须在网络的其他部分设置路由。
调试工具:ip route get 1.2.3.4
检查tcpdump -ni wlp4s0
所有接口上的路由等,可能会对查看数据包的实际去向感兴趣。