Linux 服务器端口开放正确姿势:告别 ufw allow,拥抱 iptables 精准控制

发布于 2026-02-26  30 次阅读


前言

很多新手在 Linux 服务器上开放端口,第一反应就是:

ufw allow 443

但如果你用了 A 方案(iptables 作为主要防火墙),这个命令可能只是“看起来管用”,实际上并没有真正生效。

本文记录我在韩国服务器上实际验证过的端口管理方案。

核心原则

需要开放的端口,必须排在 REJECT 前面。

在 iptables INPUT 链中,规则是从上往下匹配的。REJECT(拒绝)规则之前的端口才会被放行,之后的根本不会执行到。

端口管理三步走

第一步:查看当前规则

iptables -L INPUT -n --line-numbers

输出示例:

Chain INPUT (policy ACCEPT)
num  target     prot opt source               destination
1    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:22
2    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:80
...
9    ACCEPT     tcp  --  0.0.0.0/0            0.0.0.0/0            tcp dpt:443
10   REJECT     all  --  0.0.0.0/0            0.0.0.0/0            reject-with icmp-host-prohibited

第二步:插入新规则

关键:插到 REJECT 前面!

假设 REJECT 在第 10 条:

iptables -I INPUT 10 -p tcp --dport 443 -j ACCEPT

如果 REJECT 在第 11 条,就用 -I INPUT 11,以此类推。

第三步:保存规则

netfilter-persistent save

删除端口(按编号)

1. 先看编号

iptables -L INPUT -n --line-numbers

2. 按编号删除

iptables -D INPUT 编号

例如删除第 9 条:

iptables -D INPUT 9

3. 保存

netfilter-persistent save

常见问题

Q1:ufw allow 还管用吗?

答案:不管用。

ufw 还在,但更像个“挂件”,不是“法官”。真正说了算的是 iptables INPUT 链。

Q2:为什么有时候 ufw allow 看起来有效?

因为 ufw 底层也是操作 iptables,但如果你的 REJECT 规则排在前面,ufw 添加的规则在 REJECT 后面,永远不会生效。

Q3:怎么确认端口确实开放了?

# 本机测试
telnet 你的IP 端口号

# 或者
nc -zv 你的IP 端口号

Q4:不小心把 SSH 端口(22)删了怎么办?

立即重连! 如果还能连上,立刻加回去:

iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT
netfilter-persistent save

完整操作示例

开放 443 端口(HTTPS)

# 1. 查看当前规则
iptables -L INPUT -n --line-numbers

# 2. 假设 REJECT 在第 10 条,插入规则
iptables -I INPUT 10 -p tcp --dport 443 -j ACCEPT

# 3. 再次确认
iptables -L INPUT -n --line-numbers

# 4. 保存
netfilter-persistent save

删除 8080 端口

# 1. 查看编号
iptables -L INPUT -n --line-numbers

# 2. 假设 8080 在第 8 条
iptables -D INPUT 8

# 3. 保存
netfilter-persistent save

总结

方式 适用场景
ufw allow 仅当 iptables 没有自定义 REJECT 规则时
iptables -I INPUT 编号 A 方案(推荐),精准控制

记住这句口诀:

REJECT 前面才算数,编号插队要牢记。


把日子慢慢写下来。