甲骨文重启后宝塔面板无法访问:UFW、IN_BT 和 REJECT 顺序问题记录
问题背景
服务器重启后,宝塔面板无法访问。
宝塔面板端口是:
21412一开始以为是端口没有放行,于是添加了 21412 端口规则。
iptables -I INPUT 1 -p tcp --dport 21412 -j ACCEPT添加规则后,宝塔面板可以访问了。
但是后来把这条规则删除后,当前页面居然还能继续访问,于是误以为端口规则不是关键问题。
结果服务器再次重启后,宝塔面板又无法访问。
排查过程
1. 重启后宝塔面板访问失败
服务器重启后,浏览器无法访问宝塔面板:
http://服务器IP:21412/xxxxSSH 可以正常连接,说明服务器本身没问题,主要问题集中在防火墙规则上。
2. 添加 21412 规则后可以访问
重新添加宝塔面板端口规则:
iptables -I INPUT 1 -p tcp --dport 21412 -j ACCEPT添加后,宝塔面板可以访问。
3. 删除规则后当前页面还能访问,造成误判
之后删除了刚添加的规则,但是当前浏览器页面仍然可以访问宝塔。
这个现象容易让人误以为:
21412 规则不是必须的但实际原因是:
当前连接没有断开。已有连接仍然会被系统放行,所以当前页面还能访问。
但是换一个浏览器、换无痕窗口,或者重新建立连接,就可能无法访问。
所以这一步只是证明:
当前连接还活着并不能证明防火墙规则已经没问题。
4. 再次重启后仍然无法访问
服务器再次重启后,因为之前的误判,宝塔面板还是打不开。
这说明之前只是临时现象,问题没有真正解决。
于是继续查看防火墙规则。
第一个易错点:以为宝塔防火墙关闭就是全部放开
一开始以为:
宝塔防火墙关闭 = 所有端口都放开但实际不是这样。
实际情况是:
流量虽然走到了 IN_BT,
但如果 IN_BT 没有匹配到放行规则,
还是会继续往后走,
最后可能进入 REJECT 被拒绝。最初的顺序:
流量进入 INPUT
↓
经过 IN_BT //这里如何防火墙关闭时没有规则的没有到 UFW 规则,所以直接走REJECT了
↓
遇到 REJECT
↓
直接拒绝所以宝塔防火墙关闭,并不等于系统层面全部放行。
第二个易错点:宝塔开启防火墙后需要走 UFW
发现:
宝塔开启防火墙会有一堆的 UFW 配置:
root@instance-20260405:~# iptables -L INPUT -n -v --line-numbers
Chain INPUT (policy DROP 0 packets, 0 bytes)
num pkts bytes target prot opt in out source destination
1 1502 340K ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:21412
2 4475 6061K IN_BT all -- * * 0.0.0.0/0 0.0.0.0/0
3 4095 6036K ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
4 3 128 ACCEPT icmp -- * * 0.0.0.0/0 0.0.0.0/0
5 184 14561 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0
6 29 1528 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 state NEW tcp dpt:22
7 167 9613 REJECT all -- * * 0.0.0.0/0 0.0.0.0/0 reject-with icmp-host-prohibited
8 0 0 ufw-before-logging-input all -- * * 0.0.0.0/0 0.0.0.0/0
9 0 0 ufw-before-input all -- * * 0.0.0.0/0 0.0.0.0/0
10 0 0 ufw-after-input all -- * * 0.0.0.0/0 0.0.0.0/0
11 0 0 ufw-after-logging-input all -- * * 0.0.0.0/0 0.0.0.0/0
12 0 0 ufw-reject-input all -- * * 0.0.0.0/0 0.0.0.0/0
13 0 0 ufw-track-input all -- * * 0.0.0.0/0 0.0.0.0/0但是这个时候第7条REJECT出现了问题。
然后知道,宝塔里面的规则实际是由 UFW 控制的。
也就是说,宝塔面板端口要能访问,需要满足:
UFW 开启
UFW 里面有 21412 放行规则
REJECT 规则在 UFW 后面如果 UFW 有 21412 规则,但是 REJECT 在 UFW 前面,那么流量还没走到 UFW,就已经被拒绝了。
所以关键不只是有没有规则,还要看规则顺序。
关键问题:REJECT 必须放在 UFW 后面
最终发现问题点在 iptables 的 INPUT 链顺序。
需要查看:
iptables -L INPUT -n -v --line-numbers重点看:
REJECT是不是在 UFW 相关规则后面。
正确逻辑应该是:
流量进入 INPUT
↓
经过 IN_BT
↓
进入 UFW
↓
匹配 21412 放行规则
↓
允许访问
↓
最后才是 REJECT如果顺序变成:
流量进入 INPUT
↓
经过 IN_BT
↓
先遇到 REJECT
↓
直接拒绝
↓
根本走不到 UFW那么即使 UFW 里面有 21412 放行规则,也无法访问。
解决方法
重新添加宝塔面板端口规则:
iptables -I INPUT 1 -p tcp --dport 21412 -j ACCEPT确认 UFW 开启:
ufw status确认 UFW 开机自启:
systemctl enable ufw然后调整 REJECT 规则顺序,让它排在 UFW 后面。
删除原来的 REJECT:
iptables -D INPUT -j REJECT --reject-with icmp-host-prohibited重新追加到最后:
iptables -A INPUT -j REJECT --reject-with icmp-host-prohibited再次查看:
iptables -L INPUT -n -v --line-numbers确认:
REJECT 在最后
UFW 相关链在 REJECT 前面然后删除:
iptables -D INPUT -p tcp --dport 21412 -j ACCEPT让整个流程走宝塔 UFW 就可以了。
最终结果
调整完成后,宝塔面板可以正常访问。
再次重启服务器后,规则仍然生效,宝塔面板也能正常打开。
说明问题解决。
总结
这次问题的核心不是单纯的端口没放行,而是:
宝塔面板端口 21412 需要通过 UFW 放行;
但是 UFW 规则必须在 REJECT 之前执行;
如果 REJECT 在 UFW 前面,流量会提前被拒绝。两个关键坑:
1. 宝塔防火墙关闭,不等于所有端口全部放开。
2. 添加规则后删除,当前页面还能访问,只是因为连接没断,不代表规则没用。最终正确状态是:
IN_BT 存在
UFW 开启
21412 已放行
REJECT 位于 UFW 后面这样服务器重启后,宝塔面板才能持续正常访问。