首先确认防火墙服务是否运行及当前状态,这是测试的前提:
systemctl status firewalld:若显示“active (running)”则表示防火墙正在运行;若未运行,可通过 systemctl start firewalld 启动。firewall-cmd --state:直接返回“running”则说明防火墙处于激活状态。明确当前防火墙允许的流量通道,避免测试方向错误:
firewall-cmd --list-all:查看当前区域的所有规则(包括开放端口、允许服务、富规则等);firewall-cmd --list-ports:仅查看开放的TCP端口(如80、443);firewall-cmd --list-services:查看允许的服务(如http、ssh,对应预定义端口)。通过工具模拟外部访问,验证端口是否真正开放:
nc -vz <目标IP或localhost> <端口号>(如 nc -vz localhost 80);若端口开放,会显示“succeeded!”;若关闭,提示“Connection refused”。nc -vzu <目标IP或localhost> <端口号>(如 nc -vzu localhost 53)。telnet <目标IP或localhost> <端口号>(如 telnet localhost 22);若连接成功,显示“Connected to localhost”;若失败,提示“Connection refused”。curl -v http://localhost:<端口号>(如 curl -v http://localhost:8080);若返回HTML内容或状态码(如200),说明端口及服务正常。针对特定服务(如SSH、FTP),验证防火墙是否允许合法访问:
curl http://localhost(HTTP)或 ssh localhost(SSH),确认服务本身是否正常运行。telnet <服务器IP> <端口号> 或 nc -zv <服务器IP> <端口号>,验证防火墙是否允许外部IP访问该端口。例如,开放SSH端口(22)后,从客户端执行 telnet 服务器IP 22,若连接成功则规则生效。若配置了针对特定IP、协议的富规则,需针对性验证:
firewall-cmd --permanent --add-rich-rule="rule family='ipv4' source address='192.168.1.100' port port='22' protocol='tcp' accept"telnet 服务器IP 22,应能连接成功;firewall-cmd --list-rich-rules,确认规则是否添加成功。若测试异常(如端口不通),通过日志定位原因:
journalctl -xe:查看系统日志,过滤“firewalld”关键字(如 grep firewalld /var/log/messages),获取防火墙拦截事件的详细信息(如拒绝的IP、端口、协议)。若怀疑防火墙导致问题,可临时关闭以确认:
systemctl stop firewalld:立即关闭防火墙;telnet localhost 80);systemctl start firewalld 恢复防火墙。firewall-cmd --reload),避免新规则未生效;nc -zvu,因UDP是无连接的,结果可能不如TCP准确。