Debian类系统从零配置iptables后Docker容器无法启动,求Docker网络正常工作的iptables过滤表规则
Debian类系统从零配置iptables后Docker容器无法启动,求Docker网络正常工作的iptables过滤表规则
哥们,我太懂你这种从零搭iptables结果把Docker坑了的情况了!你之前用sudo iptables -F清空规则、sudo iptables -X删除所有自定义链的时候,把Docker自动创建的DOCKER相关链也一并删掉了——这就是启动容器时报错“找不到链/目标/匹配项”的核心原因。
Docker启动时会自动生成专属的iptables链(比如DOCKER、DOCKER-USER、DOCKER-ISOLATION-*这些)来管理容器网络,咱们直接删光链,Docker自然没法正常配置网络了。下面给你一套能兼顾自定义规则和Docker正常运行的配置步骤:
第一步:让Docker重新生成专属iptables链
先重启Docker服务,它会自动重建所需的链和基础规则:
sudo systemctl restart docker
第二步:重新配置你的自定义iptables规则(保留Docker链)
这次咱们只清空filter表的规则,不删除自定义链(包括Docker的),然后添加必要规则:
# 清空filter表的所有现有规则,但保留自定义链 sudo iptables -F # 设置INPUT链默认策略为ACCEPT(和你原来的配置一致) sudo iptables -P INPUT ACCEPT # 允许已建立/相关的连接(必须保留,不然容器和外部的通信会断) sudo iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # 允许本地回环接口流量(Docker内部通信、容器和宿主机交互全靠它) sudo iptables -A INPUT -i lo -j ACCEPT # 保留你需要的80/443端口外部访问规则 sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT # 允许Docker网桥的流量(Docker网桥一般是docker0或br-开头的虚拟网卡) sudo iptables -A INPUT -i docker0 -j ACCEPT sudo iptables -A INPUT -i br-+ -j ACCEPT # 关键:设置FORWARD链默认策略为ACCEPT(Docker容器之间、容器和外部通信需要转发) # 如果你想更严谨,也可以只允许Docker相关的转发,替换上面这行: # sudo iptables -P FORWARD ACCEPT sudo iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT sudo iptables -A FORWARD -i docker0 -j ACCEPT sudo iptables -A FORWARD -i br-+ -j ACCEPT
第三步:让规则永久生效(可选但推荐)
Debian类系统可以用iptables-persistent保存规则,避免重启后丢失:
# 安装持久化工具 sudo apt install -y iptables-persistent # 保存当前规则到配置文件(安装过程中会提示,选Yes即可) sudo iptables-save > /etc/iptables/rules.v4
注意事项
- 以后不要再随便用
iptables -X删除所有自定义链,除非你先停止Docker服务,否则会再次破坏Docker的网络链。 - 如果后续修改规则,记得用
iptables-save保存到/etc/iptables/rules.v4,不然重启后会失效。
备注:内容来源于stack exchange,提问作者user2626210




