Bridge Network
Background
客户在 K8s 的容器中调用飞书的 Webhook API。 这个接口是由外部的网关代理的,这个网关有 IP 白名单,需要添加集群中的所有节点 IP。
宿主机 IP
Question
容器里面调用外部网关,这个 IP 是容器 IP 还是宿主机 IP ?
这个要看你的网络模式,一般有下面几种情况:
- 默认(bridge 模式)
- 容器会有独立的内部 IP,比如
172.x.x.x
, - 宿主机会做 NAT 转发,外部看到的就是宿主机 IP。
- 所以网关看到的 IP 是宿主机的 IP。
- 容器会有独立的内部 IP,比如
- host 模式(容器使用宿主机的网络栈)
- 容器直接用宿主机 IP,没有隔离。
- 网关看到的 IP 也是宿主机 IP。
- 自定义网络 + 特殊出口设置(比如使用 Macvlan)
- 容器直接拿到和宿主机同网段的 IP。
- 这种情况下,网关可能直接看到容器的 IP,但这种配置比较少。
总结:
如果你没特别设置网络(一般就是默认 bridge),那么网关看到的就是宿主机的 IP,不是容器 IP。
所以白名单配置宿主机 IP 就可以了。
如果你需要更细粒度(比如区分不同容器),就要考虑:
- 容器走独立的出口 IP
- 容器里代理(比如通过出口网关 NAT)
- 或者直接在容器内加上认证,不靠 IP 白名单
要不要我顺便教你怎么快速验证?比如用 curl
查外网 IP?要的话告诉我。
确定网络模式
Question
在容器里面使用 ip a 能看到是使用什么网络模式吗
可以部分看出来,但不是绝对一眼能看懂,需要结合其他信息。
如果你在容器里运行 ip a
,一般会出现以下几种情况:
- 看到 eth0 是一个私网 IP,比如 172.17.x.x、192.168.x.x → 这种 99% 是 bridge 模式,容器自己一个私有 IP,通过宿主机 NAT 出去。 (
docker0
网桥分配的地址段) - 看到 eth0 是宿主机的 IP,或者和宿主机同一张网卡共享的 IP → 这是 host 模式,容器直接用宿主机网络,没有 NAT、没有隔离。
- 看到 eth0 是个跟宿主机同网段但是不一样的 IP,比如宿主机 192.168.1.10,容器 192.168.1.20 → 这可能是用了 macvlan 模式,容器被当成一个独立的局域网设备。
- 如果 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)是网关根本看不到的。