有两个位于同一网络上的容器组成示例:
version: '3.8'
services:
A:
image: alpine:3.18
container_name: container-a
B:
image: custom-alpine-with-two-interfaces
container_name: container-b
在容器中B
有两个接口: eth0
(docker default 172.26.0.2/16
) 和eth1
另外,在容器中我将默认A
网关设置为:。现在我想配置容器将所有传入的包从IP传递到。ip route add default via 172.26.0.2
B
B
eth0
A
eth1
如何实现这一目标?
(10.10.0.5) (10.10.0.6)
container A <-------> container B <-------> internet
(172.26.0.3) (172.26.0.2)
A
当我设置default via 172.26.0.2
并运行时traceroute example.com
,它卡在172.26.0.1
traceroute to example.com (1.1.1.1), 30 hops max, 46 byte packets
1 container_b (172.26.0.2) 0.004 ms 0.004 ms 0.004 ms
2 myshost.local (172.26.0.1) 0.004 ms 0.007 ms 0.006 ms
3 * * *
4 * * *
- 我也尝试了这个 iptables 配置,
B
但什么也没发生:
iptables -A FORWARD -i eth0 -o eth1 -j ACCEPT
iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
答案1
我想知道你为什么要在 iptables 中这样做。特别是因为我怀疑更完善的解决方案将会产生更多的“转发规则”。例如:
- 它是否会发展到拥有更广泛的第二层容器来转发数据包。
- 是否需要基于源、目的地或数据包内容的标准来决定如何转发。
也就是说,我怀疑会出现一个功能更齐全的(反向)代理......
您能否进一步分享一下您的理由?