使用 PowerShell 管理 Windows 防火墙规则

Jacki

本文介绍从 PowerShell 命令行管理具有高级安全性的内置 Windows Defender 防火墙的设置和规则的基础知识。我们将了解如何启用/禁用不同网络配置文件的防火墙、创建或删除防火墙规则以及使用 PowerShell 导入/导出 Windows 防火墙规则。

内容:

Windows 防火墙设置通常使用单独的图形 MMC 快照进行管理wf.msc(控制面板 -> 系统和安全 -> Windows Defender 防火墙 -> 高级设置)。您可以从 PowerShell 命令行执行大多数 Windows 防火墙配置和设置管理操作。您可以使用内置的网络安全模块来执行此操作(在 Windows PowerShell 5.1 或更高版本中可用)。

您可以使用以下命令列出 NetSecurity 模块中可用的 cmdlet:

Get-Command -Module NetSecurity

此前,netsh advfirewall firewall命令用于管理 Windows 防火墙规则和设置。

如何使用 PowerShell 打开或关闭 Windows Defender 防火墙

默认情况下启用 Windows Defender 防火墙。

Get-NetFirewallProfile | Format-Table Name, Enabled

Windows 防火墙中有三种类型的网络配置文件:

  • 领域– 适用于加入 Active Directory 域的计算机;
  • 私人的– 家庭、SOHO 或工作组网络;
  • 民众– 公共网络。

默认情况下,Windows 防火墙允许每个网络配置文件的所有出站连接并阻止所有入站连接(允许的连接除外)。

网络位置感知 (NLA) 服务将有关网络类型的信息存储在数据库中。如果未正确检测到,您可以在 Windows 中手动更改网络配置文件(位置)。

每个网络配置文件(位置)可能使用不同的防火墙规则。默认情况下,计算机的所有网络接口均受防火墙保护,并且所有三种类型的配置文件均应用于它们。

要完全禁用 Windows 防火墙,请运行以下命令

Set-NetFirewallProfile -All -Enabled False

或者指定一个特定的配置文件名称而不是全部:

Set-NetFirewallProfile -Profile Public -Enabled False

要为所有三个网络配置文件启用 Windows 防火墙,请使用以下命令

Set-NetFirewallProfile -All -Enabled True

显示适用于网络连接的配置文件类型:

Get-NetConnectionProfile

在此示例中,DomainAuthenticated 配置文件应用于以太网 0 网络连接。

如果在远程计算机上配置了 PowerShell 远程处理 (WinRM),您可以管理这些计算机上的 Windows 防火墙规则。在此示例中,我们将使用 Invoke-Command cmdlet 连接到列表中的远程计算机并禁用其防火墙。

$computers = @('WKS01', 'WKS02', 'WKS03')
Invoke-Command -ComputerName $computers {Set-NetFirewallProfile -All -Enabled False}

您可以更改公共配置文件的默认操作以阻止所有入站连接。

Set-NetFirewallProfile –Name Public –DefaultInboundAction Block

当前的配置文件设置可以显示如下:

Get-NetFirewallProfile -Name Public

如果您使用 GPO 管理 Windows 防火墙设置,则可以查看当前生成的配置文件设置,如下所示:

Get-NetFirewallProfile -policystore activestore

确保所有防火墙设置都应用于计算机上的所有网络接口:

Get-NetFirewallProfile -Name Public | fl DisabledInterfaceAliases

如果所有接口都受到保护,该命令应返回:

DisabledInterfaceAliases : {NotConfigured}

您可以禁用网络接口的特定配置文件(您可以使用 Get-NetIPInterface cmdlet 列出 Windows 中的网络适配器):

Set-NetFirewallProfile -Name Public -DisabledInterfaceAliases "Ethernet0"

正如您所看到的,公共配置文件不再应用于Ethernet0接口:

DisabledInterfaceAliases : {Ethernet0}

