使用PowerShell管理Windows防火墙规则

本文涵盖了通过PowerShell命令行的高级安全性管理内置Windows Defender防火墙的设置和规则的基础。我们将研究如何启用/禁用防火墙以获取不同的网络配置文件,创建或删除防火墙规则,以及使用PowerShell导入/导出Windows防火墙规则。

内容:

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

您可以使用命令:

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

在此示例中,将域授权的配置文件应用于以太网网络连接。

如果在远程计算机上配置了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"

如您所见,公共配置文件不再应用于以太网界面::

DisabledInterfaceAliases : {Ethernet0}

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

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

有9个PowerShell CMDLET来管理Windows上的防火墙规则:

  • 新网络壁炉
  • 复制netfirewallrule
  • 禁用新网络
  • 启用netfirewallrule
  • Get-NetfireWallrule
  • 删除NetFireWallrule
  • 重命名netFireWallrule
  • set-netFireWallrule
  • Show-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防火墙规则

如果要编辑防火墙规则,请使用set-netFireWallrulecmdlet。例如,您可能需要从特定IP地址的入站连接,以获取先前创建的规则:

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

要将多个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防火墙规则

您可以使用禁用新网络启用netfirewallruleCMDLET启用并禁用防火墙规则。

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 Brute-Force攻击。