当 IP 和端口的特定匹配通过时,我想通过虚拟网桥重定向接口之间的流量。
例如,当我通过虚拟接口连接到来宾内部的10.20.30.40
端口时,该虚拟接口通过虚拟网桥到达我的物理接口,我想拦截该流量并将其重定向到主机上的端口而不是访问互联网,这似乎很容易,首先在主机上打开服务器:2222
tun
127.0.0.1
3333
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
,也不能被任何外部机器通过物理接口访问;