无法在docker容器中进行IP转发工作

无法在docker容器中进行IP转发工作

我想设置一个游乐场来测试一些 nftables 防火墙规则,然后再将它们放在真正的路由器上。 Docker 容器似乎是一个很好的轻量级工具。此测试的先决条件是其中一个容器需要充当其他容器的路由器。当 Linux 机器是裸机(或完全虚拟化)时,我可以毫无问题地将其用作路由器。但是当是docker容器时就不行了。

因此,我创建了 2 个网络,tmp_21并且tmp_22

docker network create --driver=bridge --subnet=172.21.0.0/16 --gateway=172.21.0.1 tmp_21
docker network create --driver=bridge --subnet=172.22.0.0/16 --gateway=172.22.0.1 tmp_22

创建路由器盒,使其连接到上述两个网络:

docker run \
--name tmp_router -h tmp_router \
--cap-add=NET_ADMIN --cap-add=SYS_MODULE \
--sysctl net.ipv4.conf.all.forwarding=1 --sysctl net.ipv4.tcp_timestamps=0 \
--net tmp_21 --ip 172.21.0.20 \
-it debian /bin/bash

# On the host machine:
docker network connect tmp_22 tmp_router --ip 172.22.0.20

创建 2 个测试盒,每个网络一个:

docker run \
--name tmp_box21 -h tmp_box21 \
--cap-add=NET_ADMIN \
--net tmp_21 --ip 172.21.0.21 \
-it debian /bin/bash

docker run \
--name tmp_box22 -h tmp_box22 \
--cap-add=NET_ADMIN \
--net tmp_22 --ip 172.22.0.22 \
-it debian /bin/bash

从此时起,两个盒子都可以分别 ping 通 172.21.0.20 和 172.22.0.20 上的路由器。

现在我想让它tmp_box21能够 ping 通tmp_box22。我在其中tmp_box21添加了这条路线:

ip route add 172.22.0.0/16 via 172.21.0.20

从此时起,tmp_box21不仅可以在 172.21.0.20 上 ping 路由器,而且还可以在 172.22.0.20 上 ping 路由器。

但是,这并不能使其能够 pingtmp_box22通 172.22.0.22!

为什么?

nft list ruleset请注意,路由器上的输出为空。

答案1

缺少通过 172.22.0.22 的向后路由 172.21.0.0/16。我确定 tmp_box22 收到 ping 数据包,但回程失败

相关内容