在路由器和服务器之间至少使用了两个 VLAN,20/21。它们都在同一个网络上,但使用 VRF(路由器端)在逻辑上拆分为单独的实体。这个想法是 VRF 客户 A 与 VRF 客户 B 具有相同的 IP 地址方案,服务器也是相同的 IP 地址,但每个提供不同的服务。
我需要两个 Docker 容器,一个用于 VLAN 20/21。它们需要具有相同的 IP 地址和相同的网络地址。我相信这可能通过使用命名空间/veth 桥来实现。有人能指出我正确的方向吗?如果无法使用 Docker,替代解决方案会有所帮助。
这是我想出的(注意其中一些删除了清理):
#!/bin/bash
echo “删除现有的网络名称空间...” sudo ip netns delete vlan20_ns 2>/dev/null ||真的 sudo ip netns delete vlan21_ns 2>/dev/null ||真
echo “正在创建网络名称空间...” sudo ip netns 添加 vlan20_ns sudo ip netns 添加 vlan21_ns
echo “删除现有的 VLAN 接口...” sudo ip link delete ens3.20 2>/dev/null ||真的 sudo ip link delete ens3.21 2>/dev/null ||真
echo “正在创建 VLAN 接口...” sudo ip link 添加链接 ens3 名称 ens3.20 类型 vlan id 20 sudo ip link 添加链接 ens3 名称 ens3.21 类型 vlan id 21
echo“将 VLAN 接口移动到名称空间...” sudo ip 链接设置 ens3.20 netns vlan20_ns sudo ip link set ens3.21 netns vlan21_ns
echo “正在命名空间中配置接口和路由……” sudo ip netns exec vlan20_ns ip addr add 10.0.20.254/24 dev ens3.20 sudo ip netns exec vlan20_ns ip link set ens3.20 up sudo ip netns exec vlan20_ns ip route add default via 10.0.20.1
sudo ip netns exec vlan21_ns ip addr add 10.0.20.254/24 dev ens3.21 sudo ip netns exec vlan21_ns ip link set ens3.21 up sudo ip netns exec vlan21_ns ip route add default via 10.0.20.1
echo “删除现有的 Docker 容器...” sudo docker rm -f nginx-vlan20 2>/dev/null ||真的 sudo docker rm -f nginx-vlan21 2>/dev/null ||真
echo “用 Nginx 镜像启动 Docker 容器……” sudo docker run -d --name nginx-vlan20 --net=none --restart=unless-stopped nginx sudo docker run -d --name nginx-vlan21 --net=none --restart=unless-stopped nginx
echo “获取容器的 PID 并将 veth 接口移动到容器......” pid_vlan20=$(sudo docker inspect -f '{{.State.Pid}}' nginx-vlan20) pid_vlan21=$(sudo docker inspect -f '{{.State.Pid}}' nginx-vlan21)
echo “正在创建 veth 对并将它们移动到命名空间……” sudo ip link add name veth0 类型 veth peer name veth0_peer netns $pid_vlan20 sudo ip link add name veth1 类型 veth peer name veth1_peer netns $pid_vlan21
sudo ip link set veth0 netns vlan20_ns sudo ip 链接设置 veth1 netns vlan21_ns
sudo ip netns exec vlan20_ns ip link set veth0 up sudo ip netns exec vlan21_ns ip link set veth1 up
sudo nsenter -t $pid_vlan20 -n ip link set veth0_peer name eth0 sudo nsenter -t $pid_vlan21 -n ip link set veth1_peer name eth0
echo “正在将 Docker 容器内的网络接口设置为启动状态……” sudo nsenter -t $pid_vlan20 -n ip link 设置eth0 sudo nsenter -t $pid_vlan21 -n ip link set eth0
echo “正在使用 IP 地址配置容器端接口并设置它们……” sudo nsenter -t $pid_vlan20 -n ip addr add 10.0.20.2/24 dev eth0 sudo nsenter -t $pid_vlan21 -n ip addr add 10.0.20.2/24 dev eth0
echo “正在 Docker 容器内设置默认网关……” sudo nsenter -t $pid_vlan20 -n ip route add default via 10.0.20.1 sudo nsenter -t $pid_vlan21 -n ip route add default via 10.0.20.1
echo “网络命名空间和 Docker 容器已成功配置。”
似乎不允许码头工人 ping 透视网络,即使使用网桥也是如此。不确定这是否已正确完成。