如何欺骗网桥重定向不属于任何接口的 IP 的包

如何欺骗网桥重定向不属于任何接口的 IP 的包

当 IP 和端口的特定匹配通过时,我想通过虚拟网桥重定向接口之间的流量。

例如,当我通过虚拟接口连接到来宾内部的10.20.30.40端口时,该虚拟接口通过虚拟网桥到达我的物理接口,我想拦截该流量并将其重定向到主机上的端口而不是访问互联网,这似乎很容易,首先在主机上打开服务器:2222tun127.0.0.13333

nc -vkl 127.0.0.1 3333

现在iptables在主机上应用规则:

sudo iptables \
  -t nat -A OUTPUT -p tcp \
  -d 10.20.30.40 --dport 2222 \
  -j DNAT --to-destination 127.0.0.1:3333

现在测试一下可以在主机上运行:

nc -vzw5 10.20.30.40 2222

很好,它似乎可以在主机上本地运行,但是在来宾上运行时出现问题:

docker run --rm -it alpine:3.9 nc -vzw5 10.20.30.40 2222

事情是docker创建一个虚拟桥,因此流量不再是主机上的本地流量,在我的研究中,我发现了一些可以在主机上应用的规则:

sudo iptables -t nat -A PREROUTING -p tcp \
  -d 10.20.30.40 --dport 2222 -j DNAT --to-destination 127.0.0.1:3333
sudo iptables -t nat -A POSTROUTING -p tcp \
  -d 127.0.0.1 --dport 3333 -j SNAT --to-source 10.20.30.40:2222

但它不起作用...当匹配特定规则时,如何使通过网桥的流量docker0重定向到lo主机上的接口?

部分场所:

  • 目标IP不属于任何接口子网;
  • 该解决方案不能涉及使用 DNS,也不能更改docker或上的主机/etc/hosts
  • 这些iptables规则应仅应用于主机;
  • 服务器必须分配给本地机器,流量不能泄漏到网络中,在这种情况下,任何访客都不能通过端口上的主机 IP 直接访问它3333,也不能被任何外部机器通过物理接口访问;

相关内容