在 CentOS 上 iptables 拒绝连接(REJECT / DROP) 的原因通常可以归结为以下几类。下面按最常见 → 较少见的顺序说明,并给出排查方法。
iptables 的链(INPUT / FORWARD / OUTPUT)默认策略如果不是 ACCEPT,就会拒绝连接。
查看:
iptables -L -n -v
示例问题:
Chain INPUT (policy DROP)
✅ 解决:
iptables -P INPUT ACCEPT
⚠️ 生产环境建议使用白名单方式,而不是简单 ACCEPT。
比如你想访问 80 / 443 / 22,但没放行。
查看规则:
iptables -L INPUT -n --line-numbers
✅ 放行端口示例:
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
iptables -A INPUT -p tcp --dport 80 -j ACCEPT
iptables 自上而下匹配,一旦匹配就执行。
错误示例:
REJECT all -- anywhere anywhere
ACCEPT tcp -- anywhere anywhere tcp dpt:22
✅ 解决:
iptables -D INPUT <规则编号>
iptables -I INPUT <正确位置> -p tcp --dport 22 -j ACCEPT
CentOS 7/8 默认使用 firewalld,它底层操作 iptables。
如果你手动改 iptables,但 firewalld 还在运行,可能:
查看:
systemctl status firewalld
✅ 方案 A(推荐):用 firewalld
firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload
✅ 方案 B:关闭 firewalld(仅测试或特殊场景)
systemctl stop firewalld
systemctl disable firewalld
SELinux 会拒绝网络访问,现象类似“被拒绝”。
排查:
getenforce
临时关闭测试:
setenforce 0
✅ 正确做法:
setsebool -P httpd_can_network_connect 1
iptables -L INPUT -n | grep DROP
可能看到:
DROP all -- 1.2.3.4 0.0.0.0/0
比如:
iptables -A INPUT -i lo -j DROP
这会导致:
# 1. 看策略
iptables -L -n -v
# 2. 看是否有 REJECT
iptables -L -n | grep REJECT
# 3. 看 firewalld
systemctl status firewalld
# 4. 看 SELinux
getenforce
# 5. 临时放行测试
iptables -I INPUT -p tcp --dport 端口 -j ACCEPT
❌ “我加了 ACCEPT 还是不行”
✅ 检查:规则顺序 / firewalld / SELinux
❌ “iptables 保存了重启就没了”
✅ CentOS 7:
service iptables save
或
iptables-save > /etc/sysconfig/iptables
如果你愿意,可以贴出:
iptables -L -n -v
或说明:
我可以直接帮你定位是哪一条规则在拒绝。