温馨提示×

centos iptables为何拒绝连接

小樊
48
2026-09-24 00:14:09
栏目: 智能运维

在 CentOS 上 iptables 拒绝连接(REJECT / DROP) 的原因通常可以归结为以下几类。下面按最常见 → 较少见的顺序说明,并给出排查方法。


一、最常见原因

1️⃣ 默认策略是 DROP / REJECT

iptables 的链(INPUT / FORWARD / OUTPUT)默认策略如果不是 ACCEPT,就会拒绝连接。

查看:

iptables -L -n -v

示例问题:

Chain INPUT (policy DROP)

✅ 解决:

iptables -P INPUT ACCEPT

⚠️ 生产环境建议使用白名单方式,而不是简单 ACCEPT。


2️⃣ 没有放行对应端口

比如你想访问 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

3️⃣ 规则顺序错误(REJECT 在前)

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 特有原因

4️⃣ firewalld 与 iptables 冲突(CentOS 7+)

CentOS 7/8 默认使用 firewalld,它底层操作 iptables。

如果你手动改 iptables,但 firewalld 还在运行,可能:

  • 规则被覆盖
  • 端口被 firewalld 拒绝

查看:

systemctl status firewalld

✅ 方案 A(推荐):用 firewalld

firewall-cmd --add-port=80/tcp --permanent
firewall-cmd --reload

✅ 方案 B:关闭 firewalld(仅测试或特殊场景)

systemctl stop firewalld
systemctl disable firewalld

5️⃣ SELinux 阻止(不是 iptables,但常被误认)

SELinux 会拒绝网络访问,现象类似“被拒绝”。

排查:

getenforce

临时关闭测试:

setenforce 0

✅ 正确做法:

setsebool -P httpd_can_network_connect 1

三、网络层原因(非 iptables 本身)

6️⃣ 源 IP 被封

iptables -L INPUT -n | grep DROP

可能看到:

DROP all -- 1.2.3.4 0.0.0.0/0

7️⃣ 回环 / 本地访问也被限制

比如:

iptables -A INPUT -i lo -j DROP

这会导致:

  • localhost 无法访问
  • 本机服务互相调用失败

四、快速排查流程(推荐)

# 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

或说明:

  • CentOS 版本
  • 被拒绝的端口
  • 是本地还是远程连接

我可以直接帮你定位是哪一条规则在拒绝。

0 踩