PowerShell を使用して Windows ファイアウォール ルールを制御する方法

この記事では、PowerShell を使った Windows Defender ファイアウォールの管理について詳しく説明します。特に GUI や従来のコマンドに慣れている方は、最初は少し難しそうに感じるかもしれません。しかし、一度コツをつかめば、ファイアウォールのオン/オフの切り替え、ルールの作成、設定のリセットなど、何百ものメニューをクリックすることなく、自動化できる便利な方法になります。更新やネットワークの変更後にファイアウォールが適切に動作しなくなる場合があり、PowerShell を直接使用することで、時間とストレスを大幅に節約できます。プロファイルの切り替え、ポートやアプリのルールの作成、さらには内部で実行されている問題のトラブルシューティング方法も紹介します。

PowerShell で Windows ファイアウォールの設定を修正する方法

Windows Defenderファイアウォールを有効または無効にする方法

ほとんどの新しいセットアップではファイアウォールがデフォルトで有効になっていますが、テストや一時的な修正(もちろん長期的な使用は推奨されません)などのために、完全に無効にしたい場合もあります。プロファイルのステータスは、次のコマンドで確認できます。

Get-NetFirewallProfile | Format-Table Name, Enabled

3種類のネットワークタイプ(ドメイン、プライベート、パブリック)と、それぞれのオン/オフが表示されます。設定がおかしい場合や、ネットワーク全体を無効にする必要がある場合は、以下を使用してください。

Set-NetFirewallProfile -All -Enabled False

または、特定のものをターゲットにします。

Set-NetFirewallProfile -Profile Public -Enabled False

これでパブリックネットワークのファイアウォールがオフになります。接続できない問題のトラブルシューティングに役立つかもしれません。ただし、セキュリティに自信がない限り、オフにするのは得策ではありません。設定によっては、この操作を行ってから再起動するか、後で再度有効にすることでWindowsが正常に動作する場合もあります。

ネットワークプロファイルとログ設定を変更する方法

Windowsがネットワークを正しく検出しない場合(例えば、自宅にいるのにパブリックネットワークだと認識してしまうなど)、手動でプロファイルを設定するか、Get-NetConnectionProfileを使用してアクティブなプロファイルを確認することができます。プロファイルを変更するには、以下を実行します。

Set-NetConnectionProfile -InterfaceAlias "Ethernet0" -NetworkCategory Private

「Ethernet0」を実際のネットワーク インターフェイス エイリアスに置き換えます。これは、次のコマンドを実行して確認できます。

Get-NetAdapter | Select Name, InterfaceAlias

トラブルシューティングをより効率的に行うために、ファイアウォールのログ出力を強化することもできます。例えば:

Set-NetFirewallProfile -Profile Domain -LogBlocked True -LogMaxSize 20000 -LogFileName "$env:SystemRoot\System32\LogFiles\Firewall\pfirewall.log"

これにより、Windowsはより詳細なログを保存するようになります。特定の接続がブロックされる理由を調べたい場合に役立ちます。なぜ機能するのかはよく分かりませんが、舞台裏で何が起こっているかを把握するのに役立つことがよくあります。

PowerShell を使用して Windows でファイアウォール ルールを作成する方法

設定をカスタマイズしたり、ポートを開いたり、特定のアプリをブロックしたりする場合、PowerShellにはたくさんのコマンドがあります。最も簡単なのはNew-NetFirewallRuleです。例えば、HTTPおよびHTTPSの受信トラフィックを許可するには、次のようにします。

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

Firefox などのプログラムからのアウトバウンドアクセスをブロックしたいですか? 手順は次のとおりです。

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

または、RDP を特定の IP に制限します。これは、安全な設定では必要な場合が多いためです。

New-NetFirewallRule -DisplayName "Allow RDP from Office" -RemoteAddress 192.168.2.200 -Direction Inbound -Protocol TCP -LocalPort 3389 -Action Allow

もっと凝ってみませんか?特定の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 リストが長い場合は、テキスト ファイルからダンプするだけです。

$ips=Get-Content C:\temp\ip.txt