您可以使用设置 NetFirewallProfilecmdlet 用于更改配置文件设置(默认操作、日志记录设置、日志文件路径和大小、通知设置等)。您可以为每个网络位置配置文件配置网络连接日志记录设置。默认情况下,Windows 防火墙日志存储在%systemroot%system32LogFilesFirewall,文件大小为4MB。您可以启用连接日志记录并增加最大文件大小:

Set-NetFireWallProfile -Profile Domain -LogBlocked True -LogMaxSize 20000 -LogFileName ‘%systemroot%system32LogFilesFirewallpfirewall.log’

有 9 个 PowerShell cmdlet 可用于管理 Windows 上的防火墙规则:

  • 新的NetFirewall规则
  • 复制 NetFirewallRule
  • 禁用 NetFirewallRule
  • 启用 NetFirewallRule
  • 获取 NetFirewallRule
  • 删除 NetFirewallRule
  • 重命名-NetFirewallRule
  • 设置 NetFirewallRule
  • 显示 NetFirewallRule

让我们看几个简单的示例,了解如何在 Windows 防火墙中打开端口。

例如,如果您想要允许域配置文件和专用配置文件在 TCP 端口 80 和 443 上传入 TCP 连接,请运行以下命令:

New-NetFirewallRule -DisplayName 'HTTP-Inbound' -Profile @('Domain', 'Private') -Direction Inbound -Action Allow -Protocol TCP -LocalPort @('80', '443')

您可以允许或阻止特定应用程序(可执行文件)的网络访问。例如,您可能想要阻止 Firefox 浏览器的出站连接:

New-NetFirewallRule -Program “C:Program Files (x86)Mozilla Firefoxfirefox.exe” -Action Block -Profile Domain, Private -DisplayName “Block Firefox browser” -Description “Block Firefox browser” -Direction Outbound

让我们仅允许来自一个 IP 地址的默认 TCP3389 端口上的传入 RDP 连接:

New-NetFirewallRule -DisplayName "AllowRDP" –RemoteAddress 192.168.2.200 -Direction Inbound -Protocol TCP –LocalPort 3389 -Action Allow

要允许对指定 IP 地址和子网范围内的 IP 地址进行 ICMP ping,请创建以下规则:

$ips = @("192.168.2.15-192.168.2.40", "192.168.100.15-192.168.100.200", ”10.1.0.0/16”)
New-NetFirewallRule -DisplayName "Allow inbound ICMPv4" -Direction Inbound -Protocol ICMPv4 -IcmpType 8 -RemoteAddress $ips -Action Allow
New-NetFirewallRule -DisplayName "Allow inbound ICMPv6" -Direction Inbound -Protocol ICMPv6 -IcmpType 8 -RemoteAddress $ips -Action Allow

将纯文本文件中的 IP 地址列表添加到防火墙规则(每行一个 IP 地址):

$ips=Get-Content C:tempip.txt
Get-NetFirewallrule -DisplayName 'AllowRDP'|Set-NetFirewallRule -RemoteAddress $ips

在上一篇文章中,我们向您展示了如何使用 PowerShell 不仅通过 IP 地址还通过网站的 DNS 名称来阻止对网站的访问。

允许来自指定 IP 地址的所有传入连接。这会将 IP 地址添加到防火墙白名单中:

$IP = '192.168.1.20'
New-NetFirewallRule -DisplayName "Allow $IP" -Direction Inbound -Action Allow -RemoteAddress $IP

使用 PowerShell 修改现有 Windows 防火墙规则

如果要编辑防火墙规则,请使用设置 NetFirewallRulecmdlet。例如,您可能希望为之前创建的规则允许来自特定 IP 地址的入站连接:

Get-NetFirewallrule -DisplayName 'HTTP-Inbound' | Get-NetFirewallAddressFilter | Set-NetFirewallAddressFilter -RemoteAddress 192.168.1.10

了解更多:使用 Ansible 管理 VMware 基础设施

要将多个 IP 地址添加到防火墙规则,请使用以下 PowerShell 脚本:

