首页 > 解决方案 > 访问不同子网中的 docker 容器(网桥)

问题描述

我想访问另一个子网(不同的网桥)中的容器。src 和 dst 桥通过 veth-pair 连接。

这对于我想操纵这些网桥之间的连接属性(速率、延迟等)的测试设置是必需的。这些网桥中的我的虚拟机能够相互ping通,但不能ping通容器(如果它们连接到另一个网桥,则虚拟机或其他容器都不能。

首先,我在没有任何网络配置的情况下启动容器,并尝试将它们在主机上的 veth 对应物连接到我也手动创建的那些网桥。

实际上,我间接创建了那些桥梁

docker network create --subnet 192.168.1.0/26 \
  -o "com.docker.network.bridge.enable_icc"="true" \
  -o "com.docker.network.driver.mtu"="1500" \
  -o "com.docker.network.bridge.name"="br-side-a" \
  br-side-a
docker network create --subnet 192.168.1.64/29 \
  -o "com.docker.network.bridge.enable_icc"="true" \
  -o "com.docker.network.driver.mtu"="1500" \
  -o "com.docker.network.bridge.name"="br-side-b" \
  br-side-b

并将它们与

ip link add dev vsidea type veth peer name vsideb
brctl addif br-side-a vsidea
brctl addif br-side-b vsideb
ip addr add 192.168.1.10/26 dev vsidea
ip addr add 192.168.1.66/29 dev vsideb
ip link set vsidea up
ip link set vsideb up

我连接到这些网桥的虚拟机(具有连接子网的 IP)能够相互 ping 通。

我的容器是这样开始的:

docker run -ti --network br-side-a --ip 192.168.1.20 -p 10001:10000 --name csidea --privileged debian bash
docker run -ti --network br-side-a --ip 192.168.1.67 -p 10001:10000 --name csideb --privileged debian bash

我可以在每个子网的两个容器上 ping 所有(gateway-ips、vsidea/b、...),但不能 ping 我分配给这些容器的 IP。虚拟机也无法访问容器 IP。

我认为 docker 做了一些我必须关闭的路由/过滤,但我不知道怎么做。

标签: dockernetworking

解决方案


所以我找到了解决我的问题的方法。就像提到的 docker 过滤,我现在知道了。

Docker 自动创建 iptables 规则来限制已创建网桥的网络访问。为了展示它们iptables [-L|-S],应该使用三个特定的规则链“DOCKER-USER”、“DOCKER-ISOLATION-STAGE-1”和“Docker-ISOLATION-STAGE-2”。

这些隔离阶段链中的规则确实阻止了我的网络之间的联网。它们采用以下形式:

-I DOCKER-ISOLATION-STAGE-1 -i <my_network> ! -o <my_network> -j DOCKER-ISOLATION-STAGE2
-I DOCKER-ISOLATION-STAGE-2 -i <my_network> ! -o <my_network> DROP

我首先设置了从 DROP 到 ACCEPT 的最后一条规则,只是为了证明我的发现是正确的。并查看这些网络之间的网络工作。

所以我搜索了如何阻止 docker 创建这些规则,但是您只能禁用 docker 创建任何 iptables 条目,而不仅仅是其中一些。此外,不建议更改隔离链,但 DOCKER-USER 链正是为此目的。它将在任何其他 docker 规则之前进行评估,因此您可以指定接受这些包而不是丢弃它们。为您将允许通信的每个子网添加以下规则iptables -I DOCKER-USER -i <my_bridge_network> ! -o <my_bridge_network> ACCEPT

PS:对不起我的英语。我希望这是可以理解的,但如果有无法忍受的错误,请随时给我一个提示,我该如何做得更好。


推荐阅读