必须在宿主机网络层用iptables/nftables实施出口控制:先确认容器网桥(如docker0),再在FORWARD链中放行指定IP(如10.20.30.40、192.168.5.100),最后DROP其余所有出向流量,规则顺序不可颠倒,且需持久化保存。

Linux系统中运行的Docker容器默认可自由访问任意外部IP,若需强制其仅能与指定几个IP通信(如只连数据库10.20.30.40、API服务192.168.5.100),必须在宿主机网络层实施出口流量控制,不能依赖容器内iptables或应用层配置。
用iptables限制容器出口IP(推荐)
此方法直接作用于宿主机FORWARD链,精准拦截容器发出的、目标非白名单的IPv4包,对所有容器统一生效,无需修改容器配置。
第一步:确认容器使用的网桥接口名。执行 ip link show,找到类似 veth* 开头的接口,再用 brctl show 查看其归属网桥(通常是 docker0)。若使用自定义网桥(如 mybridge),请记下该网桥名。
第二步:放行容器到白名单IP的出向连接。假设白名单为 10.20.30.40 和 192.168.5.100,执行:
iptables -A FORWARD -i docker0 -o eth0 -d 10.20.30.40 -j ACCEPT
iptables -A FORWARD -i docker0 -o eth0 -d 192.168.5.100 -j ACCEPT
注意:-i docker0 表示流量从容器网桥进来,-o eth0 表示流向宿主机物理网卡;若宿主机使用其他网卡(如ens33),请替换 eth0。
第三步:拒绝容器到其他所有外部IP的出向连接。执行:
iptables -A FORWARD -i docker0 -o eth0 -j DROP
这一步必须放在上两条ACCEPT规则之后,否则所有流量立即被拦住。规则顺序不可颠倒。
第四步:保存规则,避免重启失效。CentOS/RHEL执行 service iptables save;Ubuntu/Debian执行 iptables-save > /etc/iptables/rules.v4。
用Docker自带--network限制(轻量级)
适用于只需隔离网络平面、不关心具体IP地址的场景,比如让容器只能访问内部测试网段,完全不通公网。
方法一:创建自定义bridge并禁用默认网关
执行 docker network create --driver bridge --subnet=172.20.0.0/16 --gateway=172.20.0.1 --opt com.docker.network.bridge.enable_ip_masquerade=false myrestricted。关键点是 【--opt com.docker.network.bridge.enable_ip_masquerade=false】 关闭SNAT,使容器无法通过宿主机转发到外部网络。
方法二:启动容器时绑定受限网络
运行容器时指定 docker run --network myrestricted ...。此时容器只能与同属该网络的其他容器通信,对宿主机和外部IP全部不可达。
此方法不支持“允许部分外部IP”,仅作网络域隔离,适合开发测试环境快速收口。
用nftables替代iptables(现代系统首选)
若系统已启用nftables(如RHEL 8+/Ubuntu 20.04+默认),应避免混用iptables命令,改用nft规则保证一致性。
① 创建新表和链:
nft add table inet filter
nft add chain inet filter forward { type filter hook forward priority 0 \; }
② 添加白名单规则(以10.20.30.40为例):
nft add rule inet filter forward iifname "docker0" oifname "eth0" ip daddr 10.20.30.40 accept
③ 拦截其余所有出口流量:
nft add rule inet filter forward iifname "docker0" oifname "eth0" drop
④ 持久化保存:
nft list ruleset > /etc/nftables.conf,然后启用开机自启:systemctl enable nftables。


















