如何在Docker容器运行时自动配置专属Iptable防火墙规则
Docker原生实现容器专属防火墙规则自动生效方案
Docker原生支持两种无第三方依赖的实现方式,均可满足容器启动时规则自动加载的需求:
方案1:容器标签绑定自定义规则链
- 首先确认Docker daemon的iptables功能处于开启状态(默认开启,可通过
/etc/docker/daemon.json配置确认:{"iptables": true},修改后需重启dockerd服务) - Docker默认会将所有容器的进出流量转发到主机iptables的
DOCKER链处理,你可以提前为不同业务的容器定义专属iptables规则链,比如仅允许访问192.168.1.10:5432的容器规则链:
# 提前创建规则链 iptables -N CONTAINER_RULE_PG_ONLY iptables -A CONTAINER_RULE_PG_ONLY -d 192.168.1.10/32 -p tcp --dport 5432 -j ACCEPT iptables -A CONTAINER_RULE_PG_ONLY -j DROP
- 启动容器时通过
--label标记对应的规则链:docker run -d --label io.docker.firewall.chain=CONTAINER_RULE_PG_ONLY your-image - 配置系统级的Docker事件监听服务(用Linux原生systemd即可实现),监听
container start事件,触发时自动将对应规则链插入到该容器的流量处理路径,整个过程无需人工干预,容器启动后规则立即生效
方案2:自定义Docker网络绑定规则
如果同类规则的容器较多,可以通过自定义网络批量绑定规则,所有加入该网络的容器自动继承规则:
- 创建自定义桥接网络,关闭容器间互通,指定网桥名称:
docker network create --opt com.docker.network.bridge.enable_icc=false --opt com.docker.network.bridge.name=docker_pg_net pg-only-net - 在主机iptables的
FORWARD链中为该网桥配置固定规则:
iptables -A FORWARD -i docker_pg_net -d 192.168.1.10/32 -p tcp --dport 5432 -j ACCEPT iptables -A FORWARD -i docker_pg_net -j DROP
- 后续所有启动时加入
pg-only-net网络的容器,都会自动受该规则约束,无需单独配置,启动即生效
补充说明
你提到的CNI创建网络命名空间的场景,CNI原生自带iptables插件,无需第三方工具,只需修改对应的CNI配置文件,将你需要的规则写入配置,网络命名空间创建时会自动注入规则,完全满足自动生效的需求。
内容的提问来源于stack exchange,提问作者AEvers
相关产品推荐
相关产品推荐

