我正在一台主机上运行 docker,我想将 docker 内的特定接口(TUN 接口)连接到主机的外部接口。
在 docker 内运行
ifconfig
时,我看到 3 个接口:eth0
、lo
和 my_tun
(tun 接口)。
在主机上,我看到 lo
、docker0
和 enp7s0
(外部网络)。
我寻求的结果是,在 my_tun
接口上发送的数据包将被发送到 enp7s0
。
如果 TUN 接口不在 docker 内部,我会这样做:
sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o enp7s0 -j MASQUERADE
所以我的问题是如何使用属于 docker 容器(最好在 Ubuntu 上)的 TUN 接口来完成此操作。
提前致谢!
我最后用中间网络解决了这个问题。 我创建了一个桥接类型的 docker 网络,并将其连接到容器和主机。然后,我在容器内使用 iptables 规则将通信从 tun 设备转发到网络,并在主机上使用类似规则将通信从网络转发到外部接口。
因此,假设网络名为
proxy_net
,其 docker 接口为 proxy_net0
,其网关为 192.168.1.254
。
容器内部:
iptables -A FORWARD -i my_tun -o proxy_net0 -j ACCEPT
iptables -A FORWARD -i proxy_net0 -o my_tun -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A POSTROUTING -t nat -o proxy_net0 -j MASQUERADE
ip route replace default via 192.168.1.254 dev proxy_net0
在主机上:
sudo iptables -A FORWARD -i proxy_net -o enp7s0 -j ACCEPT
sudo iptables -A FORWARD -i enp7s0-o proxy_net -m state --state ESTABLISHED,RELATED -j ACCEPT
sudo iptables -A POSTROUTING -t nat -o enp7s0 -j MASQUERADE