$ips = @("192.168.2.15", "192.168.2.17",”192.168.100.15”)
$current_ips = (Get-NetFirewallRule -DisplayName 'HTTP-Inbound'| Get-NetFirewallAddressFilter).RemoteAddress
$current_ips += $ips
Get-NetFirewallrule -DisplayName 'HTTP-Inbound'|Set-NetFirewallRule -RemoteAddress $current_ips

防火墙规则中所有 IP 地址的列表:

Get-NetFirewallrule -DisplayName 'Http_inbound'|Get-NetFirewallAddressFilter

从防火墙规则中删除一个 IP 地址:

$removeip = "192.168.100.5"
$current_ips = (Get-NetFirewallRule -DisplayName 'HTTP-Inbound'| Get-NetFirewallAddressFilter).RemoteAddress
$filterIP = $current_ips | Where-Object{ $_ -notin $removeip }
Get-NetFirewallrule -DisplayName 'HTTP-Inbound'|Set-NetFirewallRule -RemoteAddress $filterIP

如何使用 PowerShell 启用/禁用/删除 Windows 防火墙规则

您可以使用禁用 NetFirewallRule启用 NetFirewallRule用于启用和禁用防火墙规则的 cmdlet。

Disable-NetFirewallRule –DisplayName 'HTTP-Inbound'

要允许 ICMP (ping),请运行以下命令:

Enable-NetFirewallRule -Name FPS-ICMP4-ERQ-In

要删除防火墙规则,请使用删除 NetFirewallRulecmdlet。

Remove-NetFirewallRule -DisplayName 'HTTP-Inbound'

要重置所有 Microsoft 防火墙规则并恢复默认设置,请运行以下命令

netsh advfirewall reset

或者:

(New-Object -ComObject HNetCfg.FwPolicy2).RestoreLocalFirewallDefaults()

这将删除所有用户定义的设置以及 Microsoft Defender 防火墙规则。仅保留 Windows 内置的网络访问规则。

在重置防火墙规则之前,您可以将当前设置导出到文件。

netsh advfirewall export "C:Backupfirewall-config.wfw"

稍后,您可以通过导入规则文件来恢复旧的防火墙设置:

netsh advfirewall import "C:Backupfirewall-config.wfw"

PowerShell:列出 Windows 防火墙中的活动规则

为传入流量启用的防火墙规则列表可以显示如下

Get-NetFirewallRule | where {($_.enabled -eq $True) -and ($_.Direction -eq "Inbound")} |ft

您只能列出出站阻止规则:

Get-NetFirewallRule -Action Block -Enabled True -Direction Outbound

如果要在规则中显示程序(可执行文件)名称:

Get-NetFirewallRule -Action Block -Enabled True -Direction Outbound | %{$_.Name; $_ | Get-NetFirewallApplicationFilter}

如您所见,Get-NetFirewallRule cmdlet 不显示防火墙规则的网络端口和 IP 地址。要使用端口号以更方便的方式显示有关允许的入站(出站)连接的详细信息,请使用以下 PowerShell 脚本:

Get-NetFirewallRule -Action Allow -Enabled True -Direction Inbound |
Format-Table -Property Name,
@{Name="Protocol";Expression={($PSItem | Get-NetFirewallPortFilter).Protocol}},
@{Name="LocalPort";Expression={($PSItem | Get-NetFirewallPortFilter).LocalPort}},
@{Name="RemotePort";Expression={($PSItem | Get-NetFirewallPortFilter).RemotePort}},
@{Name="RemoteAddress";Expression={($PSItem | Get-NetFirewallAddressFilter).RemoteAddress}},
Enabled,Profile,Direction,Action

PowerShell 提供了多种用于从命令提示符管理 Windows 防火墙规则的选项。如果发生某些事件,您可以自动运行 PowerShell 脚本来打开/关闭端口。在下面的文章中,我们将介绍基于 PowerShell 和 Windows 防火墙的简单解决方案,通过将攻击者的 IP 地址添加到防火墙规则来自动阻止对 Windows VDS 主机的 RDP 暴力攻击。