次に、ルールのリモート アドレスを更新します。

Get-NetFirewallRule -DisplayName 'Allow RDP' | Set-NetFirewallRule -RemoteAddress $ips

ルールの編集も簡単です。Get -NetFirewallRuleで既存のルールを取得し、Set-NetFirewallRuleにパイプすることで、リモートアドレスやポートを微調整できます。

複数のIPに対するルールの作成、または既存のIPのカスタマイズ

複数のIPアドレスを一度に追加するには、スクリプトを使用します。例えば、既存のルールに複数のIPアドレスを追加するには、次のようにします。

$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
Set-NetFirewallRule -DisplayName 'HTTP-Inbound' -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 { $_ -ne $removeip }
Set-NetFirewallRule -DisplayName 'HTTP-Inbound' -RemoteAddress $filterIP

ルールの有効化、無効化、削除を素早く行う

特定のルールが機能しなくなったり、簡単な切り替えを試したい場合は、次を実行します。

Disable-NetFirewallRule -DisplayName 'HTTP-Inbound'

再度オンにするには:

Enable-NetFirewallRule -DisplayName 'HTTP-Inbound'

ルールを完全に消去する必要がある場合は、次のようにします。

Remove-NetFirewallRule -DisplayName 'HTTP-Inbound'

完全にリセットするには (たとえば、状況が混乱した場合など)、次のコマンドですべてのルールをデフォルトに戻すことができます。

netsh advfirewall reset

または

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

ただし、カスタムルールも消去されるので注意してください。機密性の高い設定をいじる場合は、事前にエクスポートしておくことをお勧めします。

netsh advfirewall export "C:\Backup\firewall-config.wfw"
netsh advfirewall import "C:\Backup\firewall-config.wfw"

PowerShell でアクティブなファイアウォール ルールを確認する方法

実際に実行されているルール、特にトラフィックを許可またはブロックするルールを確認したい場合は、次を試してください。

Get-NetFirewallRule | Where-Object { $_. Enabled -eq $true -and $_. Direction -eq 'Inbound' } | Format-Table

送信ルールのみ:

Get-NetFirewallRule -Action Block -Enabled $true -Direction Outbound

ポートや IP などの詳細を確認したい場合は、次の便利なスクリプトが役立ちます。

Get-NetFirewallRule -Action Allow -Enabled $true -Direction Inbound | Format-Table -Property Name, @{Name='Protocol';Expression={(Get-NetFirewallPortFilter -AssociatedNetFirewallRule $_).Protocol}}, @{Name='LocalPort';Expression={(Get-NetFirewallPortFilter -AssociatedNetFirewallRule $_).LocalPort}}, @{Name='RemoteAddress';Expression={(Get-NetFirewallAddressFilter -AssociatedNetFirewallRule $_).RemoteAddress}}

PowerShell を使用すると、特に自動化やネットワークの問題のトラブルシューティングを行う際に、徹底的なファイアウォール管理が非常に簡単になります。

まとめ

全体的に見て、PowerShellを使ったWindows Defenderファイアウォールの管理はそれほど難しくありません。コマンドに慣れれば、メニューをクリックするよりも速く操作できます。プロファイルの有効化/無効化、ポートやアプリのルールの調整、設定のリセットなど、この方法を使えばより細かく制御でき、修正もより迅速に行えます。ただし、ルールを変更する前に必ずエクスポートし、正当な理由がない限りファイアウォールを完全にオフにしないことを覚えておいてください。この記事が少しでもお役に立ち、ファイアウォールのセキュリティ強化とネットワークのセキュリティ維持にお役に立てれば幸いです。

まとめ

  • 現在のファイアウォールの状態を確認するにはGet-NetFirewallProfile
  • オン/オフを切り替えるにはSet-NetFirewallProfile
  • ポート、アプリ、IPのルールを作成するNew-NetFirewallRule
  • パイプでルールを編集するSet-NetFirewallRule
  • 大きな変更を行う前に設定をリセットまたはエクスポートする
  • Get-NetFirewallRuleアクティブなルールを素早く確認するために使用します