linux防火墙(firewalld或iptables)拦截外部连接是服务无法被远程访问的最常见原因;需检查防火墙状态、放行对应端口或服务,并确认服务监听0.0.0.0及selinux策略。

Linux 防火墙(尤其是 firewalld 或 iptables)拦截了外部连接,是服务启动后却无法从其他机器访问的最常见原因之一。重点不是服务没跑,而是流量在系统边界就被挡住了。
确认防火墙是否启用并检查当前规则
先快速判断防火墙状态:
- firewalld(CentOS/RHEL 7+、Fedora 默认):sudo firewall-cmd --state(输出 running 表示开启)
- iptables(较老系统或手动配置):sudo iptables -L -n 查看当前规则链,特别关注 INPUT 链是否拒绝了目标端口
如果防火墙运行中,且你没主动放行服务端口,那大概率就是它拦的。
放行服务端口(firewalld 方式)
不要直接关防火墙,应精准开放所需端口或服务:
- 按端口号放行(例如 Web 服务用 8080):sudo firewall-cmd --permanent --add-port=8080/tcp
- 按服务名放行(需服务定义存在,如 http、https):sudo firewall-cmd --permanent --add-service=http
- 重载配置生效:sudo firewall-cmd --reload
注意:--permanent 参数必须加,否则重启后失效;--reload 是必需步骤,仅 --add-xxx 不会立即生效。
放行端口(iptables 方式)
若用的是 iptables,临时添加一条允许规则(假设服务监听 3000 端口):
- sudo iptables -I INPUT -p tcp --dport 3000 -j ACCEPT(-I 插入到最前,优先级高)
- 保存规则(不同系统命令不同):
• CentOS/RHEL:sudo service iptables save 或 sudo /usr/libexec/iptables/iptables.init save
• Debian/Ubuntu(需安装 iptables-persistent):sudo netfilter-persistent save
避免用 -A 追加规则——若前面已有 REJECT 或 DROP 规则,新规则可能被跳过。
别忘了检查服务绑定地址和 SELinux(RHEL/CentOS)
防火墙放行只是第一步:
- 确认服务监听的是 0.0.0.0:端口 而非 127.0.0.1:端口(后者只接受本地访问),可用 ss -tlnp | grep :端口 查看
- RHEL/CentOS 启用 SELinux 时,即使防火墙放行,也可能因 SELinux 策略阻止网络绑定。临时测试可运行 sudo setsebool -P httpd_can_network_bind 1(针对 http 类服务),或用 ausearch -m avc -ts recent 查日志确认是否 SELinux 拦截









