Skip to content

Bridge Network

Background

客户在 K8s 的容器中调用飞书的 Webhook API。 这个接口是由外部的网关代理的,这个网关有 IP 白名单,需要添加集群中的所有节点 IP。

宿主机 IP

Question

容器里面调用外部网关,这个 IP 是容器 IP 还是宿主机 IP ?

这个要看你的网络模式,一般有下面几种情况:

  • 默认(bridge 模式)
    • 容器会有独立的内部 IP,比如 172.x.x.x
    • 宿主机会做 NAT 转发,外部看到的就是宿主机 IP
    • 所以网关看到的 IP 是宿主机的 IP
  • host 模式(容器使用宿主机的网络栈)
    • 容器直接用宿主机 IP,没有隔离。
    • 网关看到的 IP 也是宿主机 IP
  • 自定义网络 + 特殊出口设置(比如使用 Macvlan)
    • 容器直接拿到和宿主机同网段的 IP。
    • 这种情况下,网关可能直接看到容器的 IP,但这种配置比较少。

总结

如果你没特别设置网络(一般就是默认 bridge),那么网关看到的就是宿主机的 IP,不是容器 IP。

所以白名单配置宿主机 IP 就可以了。

如果你需要更细粒度(比如区分不同容器),就要考虑:

  • 容器走独立的出口 IP
  • 容器里代理(比如通过出口网关 NAT)
  • 或者直接在容器内加上认证,不靠 IP 白名单

要不要我顺便教你怎么快速验证?比如用 curl 查外网 IP?要的话告诉我。

确定网络模式

Question

在容器里面使用 ip a 能看到是使用什么网络模式吗

可以部分看出来,但不是绝对一眼能看懂,需要结合其他信息。

如果你在容器里运行 ip a,一般会出现以下几种情况:

  1. 看到 eth0 是一个私网 IP,比如 172.17.x.x、192.168.x.x → 这种 99% 是 bridge 模式,容器自己一个私有 IP,通过宿主机 NAT 出去。 (docker0 网桥分配的地址段)
  2. 看到 eth0 是宿主机的 IP,或者和宿主机同一张网卡共享的 IP → 这是 host 模式,容器直接用宿主机网络,没有 NAT、没有隔离。
  3. 看到 eth0 是个跟宿主机同网段但是不一样的 IP,比如宿主机 192.168.1.10,容器 192.168.1.20 → 这可能是用了 macvlan 模式,容器被当成一个独立的局域网设备。
  4. 如果 eth0 IP 是 10.x.x.x、100.x.x.x、192.168.x.x,而且前缀奇怪 → 可能是用了 Kubernetes CNI 插件(如 flannel、calico、cilium 等),属于 overlay 网络

总结一句话

ip a 能让你看到容器的 IP 地址段,配合你的部署环境(Docker/K8s/Containerd/自建网络)基本能推断出是什么模式。

不过,要100%确认网络模式,通常更简单的是在宿主机上:

  • docker inspect <容器名>
  • "NetworkMode""IPAddress""Gateway" 等字段。

比如:

bash
docker inspect my_container | grep -i networkmode
docker inspect my_container | grep -i ipaddress

ip a

bash
dockerB:BROADCAST,MULTICAST,UP,LoWER_UP> mtu 1500 qdisc noqueue state Up group defaultlink/ether e2:42:71:15:de:21 brd ff:ff:ff:ff :ff;ffinet 172 .17 0.1716 brd 172.17.255.255 scope global dockero

明白了,你贴出来的是容器里 ip a 的一部分内容,虽然有些打断了,我帮你整理一下信息:

你看到的是类似这样的内容:

bash
docker0: BROADCAST,MULTICAST,UP,LOWER_UP mtu 1500 qdisc noqueue state UP group default link/ether e2:42:71:15:de:21 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0

⚡ 这里重点是:

  • 出现了 docker0(注意,是宿主机上的虚拟网桥接口 docker0)
  • IP 地址是 172.17.x.x
  • 网络掩码 /16(即 172.17.0.0 到 172.17.255.255)

根据这些特征,我可以非常确定告诉你:

你的容器是跑在 Docker 默认 bridge 网络 上。

这意味着:

  • 容器自己有一个私有 IP(比如 172.17.0.171)
  • 出去访问外部网关时,会经过宿主机的 NAT 转换
  • 外部网关看到的是宿主机的 IP不是容器的 IP

简单图示(给你更直观理解):

txt
容器 (172.17.0.171) ---> 宿主机 (公网IP或内网IP) ---> 外部网关

所以,白名单要加宿主机的 IP。容器 IP (172.17.0.171)是网关根本看不到的。