Windows Server
 Computer >> コンピューター >  >> システム >> Windows Server

PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

本記事では、PowerShellを使ってWindows Defenderファイアウォール(セキュリティが強化されたWindows Defender ファイアウォール)の設定やルールを管理する基本操作を解説します。ネットワークプロファイルごとのファイアウォールの有効化・無効化、ファイアウォールルールの作成・削除、さらに現在アクティブなルールを見やすい表形式で一覧表示するスクリプトの作成方法まで、順を追って紹介します。

Windowsファイアウォールの設定は、GUIから「コントロールパネル」→「システムとセキュリティ」→「Windows Defender ファイアウォール」でも管理できます。しかし、Windows 8.1(Windows Server 2012 R2)以降では、内蔵のNetSecurity PowerShellモジュールを使うことで、コマンドラインから効率的にファイアウォールを操作できます。

以前はnetsh advfirewall firewallコマンドがファイアウォール管理の定番でしたが、NetSecurityモジュールの方が柔軟で自動化にも向いています。Windows 10のNetSecurityモジュールには85個のコマンドレットが用意されており、以下のコマンドで全リストを確認できます。

Get-Command -Module NetSecurity

PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

PowerShellでネットワークプロファイルを管理する方法

Windowsファイアウォールには、次の3種類のネットワークプロファイルが存在します。

  • ドメイン(Domain):Active Directoryドメインに参加しているコンピューターに適用されるプロファイル
  • プライベート(Private):家庭や社内など信頼できるネットワーク向けのプロファイル
  • パブリック(Public):カフェや空港などの公衆ネットワーク向けのプロファイル
PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

ネットワークの種類に関する情報は、NLA(Network Location Awareness)サービスがデータベースとして保持しています。ネットワークプロファイルが誤って検出された場合は、手動で変更することも可能です。

各プロファイルにはそれぞれ異なるファイアウォールルールセットを割り当てられます。デフォルトでは、コンピューターのすべてのネットワークインターフェースがファイアウォールで保護され、3種類すべてのプロファイルが適用された状態になっています。

ファイアウォールの有効化・無効化

ドメイン、パブリック、プライベートの3つのプロファイルすべてを有効にするには、次のコマンドを実行します。

Set-NetFirewallProfile -All -Enabled True

特定のプロファイルだけを対象にしたい場合は、「All」の代わりにプロファイル名を指定します。

Set-NetFirewallProfile -Profile Public -Enabled True

逆に、3つのネットワークプロファイルすべてでファイアウォールを無効化するには、次のコマンドを使用します。

Set-NetFirewallProfile -All -Enabled False

Set-NetFirewallProfileコマンドレットでは、既定の動作、ログ記録、ログファイルの保存先とサイズ、通知設定など、プロファイルに関する各種オプションも変更可能です。

既定の受信動作を変更する

最近のWindowsでは、ファイアウォールはすべてのプロファイルで有効になっており、既定では「送信接続は許可」「受信接続はブロック(許可されたものを除く)」という設定になっています。

例として、パブリックプロファイルの既定動作を「すべての受信接続をブロック」に変更してみましょう。

Set-NetFirewallProfile –Name Public –DefaultInboundAction Block

現在のプロファイル設定は、次のコマンドで確認できます。

Get-NetFirewallProfile -Name Public

PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

GPO(グループポリシー)でファイアウォール設定を管理している場合は、実際に適用されている結果の設定を次のコマンドで表示できます。

Get-NetFirewallProfile -policystore activestore

特定インターフェースへの適用確認と除外

ファイアウォール設定がコンピューターのすべてのネットワークインターフェースに適用されているか確認しましょう。

Get-NetFirewallProfile -Name Public | fl DisabledInterfaceAliases

すべてのインターフェースが保護されている場合、コマンドは次のような結果を返します。

DisabledInterfaceAliases : {NotConfigured}
PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

特定のインターフェースだけプロファイルの適用を除外することもできます。インターフェース名の一覧はGet-NetIPInterfaceで取得できます。

Set-NetFirewallProfile -Name Public -DisabledInterfaceAliases "Ethernet0"

実行後、パブリックプロファイルがEthernet0に適用されなくなったことが確認できます。

DisabledInterfaceAliases : {Ethernet0}
PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

ファイアウォールログの設定

ネットワーク接続のログ設定はプロファイル単位で行えます。デフォルトでは、Windowsファイアウォールのログは %systemroot%\system32\LogFiles\Firewall に保存され、ファイルサイズの上限は4MBです。すべての接続ログを有効にし、最大サイズを変更する例がこちらです。

Set-NetFireWallProfile -Profile Domain -LogBlocked True -LogMaxSize 20000 -LogFileName '%systemroot%\system32\LogFiles\Firewall\pfirewall.log'

PowerShellでファイアウォールルールを作成・編集・削除する方法

