伪装 docker 接口和主机接口

Masquerading docker interface and host interface

我是运行主机上的docker,我想将docker(TUN接口)内的特定接口连接到主机的外部网络。

当 运行 ifconfig 在 docker 内时,我看到 3 个接口:eth0lomy_tun(tun 接口) . 在主机上,我看到lodocker0enp7s0(外网)。 我寻求的结果是,在 my_tun 接口上发送的数据包将被发送到 enp7s0.

如果 TUN 接口不在 docker 内,我会这样做:

sysctl -w net.ipv4.ip_forward=1
sudo iptables -t nat -A POSTROUTING -o enp7s0 -j MASQUERADE

所以我的问题是如何使用属于 docker 容器的 TUN 接口(最好在 Ubuntu 上)。

提前致谢!

终于用中间网络解决了。 我创建了一个桥接类型的 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