配置iptables仅允许Cloudflare访问Docker时Nginx proxy_pass被拦截如何解决
问题原因
你现有配置存在两处核心问题:
- iptables规则逻辑完全写反,当前规则非但不能拦截非Cloudflare的公网请求,反而会直接放行所有非Cloudflare来源的流量,违背你的配置初衷
- 没有放行Docker内部私有网段的流量,导致Nginx到后端app的反向代理请求被拦截
解决方案
1. 清空现有错误规则
iptables -F DOCKER-USER
2. 按正确顺序添加规则
# 放行已建立的关联连接 iptables -A DOCKER-USER -m state --state RELATED,ESTABLISHED -j ACCEPT # 放行Docker内部私有网段流量(解决反向代理被拦截问题),可根据你实际使用的Docker网段调整 iptables -A DOCKER-USER -s 172.16.0.0/12 -j ACCEPT iptables -A DOCKER-USER -s 10.0.0.0/8 -j ACCEPT iptables -A DOCKER-USER -s 192.168.0.0/16 -j ACCEPT # 逐条放行Cloudflare IP段对80/443端口的访问 iptables -A DOCKER-USER -s 173.245.48.0/20 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 103.21.244.0/22 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 103.22.200.0/22 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 103.31.4.0/22 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 141.101.64.0/18 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 108.162.192.0/18 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 190.93.240.0/20 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 188.114.96.0/20 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 197.234.240.0/22 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 198.41.128.0/17 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 162.158.0.0/15 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 104.16.0.0/13 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 104.24.0.0/14 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 172.64.0.0/13 -p tcp --dport 80,443 -j ACCEPT iptables -A DOCKER-USER -s 131.0.72.0/22 -p tcp --dport 80,443 -j ACCEPT # 拦截所有其他来源对80/443端口的访问 iptables -A DOCKER-USER -p tcp --dport 80,443 -j DROP
3. 持久化规则
根据你使用的系统执行保存命令,避免服务器重启后规则失效:
- Debian/Ubuntu系统:
netfilter-persistent save - CentOS/RHEL系统:
service iptables save
补充说明
如果你的Docker使用自定义网段,可以执行docker network inspect <你的Docker网络名称>查看实际使用的网段,替换上述规则中的私有网段即可。
内容的提问来源于stack exchange,提问作者pickle
相关产品推荐
相关产品推荐