ファイアウォールルールの管理には、次の9つのコマンドレットを使用します。

  • New-NetFirewallRule
  • Copy-NetFirewallRule
  • Disable-NetFirewallRule
  • Enable-NetFirewallRule
  • Get-NetFirewallRule
  • Remove-NetFirewallRule
  • Rename-NetFirewallRule
  • Set-NetFirewallRule
  • Show-NetFirewallRule

ポートを開放するルールの作成

ここからは、Windowsファイアウォールでポートを開く具体的な例を紹介します。

たとえば、ドメインプロファイルとプライベートプロファイルに対して、TCPポート80番と443番への受信接続を許可するには、次のコマンドを実行します。

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

PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

アプリケーションの通信を許可・ブロックする

アプリケーションごとにネットワークアクセスを許可またはブロックすることもできます。たとえば、Firefoxの送信接続をブロックするには次のようにします。

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

特定IPアドレスのみRDPを許可する

RDP(ポート3389)への受信接続を、特定の1つのIPアドレスからのみ許可する例です。

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

Ping(ICMP)を特定サブネットに限定して許可する

指定したIPサブネットやIP範囲に対してPing(ICMP)を許可するには、次のコマンドを使用します。

$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

なお、以前の記事では、PowerShellを使ってIPアドレスおよびドメイン名(DNS名)の両方でサイトへのアクセスをブロックする方法を紹介しています。併せて参考にしてください。

既存ルールの編集

既存のファイアウォールルールを編集するには、Set-NetFirewallRuleコマンドレットを使用します。たとえば、先ほど作成したルールに対して、特定のIPアドレスからの受信接続を許可するには次のようにします。

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

複数のIPアドレスをルールに追加したい場合は、次のスクリプトが便利です。

$ips = @("192.168.2.15", "192.168.2.17", "192.168.100.15")
Get-NetFirewallrule -DisplayName 'WEB-Inbound'|Set-NetFirewallRule -RemoteAddress $ips

ルールに含まれるすべてのIPアドレスを表示するには、次のコマンドを実行します。

Get-NetFirewallrule -DisplayName 'Allow inbound ICMPv4'|Get-NetFirewallAddressFilter

PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

ルールの有効化・無効化・削除

ファイアウォールルールの有効化・無効化には、Disable-NetFirewallRuleおよびEnable-NetFirewallRuleコマンドレットを使用します。

Disable-NetFirewallRule –DisplayName 'WEB-Inbound'

ICMP(Ping)を許可する組み込みルールを有効化する例です。

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

ファイアウォールルールを削除するには、Remove-NetFirewallRuleコマンドレットを使用します。

PowerShellでファイアウォールルールを一覧表示する

受信トラフィックに対するアクティブなファイアウォールルールの一覧は、次のコマンドで表示できます。

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}

PowerShellでWindowsファイアウォールの設定とルールを管理する完全ガイド

ご覧のとおり、Get-NetFirewallRuleコマンドレットだけでは、ルールに設定されたポート番号や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を使えばWindowsファイアウォールのルールをコマンドラインから柔軟に管理できます。特定のイベント発生時にポートを開閉するPowerShellスクリプトを自動実行することも可能です。次回の記事では、Windows VDSサーバー上でRDP経由の総当たり(ブルートフォース)攻撃を試みるIPアドレスを、PowerShellとWindowsファイアウォールを組み合わせて自動的にブロックするシンプルなソリューションを紹介します。

  1. PowerShellとWindows Defenderファイアウォールでドメイン・Webサイトをブロックする方法

    本記事では、サードパーティ製ツールを使わずに、特定のWebサイト、ドメイン名、URL、IPアドレスへのアクセスをブロックする方法を解説します。ここでは、Windows 10の標準機能とPowerShellの自動化機能を活用して、特定のWebサイトをブロックする手順を実際に試していきます。 なお、通常はネットワークルーター(インターネット接続に使用しているスイッチやWi-Fiアクセスポイント)や、コンテンツフィルター・DNSフィルターなどのサードパーティ製ソフトウェアを使ってWebサイトをブロックする方が簡単です。 Windowsのhostsファイルを使ってWebサイトをブロックする Windo

  2. Windows 10 ファイアウォールのルールと設定を調整する方法【初心者向け解説】

    Windows 10 の Windows ファイアウォールは、Vista 時代から大きな変更はなく、基本的な仕組みはほぼ同じです。受信(インバウンド)接続は、許可リストに登録されていない限りブロックされ、一方で送信(アウトバウンド)接続はルールに一致しない場合でもブロックされません。また、ファイアウォールにはパブリックとプライベートという2つのネットワークプロファイルが用意されており、プライベートネットワークとインターネットのそれぞれで、どのプログラムが通信できるのかを細かく制御できます。 この記事では、Windows 10 ファイアウォールのさまざまなオプションや設定項目を解説し、自分のニー