防火墙端口放行后仍被拒绝?这7个排查方向我赌你漏了
上周帮客户调试服务器时遇到个典型问题:明明在防火墙规则里放行了8080端口,telnet测试却始终显示连接被拒绝。这种”灵异事件”我们运维都遇到过,今天就把完整的排查清单和实战经验分享给大家。
1. 先确认防火墙规则真的生效了
我第一个反应就是检查防火墙状态,结果发现客户虽然添加了规则,但忘记重载配置!这个低级错误我早期也犯过:
# CentOS 7/8
sudo firewall-cmd --reload
# Ubuntu
sudo ufw reload
更稳妥的做法是直接列出当前生效规则:
sudo firewall-cmd --list-all
# 或
sudo iptables -L -n
2. 检查服务是否真的在监听
有次我折腾半小时才发现Nginx根本没启动…用这个命令快速确认:
sudo netstat -tulnp | grep 8080
# 或更现代的
sudo ss -tulnp | grep 8080
如果输出为空,说明要么服务没启动,要么监听了其他端口。建议同时检查服务日志:
journalctl -u nginx --no-pager -n 20
3. 注意监听地址的坑
这是我踩过最隐蔽的坑:某次发现服务只监听了127.0.0.1!这意味着只接受本机连接。解决方法是在服务配置中改为:
listen 0.0.0.0:8080; # Nginx示例
# 或
bind 0.0.0.0 # 某些应用的配置
4. 云服务器的安全组规则
在阿里云/腾讯云等平台,除了系统防火墙,还有安全组这个隐形杀手。有次迁移服务器后完全忘了这茬,被坑得够呛。记得检查:
- 入站规则是否包含目标端口
- 规则是否应用到当前实例
- 源IP限制是否过于严格
5. SELinux的暗中阻拦
这个安全模块经常默默拦截连接。临时测试可以:
sudo setenforce 0
如果突然能访问了,就需要配置SELinux策略:
sudo semanage port -a -t http_port_t -p tcp 8080
6. 应用自身的访问控制
有些应用如MySQL、Redis有自己的权限系统。比如MySQL用户可能被限制为localhost访问:
CREATE USER 'user'@'%' IDENTIFIED BY 'password'; # 允许远程访问
7. 网络设备的多重拦截
最后这个最让人崩溃:公司内网可能有多层防火墙。有次排查发现是机房核心交换机做了ACL过滤。这种情况需要:
- 用traceroute确认网络路径
- 联系网络管理员确认中间设备策略
- 在测试环境复现问题
希望这份清单能帮你少走弯路。遇到网络问题最重要的是分层排查,从应用层一直查到物理层。大家有什么奇葩经历,欢迎在评论区分享~
这个排查清单太实用了,刚遇到同样问题,原来是SELinux在搞鬼!
云服务器安全组的坑我也踩过,差点被老板骂死 😅
想问下作者,如果是docker容器里的服务,需要额外注意什么?
看到第三条突然想起来,上次排查了半天发现是nginx配置写错了监听地址…