尝试白名单DOCKER-USER端口致容器DNS解析失败求助
解决容器DNS解析失败+iptables规则持久化问题
问题根源
你当前的REJECT规则会拦截所有从ens3接口进入的非80/443端口流量,但容器发起DNS请求后,DNS服务器的响应是从ens3接口进来的,目标端口是主机随机分配的临时端口(不是80/443),所以被规则直接拒绝,导致解析失败。
修正后的iptables规则
在REJECT规则之前,先允许已建立/关联的连接流量(这类流量是容器发起请求后的响应,包括DNS响应),这样既能限制公网入站的新连接仅允许80/443,又不影响容器的出站请求响应:
sudo iptables -F DOCKER-USER # 允许已建立/关联的连接(比如DNS响应、HTTP请求的返回包等) sudo iptables -I DOCKER-USER -i ens3 -m state --state RELATED,ESTABLISHED -j ACCEPT # 允许公网入站的80/443端口新连接 sudo iptables -I DOCKER-USER -i ens3 -p tcp -m multiport --dports 80,443 -j ACCEPT # 拒绝其余从公网入站的TCP/UDP新连接 sudo iptables -A DOCKER-USER -i ens3 -p tcp -j REJECT --reject-with tcp-reset sudo iptables -A DOCKER-USER -i ens3 -p udp -j REJECT --reject-with icmp-port-unreachable
测试验证:
docker run busybox nslookup google.com # 现在应该正常工作
iptables规则持久化方法
根据不同发行版,常用两种方式:
Debian/Ubuntu系列
- 安装持久化工具:
sudo apt update && sudo apt install -y iptables-persistent
- 保存当前规则:
sudo netfilter-persistent save
后续修改规则后,再次执行netfilter-persistent save即可更新,重启系统规则会自动加载。
CentOS/RHEL系列
- 保存规则到系统配置文件:
sudo iptables-save > /etc/sysconfig/iptables
- 确保iptables服务开机自启:
sudo systemctl enable --now iptables
修改规则后重新执行iptables-save覆盖文件即可,重启系统规则自动恢复。
内容的提问来源于stack exchange,提问作者Thomas Ramé
相关产品推荐
相关产品推荐

