晚上11点,客户电话打过来:“网站打不开了,宝塔面板也进不去,赶紧看看!”我揉着眼睛打开电脑,心里想着无非是重启一下服务的事,结果这一折腾,就是三个小时。
宝塔面板网络诊断,一次外网不通的踩坑实录,我花了3小时才找到真凶
这篇文章不跟你扯虚的,全是真金白银踩出来的坑,能帮你省下至少两小时的排查时间。
现象:面板能ping通,但外网访问死活打不开
客户服务器是阿里云ECS,装的宝塔面板7.9.0,我一开始以为是面板服务挂了,SSH登录上去,bt status一看——面板运行正常,再curl 127.0.0.1:8888,返回200,说明面板本身没问题。
但外网就是打不开。 浏览器转圈圈,最后报“连接超时”,更诡异的是,同一台服务器上的网站(80端口)也访问不了,但ping服务器IP是通的。
这就是典型的“网络诊断”场景:本地通,外网不通。
排查思路:从外到内,层层剥洋葱
我当时的排查路径是这样的:
- 本地网络——换手机热点,不行,排除。
- DNS解析——
nslookup域名,解析正常,排除。 - 云服务器安全组——登录阿里云控制台,发现安全组规则里,8888端口和80端口都开着,当时心里咯噔一下:安全组没问题,那问题就在服务器内部。
- 系统防火墙——
firewall-cmd --list-all,发现firewalld是运行状态,但规则里8888和80都是放行的,也正常。 - 宝塔面板自身防火墙——这是最容易被忽略的,宝塔有个“系统防火墙”插件,里面还有一层端口规则,我打开一看,好家伙,8888端口被“误封”了——状态显示“未放行”,但奇怪的是,本地curl能通。
这时候我意识到,问题可能不在端口,而在网络层。
真凶:iptables里的“隐形规则”
我祭出终极命令:iptables -L -n --line-numbers。
结果发现,在INPUT链里,有一条规则排在放行8888之前:
DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:8888
这条规则是谁加的? 后来查日志发现,是之前某次用宝塔的“网络诊断”工具时,点了“一键修复”之类的按钮,结果它自动加了一条“防止暴力破解”的规则,把8888端口给drop了,但本地回环(127.0.0.1)不经过INPUT链的这条规则,所以本地能通,外网不通。
这就是最坑的地方:宝塔的“网络诊断”工具本身,有时候会给你埋雷。 它本意是帮你诊断,但如果你不小心点了某些修复选项,它可能会修改iptables规则,而且不一定会告诉你。
解决方案:两条命令搞定
找到真凶后,解决就简单了:
# 删除那条DROP规则 iptables -D INPUT -p tcp --dport 8888 -j DROP # 保存规则(CentOS 7) service iptables save # 或者 iptables-save > /etc/sysconfig/iptables
然后重启一下宝塔面板的防火墙插件,或者直接bt restart,外网访问立刻恢复。
注意: 如果你用的是firewalld,不要直接改iptables,要用firewall-cmd,但宝塔的“系统防火墙”插件底层调用的就是iptables,所以两者可能会打架,建议只用其中一个。
预防建议:少走弯路的几个习惯
- 慎用“一键修复”——宝塔的“网络诊断”工具里,有些按钮会直接改iptables规则,而且没有明显的确认提示,点之前先截图保存当前规则。
- 定期备份iptables规则——
iptables-save > /root/iptables.bak,出问题直接恢复。 - 面板端口不要用默认8888——改成一个不常见的端口,减少被扫描和误封的概率。
- 安全组和系统防火墙要“双一致”——云服务器安全组放行了,系统防火墙也要放行,反之亦然,别只检查一个。
- 学会用
ss -tlnp看监听——比netstat快,能直接看到哪个进程在监听哪个端口。 - 遇到“本地通外网不通”,先查iptables——这是铁律,90%的诡异网络问题,都是iptables或firewalld的规则顺序导致的。
最后说一句
宝塔面板的“网络诊断”功能本身是好东西,能快速检测端口、DNS、连通性,但它不是万能的,有时候它自己就是问题的源头。真正靠谱的,还是你自己对Linux网络栈的理解。
那次之后,我养成了一个习惯:每次动防火墙规则之前,先iptables-save备份,这个习惯后来至少帮我省了五次重装系统的时间。
希望你看完这篇,下次遇到“外网打不开”的时候,能直接跳过前三步,直奔iptables,省下来的时间,陪陪家人不好吗?



发表评论