前言

很多新手在 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 前面才算数,编号插队要牢记。

声明:本站所有文章,如无特殊说明或标注,均为本站原创发布。任何个人或组织,在未征得本站同意时,禁止复制、盗用、采集、发布本站内容到任何网站、书籍等各类媒体平台。如若本站内容侵犯了原著者的合法权益,可联系我们进行处理。