Linux防火墙需先识别服务类型:firewalld(用firewall-cmd --state)、ufw(ufw status verbose)、iptables(iptables -nL INPUT);再分工具检查端口放行状态与规则生效性;最后通过ss监听、远程nc测试及日志验证实际连通性。

确认当前使用的防火墙管理工具
Linux系统中没有统一的“防火墙命令”,先得弄清底层用的是哪个服务:firewalld、ufw 还是 iptables。混用会导致判断失效。
执行以下命令快速识别:
- firewalld:运行 sudo firewall-cmd --state,返回 running 表示启用;若报错 not running 或 command not found,则排除
- ufw:运行 sudo ufw status verbose,显示 Status: active 且有规则列表才说明在工作
- iptables:运行 sudo iptables -nL INPUT | head -10,能看到规则即表示生效(注意:它无服务状态概念,规则存在即起作用)
检查端口是否明确放行(按工具区分)
不能只看“有没有开”,要查规则是否匹配目标协议+端口,并处于生效状态。
-
firewalld:
– 查当前运行时开放的端口:sudo firewall-cmd --list-ports
– 查永久配置(重启后仍有效):sudo firewall-cmd --list-ports --permanent
– 若两者不一致,说明 漏执行 --reload,规则未加载进内存 -
ufw:
– 看详细规则表:sudo ufw status verbose
– 注意每条规则必须含协议,如 8080/tcp ≠ 8080(后者默认只开 TCP,但写法不严谨易误判) -
iptables:
– 查 INPUT 链中是否有 ACCEPT 规则:sudo iptables -nL INPUT | grep ':端口号'
– 特别留意顺序:前面若有 -j DROP 或 -j REJECT,且条件宽泛(如 -s 0.0.0.0/0),后续 ACCEPT 就不会生效
验证规则是否真起作用(绕过“看起来开了”陷阱)
命令输出“已添加”不等于外部能连上。需结合三层验证:
- 本机监听检查:sudo ss -tlnp | grep :端口号,确认服务确实在 0.0.0.0:端口 或公网 IP 上监听,而非仅 127.0.0.1
-
防火墙路径验证:从另一台机器测试,避免本机 loopback 干扰
– nc -zv 服务器IP 端口 → 返回 succeeded 表示通;Connection refused 是服务问题;Connection timed out 多为防火墙拦截 -
日志辅助定位:
– firewalld:启用拒绝日志 sudo firewall-cmd --set-log-denied=all,查 /var/log/firewalld
– iptables:临时加 LOG 规则 sudo iptables -I INPUT 1 -p tcp --dport 端口 -j LOG --log-prefix "PORT-TEST:",再查 journalctl -k | grep PORT-TEST
用 Shell 条件判断自动检测(实用脚本片段)
写自动化脚本时,可用退出码做逻辑分支。例如判断 firewalld 是否永久放行 443/tcp:
if sudo firewall-cmd --permanent --query-port=443/tcp; then echo "443/tcp 已永久放行" else echo "443/tcp 未放行,正在添加..." sudo firewall-cmd --permanent --add-port=443/tcp && sudo firewall-cmd --reload fi
对 ufw,可用:sudo ufw status | grep -q "443/tcp.*ALLOW";对 iptables,推荐:sudo iptables -nL INPUT | grep -q "tcp dpt:443.*ACCEPT"。注意加 sudo 和管道过滤,避免误判注释或无关行。


















