我想设置一个游乐场来测试一些 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 数据包,但回程失败