Hetzner 和 CNI 上的子网容器桥接网络

Hetzner 和 CNI 上的子网容器桥接网络

我正在尝试创建一个虚拟机和容器的私有网络Hetzner 云。我已经在我的本地家庭网络上测试了这个设置并且一切运行正常。

计划是为虚拟机建立一个私有网络(10.0.0.0/8仅用于测试)。为了进行测试,我使用10.10.0.110.10.0.2作为虚拟机。并且每个虚拟机都将有一个 CNI 桥接网络(例如:172.20.0.0/16用于容器)。我希望使用静态路由使网络上的任何虚拟机都可以访问桥接网络10.0.0.0/8

在 Hetzner 上,我配置了静态路由172.20.0.0/16 to 10.10.0.1。在 上,10.10.0.1我为 Podman 配置了一个 CNI 桥接网络,配置在同一范围内172.20.0.0/16

放置在该网络上的任何容器都可以轻松 ping 或连接本地、其他容器、主机或互联网,并且主机 ( 10.10.0.1) 可以轻松连接容器 ( 172.20.0.X)。

问题是当我想从 ping 容器时。我已经监控了和10.10.0.2的流量,并且 Hetzner 路由似乎工作正常,因为连接到达( ) 上的 VM。这让我怀疑这是否是和桥接接口之间的路由问题?tcpdumpiftop10.10.0.1ens10ens10podman-vlan

以下是从10.10.0.1

default via 172.31.1.1 dev eth0 proto dhcp src X.Y.Z.W metric 100 
10.0.0.0/8 via 10.0.0.1 dev ens10 
10.0.0.1 dev ens10 scope link 
172.17.0.0/16 dev docker0 proto kernel scope link src 172.17.0.1 
172.20.0.0/16 dev podman-vlan proto kernel scope link src 172.20.0.1 
172.31.1.1 dev eth0 proto dhcp scope link src X.Y.Z.W metric 100 

10.10.0.2虚拟机上,我只做了一个ip r add 172.20.0.0/16 via 10.0.0.1(似乎可以工作)。

我的期望是得到10.10.0.2 -> 10.0.0.1 -> 10.10.0.1 -> 172.20.0.1 -> 172.20.0.X。相反,一切似乎都迷失了10.10.0.1,包括如果我尝试ping -I ens10 172.20.0.X

这是 CNI 配置:

{
  "cniVersion": "0.4.0",
  "name": "podman",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "podman-vlan",
      "isGateway": true,
      "ipMasq": true,
      "promiscMode": true,
      "ipam": {
        "type": "host-local",
        "routes": [{ "dst": "0.0.0.0/0" }],
        "ranges": [
          [
            {
              "subnet": "172.20.0.0/16",
              "gateway": "172.20.0.1"
            }
          ]
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    },
    {
      "type": "firewall"
    },
    {
      "type": "tuning"
    }
  ]
}

提前致谢。

答案1

这是该 VM 和 iptables 上存在的 Docker 的问题。

检查iptables -L虚拟机

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
CNI-FORWARD  all  --  anywhere             anywhere

Docker 优先。因此,要么配置规则以将正确的接口转发到 CNI/Podman/Docker,要么根据需要进行配置。

就我的情况而言,删除 Docker 是一个选择,这样就可以解决所有问题。

相关内容