伪装docker接口和主机接口

问题描述 投票:0回答:1

我正在一台主机上运行 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 接口来完成此操作。

提前致谢!

linux docker docker-networking tun masquerade
1个回答
2
投票

我最后用中间网络解决了这个问题。 我创建了一个桥接类型的 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
© www.soinside.com 2019 - 2024. All rights reserved.