如何解决AMHPOD容器在IP地址变更后的访问问题?

AMHPOD容器IP错误问题
宿主机是一台独立IP的国内主机,近期因为一些原因,主机的IP地址变更了两次,IPV4和IPV6同时变更
我发现变更后,普通的docker可以正常启动,但是使用了podman的amhpod似乎无法直接适应IP的变化,无法正常从外网访问
默认情况下,应该是走的bridge 网络模式?
直接在amhpod重启运行、或重部署容器不能解决问题

第一次变更IP时,我将所有容器全部卸载,重装了amhpod后,再挨个重新拉取部署解决
现在因为容器十几个,挨个重复这个操作很费劲
请问大大有没有更好的解决方式


根据两位大大的提示,问题排查如下:
确定容器内网ip 10.88.0.6

"NetworkSettings": {
               "EndpointID": "",
               "Gateway": "10.88.0.1",
               "IPAddress": "10.88.0.6",
               "IPPrefixLen": 16,
               "IPv6Gateway": "",
               "GlobalIPv6Address": "",
               "GlobalIPv6PrefixLen": 0,
               "MacAddress": "96:e1:27:f0:4e:ea",
               "Bridge": "",
               "SandboxID": "",
               "HairpinMode": false,
               "LinkLocalIPv6Address": "",
               "LinkLocalIPv6PrefixLen": 0,
               "Ports": {
                    "80/tcp": [
                         {
                              "HostIp": "",
                              "HostPort": "10000"
                         }
                    ]
               },
               "SandboxKey": "/run/netns/netns-ddee8b9f-89d7-2eeb-d814-1ddf20a1363a",
               "Networks": {
                    "podman": {
                         "EndpointID": "",
                         "Gateway": "10.88.0.1",
                         "IPAddress": "10.88.0.6",
                         "IPPrefixLen": 16,
                         "IPv6Gateway": "",
                         "GlobalIPv6Address": "",
                         "GlobalIPv6PrefixLen": 0,
                         "MacAddress": "96:e1:27:f0:4e:ea",
                         "NetworkID": "podman",
                         "DriverOpts": null,
                         "IPAMConfig": null,
                         "Links": null,
                         "Aliases": [
                              "1f4798f85017"
                         ]
                    }
               }

并且ping curl测试均正常
现在我在想是不是防火墙出了问题:
这是摘选的几条相关IP和端口(10000)防火墙记录:

-A INPUT -p tcp -m tcp --dport 10000 -j ACCEPT
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.36:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8089 -j DNAT --to-destination 10.88.0.6:8088
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.6:80
-A NETAVARK-DN-1D8721804F16F -s 10.88.0.0/16 -p tcp -m tcp --dport 10000 -j NETAVARK-HOSTPORT-SETMARK
-A NETAVARK-DN-1D8721804F16F -s 127.0.0.1/32 -p tcp -m tcp --dport 10000 -j NETAVARK-HOSTPORT-SETMARK
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.6:80
-A NETAVARK-HOSTPORT-DNAT -p tcp -m tcp --dport 10000 -m comment --comment "dnat name: podman id: 1f4798f85017ea7c01563710553d46107ddbeae713c2d6006ef314fde27a0776" -j NETAVARK-DN-1D8721804F16F

我发现多了一个8089的端口的转发,但是这个端口我应该是用在另外一个IP为10.88.0.4的容器,并且防火墙中也有这么一条记录:

-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8089 -j DNAT --to-destination 10.88.0.4:8088

于是我把所有容器都停止了,然后发现还剩下这么几个规则:

-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8092 -j DNAT --to-destination 10.88.0.23:8080
-A NETAVARK-DN-1D8721804F16F -d 127.0.0.100/32 -p tcp -m tcp --dport 5270 -j DNAT --to-destination 10.88.0.25:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 21114 -j DNAT --to-destination 10.88.0.34:21114
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.36:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 8092 -j DNAT --to-destination 10.88.0.3:8080
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 21114 -j DNAT --to-destination 10.88.0.5:21114
-A NETAVARK-DN-1D8721804F16F -d 127.0.0.100/32 -p tcp -m tcp --dport 5270 -j DNAT --to-destination 10.88.0.7:80
-A NETAVARK-DN-1D8721804F16F -p tcp -m tcp --dport 10000 -j DNAT --to-destination 10.88.0.6:80

明显出现了重复的规则……我决定这几条全删掉
然后,恢复了……
总结一下,问题出现在了防火墙上出现了一些冗余的规则,这些规则目前我也不知道怎么来的,可能是我个人操作的原因
我打算这回把所有容器自己定义好子网IP,这样应该不会有类似问题发生?

阅读 373
2 个回答

容器默认网络是10.88.0.0/16网段的,在内网正常应该不会影响才对,
外网访问是通过iptables转发到内网访问到相应的容器,容器只监听端口的情况,应是没绑定外网IP的,访问不了的话,可以先确认下容器的网络情况,可以运行命令,
podman inspect 容器名/或ID
看下容器网络配置,类似

NetworkSettings": {
               "EndpointID": "",
               "Gateway": "10.88.0.1",
               "IPAddress": "10.88.0.18",
               "IPPrefixLen": 16,
               "IPv6Gateway": "",
               "GlobalIPv6Address": "",
               "GlobalIPv6PrefixLen": 0,
               "MacAddress": "e2:9e:9b:c7:79:56",
               "Bridge": "",
               "SandboxID": "",
               "HairpinMode": false,
               "LinkLocalIPv6Address": "",
               "LinkLocalIPv6PrefixLen": 0,
               "Ports": {
                    "80/tcp": [
                         {
                              "HostIp": "",
                              "HostPort": "88"
                         }
                    ]
               },

上面容器就10.88.0.18,可以在ssh先ping与curl测试相应内网端口是否正常,
也排查外网监听情况,在面板『网络』可以看得到,
与iptables转发规则,默认是用的NETAVARK,老系统是CNI,
正常这些在容器重新启动时是会自动配置。

建议用固定网络配置:
建一个文件 /etc/cni/net.d/87-podman-bridge.conflist:


{
  "cniVersion": "0.4.0",
  "name": "podman",
  "plugins": [
    {
      "type": "bridge",
      "bridge": "cni-podman0",
      "ipam": {
        "type": "host-local",
        "ranges": [
          [
            {
              "subnet": "10.88.0.0/16",
              "gateway": "10.88.0.1"
            }
          ]
        ]
      }
    },
    {
      "type": "portmap",
      "capabilities": {
        "portMappings": true
      }
    }
  ]
}

或者用host网络模式:

# 部署容器时用host网络
podman run --network=host ...
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