在Linux和Windows操作系统中,防火墙是保障系统安全的重要组件,通过命令行查看防火墙状态和规则是系统管理员和开发人员必备的技能,本文将详细介绍不同操作系统下使用命令行查看防火墙的方法,包括CentOS/RHEL、Ubuntu/Debian、Windows等主流系统的常用命令和参数,并辅以表格对比不同命令的功能差异,最后以FAQs形式解答常见问题。

在Linux系统中,防火墙工具因发行版不同而有所差异,CentOS/RHEL系列默认使用firewalld作为防火墙管理工具,而Ubuntu/Debian系列则常用iptables或nftables,对于firewalld,可以通过firewall-cmd命令进行管理,要查看防火墙的运行状态,可执行sudo firewall-cmd --state,该命令会返回running或not running,直观显示防火墙是否激活,若需查看详细的规则列表,sudo firewall-cmd --list-all是常用命令,它会显示当前区域(zone)、接口、服务、端口等配置信息,输出结果可能包含public区域、允许的SSH服务(22端口)等关键信息。sudo firewall-cmd --list-services和sudo firewall-cmd --list-ports分别用于查看允许的服务和端口,适用于快速筛选特定规则。
对于Ubuntu/Debian系统,若使用iptables,可通过sudo iptables -L -n -v命令查看规则链。-L表示列出规则,-n避免域名解析(加快速度),-v显示详细信息(如数据包计数、网络接口等),输出结果分为INPUT、OUTPUT、FORWARD等链,每条规则包含目标(ACCEPT/DROP)、源地址、目的地址、协议、端口等信息,若系统升级到nftables(Ubuntu 20.04及以后版本默认使用),则需执行sudo nft list ruleset,该命令会以更简洁的格式展示规则集,支持更灵活的语法。nft list ruleset的输出可能包含table inet filter及其链定义,规则中明确标注了允许的协议和端口。
在Windows系统中,防火墙分为传统防火墙(Windows Defender Firewall)和高级安全防火墙(Windows Firewall with Advanced Security),命令行工具主要包括netsh和powershell,使用netsh时,netsh advfirewall show allprofiles可查看所有防火墙配置文件(域、专用、公共)的状态(启用/禁用),而netsh firewall show state则显示防火墙的总体运行状态,若需查看具体规则,netsh advfirewall firewall show rule name=all会列出所有规则,包括规则名称、方向(入站/出站)、协议、本地端口、操作(允许/阻止)等,对于PowerShell用户,Get-NetFirewallRule是更现代的命令,配合Where-Object可筛选特定规则。Get-NetFirewallRule -DisplayName "*" | Where-Object {$_.Enabled -eq "True"} | Format-Table Name, DisplayName, Direction, Action可列出所有启用的规则,并以表格形式展示名称、显示名称、方向和操作。
不同命令的功能可通过以下表格对比:在Linux firewalld中,--state仅显示运行状态,--list-all提供完整配置,--list-services和--list-ports分别聚焦服务和端口;iptables的-L -n -v显示详细规则链,而nftables的list ruleset以结构化格式呈现规则集,Windows系统中,netsh advfirewall show allprofiles侧重配置文件状态,netsh firewall show state显示总体状态,netsh advfirewall firewall show rule列出具体规则,PowerShell的Get-NetFirewallRule支持更灵活的筛选和格式化,这些命令可根据需求组合使用,例如在Linux中通过sudo firewall-cmd --list-all | grep "22/tcp"快速查找SSH端口规则,或在Windows中使用netsh advfirewall firewall show rule name="allow_rdp" | findstr "Enabled"检查特定规则是否启用。

需要注意的是,部分命令需要管理员权限(如sudo或以管理员身份运行命令行),否则可能无法获取完整信息或执行失败,不同操作系统版本的命令参数可能存在差异,例如旧版Ubuntu可能使用iptables而非nftables,Windows 10和Windows 11的PowerShell命令基本兼容,但早期版本可能不支持某些参数,在查看防火墙规则时,建议结合日志分析(如Linux的journalctl -u firewalld或Windows的“事件查看器”)以全面了解防火墙行为。
在实际应用中,命令行查看防火墙规则常用于故障排查、安全审计和规则验证,当无法访问某服务时,可通过查看防火墙规则确认是否被阻止;在进行安全合规检查时,使用命令行导出规则列表(如sudo firewall-cmd --list-all > firewall_rules.txt)可快速生成报告,对于自动化运维场景,结合脚本(如Bash或PowerShell脚本)定期检查防火墙状态和规则变更,能有效提升管理效率。
相关问答FAQs:
-
问:为什么在执行
sudo firewall-cmd --list-all时提示“command not found”?
答:这通常表示系统中未安装firewalld服务或当前用户不在sudoers列表中,首先可通过which firewall-cmd或systemctl status firewalld检查是否已安装并启动firewalld,若未安装,在CentOS/RHEL中执行sudo yum install firewalld -y,在Ubuntu/Debian中执行sudo apt install firewalld -y(需先添加firewalld的源),若已安装但仍报错,可能是PATH环境变量问题,可通过sudo /usr/bin/firewall-cmd --list-all直接执行命令,或检查用户是否具有sudo权限。
(图片来源网络,侵删) -
问:如何通过命令行查看Windows防火墙中特定端口的允许规则?
答:在Windows中,可使用netsh或PowerShell命令实现,通过netsh执行netsh advfirewall firewall show rule name=all | findstr "3389"(假设查看3389端口规则),输出结果会包含端口和操作信息;若需更精确的筛选,可使用PowerShell命令Get-NetFirewallRule | Where-Object {$_.LocalPorts -eq "3389"} | Select-Object Name, DisplayName, Direction, Action,该命令会列出所有涉及3389端口的规则,并显示名称、显示名称、方向和操作,若规则中包含端口范围(如"8000-9000"),需将-eq改为-contains或使用正则表达式匹配。
