PR

WindowsServer 2025 総合ガイド 第07回

WindowsServer 2025 総合ガイド 第07回
Windows Defender Firewall ― ネットワークセキュリティの第一歩

第6回では、ネットワーク設定の基礎として、IPアドレス、サブネットマスク、DNSの概念を学び、PowerShellで設定の確認・変更・トラブルシューティングを行う方法を習得しました。第7回となる今回は、サーバーのセキュリティを守る最前線である「Windows Defender Firewall」について学びます。ファイアウォールの役割と仕組みを理解し、受信規則・送信規則の確認・作成、実務で必要なポート開放設定をPowerShellで行えるようになりましょう。

広告
広告

7.1 この記事で学ぶこと

  • ファイアウォールの役割と仕組み(受信規則・送信規則・ステートフルインスペクション)を理解する
  • ファイアウォールプロファイルの種類と役割を理解する
  • PowerShellでファイアウォールの状態確認と規則の検索ができる
  • 実務で必要なポート開放(HTTP/HTTPS/SSH等)の設定ができる
  • ファイアウォール規則の作成・変更・削除ができる
  • トラブルシューティングの基本手順を身につける

7.2 前提条件

  • 第6回完了(ネットワーク設定の基礎を理解していること)
  • Windows Server 2025にリモートデスクトップ接続できる状態
  • PowerShell 7.4を管理者として起動できる状態

7.3 ファイアウォールの基本概念

ネットワークの設定ができるようになったら、次に考えるべきは「セキュリティ」です。サーバーはインターネットに公開されているため、不正なアクセスや攻撃から守る仕組みが必要です。その最初の防御ラインがファイアウォールです。

7.3.1 ファイアウォールとは

ファイアウォール(Firewall)とは、ネットワークトラフィック(通信データ)を監視・制御し、許可された通信のみを通過させるセキュリティシステムです。名前の由来は「防火壁」で、建物の火災時に炎の広がりを防ぐ壁になぞらえて名付けられました。

サーバーに届くすべての通信は、ファイアウォールによって「許可するか」「拒否するか」を判断されます。Windows Server 2025に標準搭載されている「Windows Defender Firewall with Advanced Security」は、OSレベルで動作するホストベースファイアウォールです。ホストベースファイアウォールとは、個々のコンピュータ上で動作するファイアウォールのことで、ネットワーク機器のファイアウォールとは異なり、そのコンピュータ宛ての通信のみを制御します。

ファイアウォールの判断基準は主に以下の情報です。

  • 送信元・宛先IPアドレス: どのコンピュータからの通信か、どのコンピュータ宛ての通信か
  • プロトコル: TCP、UDP、ICMPなど、通信の種類
  • ポート番号: どのサービス(アプリケーション)宛ての通信か
  • 通信の方向: 外部から内部へ(受信)か、内部から外部へ(送信)か
  • プログラム: どのアプリケーションが通信しているか

7.3.2 受信規則と送信規則

ファイアウォールの規則は、通信の方向によって2種類に分類されます。

受信規則(Inbound Rules)

受信規則は、外部からサーバーに向かってくる通信(インバウンドトラフィック)を制御します。たとえば、クライアントPCからサーバーへのRDP接続や、WebブラウザからサーバーへのHTTPリクエストは受信トラフィックです。

Windows Defender Firewallのデフォルト動作では、受信トラフィックは原則として拒否(ブロック)されます。明示的に許可する規則がなければ、外部からの通信はサーバーに到達しません。これは「ホワイトリスト方式」と呼ばれ、必要な通信のみを明示的に許可する安全な方式です。

送信規則(Outbound Rules)

送信規則は、サーバーから外部に向かう通信(アウトバウンドトラフィック)を制御します。たとえば、サーバーからWindows Updateサーバーへの接続や、外部APIへのリクエストは送信トラフィックです。

デフォルトでは、送信トラフィックは原則として許可されます。サーバーから外部への通信は基本的にすべて通過できます。必要に応じて、特定の送信トラフィックをブロックする規則を作成することもできます。

項目 受信規則(Inbound) 送信規則(Outbound)
通信の方向 外部 → サーバー サーバー → 外部
デフォルト動作 ブロック(拒否) 許可
用途の例 RDP接続、Web公開、SSH接続 Windows Update、外部API呼び出し
設定の考え方 必要なサービスのみ許可する 必要に応じて不要な通信をブロック

7.3.3 ステートフルインスペクション

Windows Defender Firewallは「ステートフルインスペクション」という仕組みを採用しています。これは、通信の「状態」を追跡する機能です。

たとえば、サーバーからWindows Updateサーバーに接続する場合を考えましょう。送信規則によってサーバーからの通信は許可されますが、Windows Updateサーバーからの応答(戻りの通信)はどうなるでしょうか。受信規則のデフォルトは「ブロック」ですから、何も設定がなければ応答が届きません。

ステートフルインスペクションは、この問題を解決します。サーバーが開始した通信(送信)に対する応答(受信)は、確立済みの接続として自動的に許可されます。つまり、サーバーが自ら開始した通信の応答については、受信規則を個別に作成する必要がありません。

ポイント: ステートフルインスペクションのおかげで、管理者は「外部からの新規接続を許可するかどうか」に集中して規則を設計できます。サーバーが自ら開始した通信の戻りパケットは自動的に追跡・許可されるため、送信規則に対応する受信規則を別途作成する必要はありません。

7.4 プロファイルの理解

Windows Defender Firewallでは、ネットワーク接続ごとに「プロファイル」が割り当てられ、プロファイルごとに異なるファイアウォール規則を適用できます。これにより、接続先のネットワーク環境に応じてセキュリティレベルを自動的に切り替えられます。

7.4.1 3種類のプロファイル

プロファイル 適用条件 セキュリティレベル 用途例
ドメイン(Domain) Active Directoryドメインに参加し、ドメインコントローラーと通信可能な場合 企業内ネットワーク
プライベート(Private) 信頼されたネットワーク(自宅やオフィスのLAN)に接続している場合 信頼できるネットワーク
パブリック(Public) 信頼されていないネットワーク(公衆Wi-Fi、インターネット直結)に接続している場合 VPS、公共のネットワーク

VPS環境での注意: ConoHa for Windows Serverなどのクラウド/VPS環境では、ネットワークインターフェースのプロファイルは通常「パブリック」に設定されています。インターネットに直接接続されたサーバーでは、パブリックプロファイルが最も適切なプロファイルです。

7.4.2 プロファイルの確認

現在のネットワーク接続に割り当てられているプロファイルは、Get-NetConnectionProfileコマンドレットで確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 現在のネットワーク接続プロファイルを確認
Get-NetConnectionProfile

実行結果の例:

Name             : ネットワーク
InterfaceAlias   : Ethernet0
InterfaceIndex   : 6
NetworkCategory  : Public
DomainAuthenticationKind : None
IPv4Connectivity : Internet
IPv6Connectivity : NoTraffic

NetworkCategoryの値が現在のプロファイルを示しています。上記の例では「Public」(パブリック)です。

7.4.3 プロファイルの変更

ネットワーク接続のプロファイルを変更するには、Set-NetConnectionProfileコマンドレットを使用します。

[実行環境: PowerShell 7.4 (管理者)]

# ネットワークプロファイルをプライベートに変更する例
Set-NetConnectionProfile -InterfaceAlias "Ethernet0" -NetworkCategory Private

注意: VPS環境ではプロファイルを「パブリック」のままにしておくことを推奨します。インターネットに直接接続されたサーバーのプロファイルを「プライベート」に変更すると、パブリックプロファイルよりも緩い規則が適用され、セキュリティが低下する可能性があります。プロファイルの変更は、その影響を十分に理解した上で行ってください。

7.5 ファイアウォールの状態確認

ファイアウォールの規則を操作する前に、まず現在のファイアウォールの状態を確認しましょう。

7.5.1 プロファイルごとの状態確認

Get-NetFirewallProfileコマンドレットで、各プロファイルのファイアウォール設定を確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# 全プロファイルの状態を確認
Get-NetFirewallProfile |
    Select-Object -Property Name, Enabled, DefaultInboundAction, DefaultOutboundAction

実行結果の例:

Name    Enabled DefaultInboundAction DefaultOutboundAction
----    ------- -------------------- ---------------------
Domain     True                Block                 Allow
Private    True                Block                 Allow
Public     True                Block                 Allow

各プロパティの意味は以下のとおりです。

プロパティ 説明
Name プロファイル名(Domain / Private / Public)
Enabled ファイアウォールが有効かどうか(True = 有効)
DefaultInboundAction 受信トラフィックのデフォルト動作(Block = ブロック)
DefaultOutboundAction 送信トラフィックのデフォルト動作(Allow = 許可)

7.5.2 詳細な設定の確認

ログ設定を含む詳細情報を確認するには、特定のプロファイルを指定して全プロパティを表示します。

[実行環境: PowerShell 7.4 (管理者)]

# パブリックプロファイルの詳細設定を確認
Get-NetFirewallProfile -Name Public |
    Select-Object -Property Name, Enabled, DefaultInboundAction, DefaultOutboundAction,
        LogFileName, LogMaxSizeKilobytes, LogAllowed, LogBlocked

実行結果の例:

Name                  : Public
Enabled               : True
DefaultInboundAction  : Block
DefaultOutboundAction : Allow
LogFileName           : %systemroot%\system32\LogFiles\Firewall\pfirewall.log
LogMaxSizeKilobytes   : 4096
LogAllowed            : False
LogBlocked            : False

デフォルトでは、ファイアウォールのログ記録(LogAllowedLogBlocked)は無効になっています。トラブルシューティング時にはログを有効化すると便利ですが、これについては後述します。

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

Set-NetFirewallProfileコマンドレットで、ファイアウォールの有効・無効を切り替えることができます。

[実行環境: PowerShell 7.4 (管理者)]

# パブリックプロファイルのファイアウォールを無効化する例(非推奨)
Set-NetFirewallProfile -Name Public -Enabled False

# パブリックプロファイルのファイアウォールを有効化する
Set-NetFirewallProfile -Name Public -Enabled True

⚠️ 重要な警告: ファイアウォールの無効化は非推奨です

ファイアウォールを無効化すると、サーバーへのすべての受信トラフィックが許可されてしまい、セキュリティが大幅に低下します。特にVPS環境では、サーバーがインターネットに直接公開されているため、ファイアウォールの無効化は極めて危険です。「通信がうまくいかない」という理由で安易にファイアウォールを無効化するのではなく、必要な規則を正しく作成することで問題を解決してください。トラブルシューティング目的で一時的に無効化する場合でも、必ず速やかに再度有効化してください。

7.6 ファイアウォール規則の確認

Windows Server 2025には、OSのインストール時点で多数のファイアウォール規則がプリセットされています。まずは、既存の規則を確認する方法を学びましょう。

7.6.1 規則の一覧表示

Get-NetFirewallRuleコマンドレットで、設定されている規則の一覧を取得できます。

[実行環境: PowerShell 7.4 (管理者)]

# 全規則の件数を確認
(Get-NetFirewallRule).Count

実行結果の例:

395

Windows Server 2025には数百件の規則が登録されています。すべてを一度に確認するのは現実的ではないため、フィルタリングが重要です。

[実行環境: PowerShell 7.4 (管理者)]

# 有効な受信規則の一覧を表示
Get-NetFirewallRule -Enabled True -Direction Inbound |
    Select-Object -Property DisplayName, Profile, Action |
    Sort-Object -Property DisplayName |
    Format-Table -AutoSize

実行結果の例(一部抜粋):

DisplayName                                            Profile Action
-----------                                            ------- ------
Core Networking - DNS (UDP-In)                             Any  Allow
Core Networking - Dynamic Host Configuration Protocol...   Any  Allow
Remote Desktop - User Mode (TCP-In)                        Any  Allow
Remote Desktop - User Mode (UDP-In)                        Any  Allow
Windows Remote Management (HTTP-In)                     Domain  Allow
...

7.6.2 規則の詳細確認

Get-NetFirewallRuleコマンドレットで取得できる情報には、ポート番号やIPアドレスといった条件が含まれていません。これらの条件は「フィルターオブジェクト」として別のコマンドレットで管理されています。

ポートフィルターの確認

規則に設定されたプロトコルとポート番号は、Get-NetFirewallPortFilterコマンドレットで確認します。

[実行環境: PowerShell 7.4 (管理者)]

# Remote Desktopの受信規則に設定されたポートフィルターを確認
Get-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)" |
    Get-NetFirewallPortFilter |
    Select-Object -Property Protocol, LocalPort, RemotePort

実行結果の例:

Protocol LocalPort RemotePort
-------- --------- ----------
TCP      3389      Any

アドレスフィルターの確認

規則に設定された送信元・宛先IPアドレスは、Get-NetFirewallAddressFilterコマンドレットで確認します。

[実行環境: PowerShell 7.4 (管理者)]

# Remote Desktopの受信規則に設定されたアドレスフィルターを確認
Get-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)" |
    Get-NetFirewallAddressFilter |
    Select-Object -Property LocalAddress, RemoteAddress

実行結果の例:

LocalAddress RemoteAddress
------------ -------------
Any          Any

アプリケーションフィルターの確認

規則に設定されたプログラム(実行ファイル)は、Get-NetFirewallApplicationFilterコマンドレットで確認します。

[実行環境: PowerShell 7.4 (管理者)]

# Remote Desktopの受信規則に設定されたアプリケーションフィルターを確認
Get-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)" |
    Get-NetFirewallApplicationFilter |
    Select-Object -Property Program

実行結果の例:

Program
-------
%SystemRoot%\system32\svchost.exe

7.6.3 規則の検索

特定の規則を検索するにはいくつかの方法があります。

表示名での検索

[実行環境: PowerShell 7.4 (管理者)]

# 表示名にキーワードを含む規則を検索(ワイルドカード使用)
Get-NetFirewallRule -DisplayName "*Remote Desktop*" |
    Select-Object -Property DisplayName, Enabled, Direction, Action

実行結果の例:

DisplayName                              Enabled Direction Action
-----------                              ------- --------- ------
Remote Desktop - User Mode (TCP-In)         True   Inbound  Allow
Remote Desktop - User Mode (UDP-In)         True   Inbound  Allow
Remote Desktop - Shadow (TCP-In)           False   Inbound  Allow
Remote Desktop - User Mode (TCP-In)        False   Inbound  Allow
Remote Desktop - User Mode (UDP-In)        False   Inbound  Allow

ポート番号での検索

特定のポート番号に関連する規則を検索するには、ポートフィルターから逆引きします。

[実行環境: PowerShell 7.4 (管理者)]

# TCPポート3389を使用する規則を検索
Get-NetFirewallPortFilter -Protocol TCP |
    Where-Object -FilterScript { $_.LocalPort -eq "3389" } |
    Get-NetFirewallRule |
    Select-Object -Property DisplayName, Enabled, Direction, Action

実行結果の例:

DisplayName                              Enabled Direction Action
-----------                              ------- --------- ------
Remote Desktop - User Mode (TCP-In)         True   Inbound  Allow
Remote Desktop - User Mode (TCP-In)        False   Inbound  Allow

なぜフィルターオブジェクトが分離されているのか: Get-NetFirewallRuleの出力にポート番号やIPアドレスが含まれていないのは、規則本体とフィルター条件が1対1の関係で別オブジェクトとして管理されているためです。この設計により、規則の検索・変更が柔軟に行えるようになっています。規則本体を取得してからパイプラインでフィルターオブジェクトを取得する、あるいはその逆の操作に慣れておくと、ファイアウォール管理が効率的になります。

7.7 ファイアウォール規則の作成

既存の規則を確認できるようになったら、次は新しい規則を作成してみましょう。New-NetFirewallRuleコマンドレットを使用します。

7.7.1 基本パラメータ

New-NetFirewallRuleの主要なパラメータを以下に示します。

パラメータ 必須 説明 指定例
-DisplayName 規則の表示名。分かりやすい名前を付ける "Allow HTTP Inbound"
-Direction 通信の方向(Inbound / Outbound) Inbound
-Action 規則の動作(Allow / Block) Allow
-Protocol プロトコル(TCP / UDP / ICMPv4 / Any) TCP
-LocalPort ローカル側のポート番号 80@("80","443")
-RemoteAddress 送信元(受信規則)/ 宛先(送信規則)のIPアドレス "192.168.1.0/24"
-Program 対象プログラムの実行ファイルパス "C:\app\myapp.exe"
-Profile 適用するプロファイル(Domain / Private / Public / Any) Public
-Enabled 規則の有効/無効(True / False)。デフォルトはTrue True
-Description 規則の説明文 "Webサーバー用"

7.7.2 基本的な規則の作成例

最もシンプルな規則として、特定のポートへの受信を許可する規則を作成してみましょう。

[実行環境: PowerShell 7.4 (管理者)]

# HTTP(TCPポート80)の受信を許可する規則を作成
New-NetFirewallRule `
    -DisplayName "Allow HTTP Inbound" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 80 `
    -Profile Any `
    -Description "Webサーバー用:HTTP通信を許可"

実行結果の例:

Name                  : {xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx}
DisplayName           : Allow HTTP Inbound
Description           : Webサーバー用:HTTP通信を許可
DisplayGroup          :
Group                 :
Enabled               : True
Profile               : Any
Platform              : {}
Direction             : Inbound
Action                : Allow
EdgeTraversalPolicy   : Block
LooseSourceMapping    : False
LocalOnlyMapping      : False
Owner                 :
PrimaryStatus         : OK
Status                : 規則は、ストアから正しく解析されました。 (65536)
EnforcementStatus     : NotApplicable
PolicyStoreSource     : PersistentStore
PolicyStoreSourceType : Local

DisplayNameの重要性: -DisplayNameパラメータで付ける名前は、後から規則を検索・管理する際の手がかりになります。「何の通信を許可/拒否しているのか」が一目で分かる名前を付けましょう。たとえば「テスト」や「rule1」のような名前は避け、「Allow HTTP Inbound」のように目的とプロトコル・方向が分かる名前にすることを推奨します。

7.7.3 プログラムを指定した規則

ポート番号ではなく、特定のプログラム(実行ファイル)に対して通信を許可・拒否する規則も作成できます。

[実行環境: PowerShell 7.4 (管理者)]

# 特定のアプリケーションの受信を許可する規則を作成
New-NetFirewallRule `
    -DisplayName "Allow MyApp Inbound" `
    -Direction Inbound `
    -Action Allow `
    -Program "C:\Apps\MyApplication\myapp.exe" `
    -Profile Public `
    -Description "カスタムアプリケーション用の受信許可"

7.7.4 複数ポートを一括で開放

-LocalPortパラメータには、配列で複数のポート番号を指定できます。

[実行環境: PowerShell 7.4 (管理者)]

# HTTP(80)とHTTPS(443)を一括で許可する規則を作成
New-NetFirewallRule `
    -DisplayName "Allow HTTP and HTTPS Inbound" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort @("80", "443") `
    -Profile Any `
    -Description "Webサーバー用:HTTPおよびHTTPS通信を許可"

7.8 規則の管理

作成した規則は、有効化・無効化・変更・削除ができます。規則のライフサイクル管理を学びましょう。

7.8.1 規則の有効化・無効化

規則を削除せずに一時的に効果を停止するには、Disable-NetFirewallRuleで無効化します。再度有効にするにはEnable-NetFirewallRuleを使用します。

[実行環境: PowerShell 7.4 (管理者)]

# 規則を無効化
Disable-NetFirewallRule -DisplayName "Allow HTTP Inbound"

# 規則の状態を確認
Get-NetFirewallRule -DisplayName "Allow HTTP Inbound" |
    Select-Object -Property DisplayName, Enabled

実行結果の例:

DisplayName          Enabled
-----------          -------
Allow HTTP Inbound     False

[実行環境: PowerShell 7.4 (管理者)]

# 規則を再度有効化
Enable-NetFirewallRule -DisplayName "Allow HTTP Inbound"

# 規則の状態を確認
Get-NetFirewallRule -DisplayName "Allow HTTP Inbound" |
    Select-Object -Property DisplayName, Enabled

実行結果の例:

DisplayName          Enabled
-----------          -------
Allow HTTP Inbound      True

7.8.2 規則の変更

既存の規則のプロパティを変更するには、Set-NetFirewallRuleコマンドレットを使用します。

[実行環境: PowerShell 7.4 (管理者)]

# 規則の説明を変更
Set-NetFirewallRule -DisplayName "Allow HTTP Inbound" `
    -Description "Webサーバー用:HTTP通信を許可(2026年2月更新)"

アドレスフィルターを変更する場合は、フィルターオブジェクトを取得してから変更します。

[実行環境: PowerShell 7.4 (管理者)]

# 規則のリモートアドレスを特定のIPアドレスに制限
Get-NetFirewallRule -DisplayName "Allow HTTP Inbound" |
    Get-NetFirewallAddressFilter |
    Set-NetFirewallAddressFilter -RemoteAddress "203.0.113.0/24"

7.8.3 規則の削除

Remove-NetFirewallRuleコマンドレットで規則を削除できます。

[実行環境: PowerShell 7.4 (管理者)]

# 規則を削除(確認プロンプトなし)
Remove-NetFirewallRule -DisplayName "Allow HTTP Inbound"

⚠️ 重要な警告: RDP規則の削除・無効化に注意

VPS環境でリモートデスクトップ(RDP: TCPポート3389)に関する規則を誤って削除・無効化すると、サーバーへのRDP接続ができなくなり、管理アクセスが完全に失われる可能性があります。RDPの規則を変更・削除する前に、代替のアクセス手段(VPSコントロールパネルのコンソール機能など)があることを必ず確認してください。不安な場合は、-WhatIfパラメータを使って事前に影響を確認することを強く推奨します。

[実行環境: PowerShell 7.4 (管理者)]

# -WhatIf で実際に削除せずに影響を確認
Remove-NetFirewallRule -DisplayName "Allow HTTP Inbound" -WhatIf

実行結果の例:

WhatIf: Remove-NetFirewallRule を実行する対象はここに表示されます

7.8.4 規則管理のまとめ

操作 コマンドレット 用途
規則の作成 New-NetFirewallRule 新しい規則を作成する
規則の確認 Get-NetFirewallRule 既存の規則を検索・表示する
規則の変更 Set-NetFirewallRule 既存の規則のプロパティを変更する
規則の有効化 Enable-NetFirewallRule 無効化されている規則を有効にする
規則の無効化 Disable-NetFirewallRule 規則を一時的に無効にする
規則の削除 Remove-NetFirewallRule 規則を完全に削除する

7.9 実践例

ここまで学んだ知識を活用して、実務でよく必要になるファイアウォール設定を実践してみましょう。

7.9.1 RDP(TCP 3389)の規則確認

VPS環境では、リモートデスクトップ接続が生命線です。まず、RDPの規則が正しく設定されていることを確認しましょう。

[実行環境: PowerShell 7.4 (管理者)]

# RDP関連の有効な受信規則を確認
Get-NetFirewallRule -DisplayName "*Remote Desktop*" -Enabled True |
    Select-Object -Property DisplayName, Direction, Action, Profile

# RDP規則のポートフィルターも確認
Get-NetFirewallRule -DisplayName "Remote Desktop - User Mode (TCP-In)" -Enabled True |
    Get-NetFirewallPortFilter |
    Select-Object -Property Protocol, LocalPort

実行結果の例:

DisplayName                          Direction Action Profile
-----------                          --------- ------ -------
Remote Desktop - User Mode (TCP-In)    Inbound  Allow     Any
Remote Desktop - User Mode (UDP-In)    Inbound  Allow     Any

Protocol LocalPort
-------- ---------
TCP      3389

RDPの規則が有効であり、TCPポート3389への受信が許可されていることを確認できました。

セキュリティ強化のヒント: 本番環境では、RDPの接続元IPアドレスを制限することを強く推奨します。すべてのIPアドレスからのRDP接続を許可するのではなく、管理者のIPアドレスや社内ネットワークからのみ許可するようにすることで、不正アクセスのリスクを大幅に低減できます。この設定方法は「7.9.5 特定IPアドレスからのみ許可」で解説します。

7.9.2 HTTP/HTTPS(TCP 80/443)の開放

Webサーバーを公開する場合、HTTP(TCPポート80)とHTTPS(TCPポート443)を開放する必要があります。

[実行環境: PowerShell 7.4 (管理者)]

# HTTP(TCPポート80)の受信許可規則を作成
New-NetFirewallRule `
    -DisplayName "Allow HTTP Inbound (TCP 80)" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 80 `
    -Profile Any `
    -Description "Webサーバー公開用:HTTP通信を許可"

# HTTPS(TCPポート443)の受信許可規則を作成
New-NetFirewallRule `
    -DisplayName "Allow HTTPS Inbound (TCP 443)" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 443 `
    -Profile Any `
    -Description "Webサーバー公開用:HTTPS通信を許可"

作成した規則を確認します。

[実行環境: PowerShell 7.4 (管理者)]

# 作成した規則を確認
Get-NetFirewallRule -DisplayName "Allow HTTP*" |
    Select-Object -Property DisplayName, Enabled, Direction, Action

実行結果の例:

DisplayName                         Enabled Direction Action
-----------                         ------- --------- ------
Allow HTTP Inbound (TCP 80)            True   Inbound  Allow
Allow HTTPS Inbound (TCP 443)          True   Inbound  Allow

7.9.3 SSH(TCP 22)の開放

OpenSSH Serverを使用してSSH接続を受け付ける場合、TCPポート22を開放します。

[実行環境: PowerShell 7.4 (管理者)]

# SSH(TCPポート22)の受信許可規則を作成
New-NetFirewallRule `
    -DisplayName "Allow SSH Inbound (TCP 22)" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 22 `
    -Profile Any `
    -Description "OpenSSH Server用:SSH接続を許可"

補足: Windows Server 2025にはOpenSSH Serverを追加インストールできます。OpenSSH Serverをインストールすると、SSHの受信規則が自動的に作成される場合があります。既に規則が存在するかどうかを確認してから作成しましょう。

[実行環境: PowerShell 7.4 (管理者)]

# SSH関連の既存規則を検索
Get-NetFirewallRule -DisplayName "*SSH*" |
    Select-Object -Property DisplayName, Enabled, Direction, Action

7.9.4 カスタムアプリケーション用ポートの開放

業務アプリケーションやデータベースなど、標準的でないポート番号を使用するサービスのために規則を作成する例です。ここでは、TCPポート8080で動作するWebアプリケーションを想定します。

[実行環境: PowerShell 7.4 (管理者)]

# カスタムポート(TCP 8080)の受信許可規則を作成
New-NetFirewallRule `
    -DisplayName "Allow Custom WebApp Inbound (TCP 8080)" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 8080 `
    -Profile Public `
    -Description "カスタムWebアプリケーション用:TCPポート8080を許可"

7.9.5 特定IPアドレスからのみ許可

セキュリティを強化するために、特定のIPアドレスやネットワークからの通信のみを許可する規則を作成できます。これは、管理用ポート(RDPやSSH)へのアクセスを制限する際に特に有効です。

[実行環境: PowerShell 7.4 (管理者)]

# 特定のIPアドレスからのみSSHを許可する規則を作成
New-NetFirewallRule `
    -DisplayName "Allow SSH from Admin Network" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 22 `
    -RemoteAddress "203.0.113.10" `
    -Profile Any `
    -Description "管理者のIPアドレスからのみSSH接続を許可"

複数のIPアドレスやネットワーク範囲を指定する場合は、配列で指定します。

[実行環境: PowerShell 7.4 (管理者)]

# 複数のIPアドレス/ネットワークからのRDPを許可
$allowedAddresses = @(
    "203.0.113.10",        # 管理者PC
    "198.51.100.0/24"      # オフィスネットワーク
)

New-NetFirewallRule `
    -DisplayName "Allow RDP from Trusted Sources" `
    -Direction Inbound `
    -Action Allow `
    -Protocol TCP `
    -LocalPort 3389 `
    -RemoteAddress $allowedAddresses `
    -Profile Any `
    -Description "信頼できるIPアドレスからのみRDP接続を許可"

IPアドレス制限を適用する際の注意: RDPのIPアドレス制限を行う場合は、現在使用している接続元IPアドレスが-RemoteAddressに含まれていることを必ず確認してください。含めずに適用すると、現在のRDP接続を含むすべてのRDP接続が拒否され、サーバーへのアクセスが失われます。自身のグローバルIPアドレスは、Webブラウザで「my ip address」と検索するか、PowerShellで外部サービスに問い合わせることで確認できます。

7.10 トラブルシューティング

ファイアウォールの設定後に通信がうまくいかない場合、以下の手順で原因を調査します。

7.10.1 接続できない場合の確認手順

「特定のポートに接続できない」というトラブルは、ファイアウォール管理でよく遭遇する問題です。以下の手順で切り分けを行いましょう。

Step 1: サービスが起動しているか確認

まず、対象のサービスが起動しているかを確認します。ファイアウォールを開放しても、サービスが停止していればそもそも通信は成立しません。

[実行環境: PowerShell 7.4 (管理者)]

# サービスの状態確認(例:IIS - W3SVC)
Get-Service -Name "W3SVC" |
    Select-Object -Property Name, Status, StartType

Step 2: ポートがリッスンしているか確認

サービスが起動していても、ポートをリッスン(待ち受け)していなければ接続できません。

[実行環境: PowerShell 7.4 (管理者)]

# TCPポート80がリッスンされているか確認
Get-NetTCPConnection -LocalPort 80 -State Listen -ErrorAction SilentlyContinue

実行結果の例(リッスンしている場合):

LocalAddress  LocalPort RemoteAddress RemotePort State  OwningProcess
------------  --------- ------------- ---------- -----  -------------
0.0.0.0       80        0.0.0.0       0          Listen 4

結果が返らない場合、対象のポートをリッスンしているサービスがないことを意味します。

Step 3: ファイアウォール規則を確認

対象のポートに対する受信規則が存在し、有効になっているかを確認します。

[実行環境: PowerShell 7.4 (管理者)]

# TCPポート80に対する有効な受信規則を確認
Get-NetFirewallPortFilter -Protocol TCP |
    Where-Object -FilterScript { $_.LocalPort -eq "80" } |
    Get-NetFirewallRule -Enabled True -Direction Inbound -Action Allow |
    Select-Object -Property DisplayName, Enabled, Profile

Step 4: プロファイルの確認

規則が存在しても、適用されるプロファイルが現在のネットワークプロファイルと一致しない場合、規則は効果を持ちません。

[実行環境: PowerShell 7.4 (管理者)]

# 現在のネットワークプロファイルを確認
Get-NetConnectionProfile |
    Select-Object -Property InterfaceAlias, NetworkCategory

現在のプロファイルが「Public」なのに、規則が「Domain」のみに適用されている場合、その規則は効果がありません。規則の-ProfileAnyに変更するか、現在のプロファイルを含むように修正してください。

Step 5: リモート側からの疎通確認

第6回で学んだTest-NetConnectionを使って、リモートからの接続をテストします。

[実行環境: PowerShell 7.4 (一般ユーザー: クライアントPC)]

# クライアントPCからサーバーへの疎通確認
Test-NetConnection -ComputerName "サーバーのIPアドレス" -Port 80

7.10.2 ログの有効化と確認

ファイアウォールの動作をより詳しく調査するには、ログを有効化してブロックされた通信を記録します。

ログの有効化

[実行環境: PowerShell 7.4 (管理者)]

# パブリックプロファイルのログを有効化(ブロックされた通信を記録)
Set-NetFirewallProfile -Name Public `
    -LogBlocked True `
    -LogMaxSizeKilobytes 16384 `
    -LogFileName "%systemroot%\system32\LogFiles\Firewall\pfirewall.log"

各パラメータの意味は以下のとおりです。

パラメータ 説明
-LogBlocked True ブロックされた通信をログに記録する
-LogAllowed True 許可された通信をログに記録する(必要に応じて追加)
-LogMaxSizeKilobytes ログファイルの最大サイズ(KB単位)。デフォルトは4096(4MB)
-LogFileName ログファイルの保存先パス

ログの確認

ログファイルはテキスト形式で保存されます。PowerShellで内容を確認できます。

[実行環境: PowerShell 7.4 (管理者)]

# ログファイルの末尾20行を表示
Get-Content -Path "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" -Tail 20

実行結果の例:

#Version: 1.5
#Software: Microsoft Windows Firewall
#Time Format: Local
#Fields: date time action protocol src-ip dst-ip src-port dst-port size tcpflags tcpsyn tcpack tcpwin icmptype icmpcode info path pid
2026-02-08 10:23:45 DROP TCP 198.51.100.50 203.0.113.5 54321 445 52 S 1234567890 0 65535 - - - RECEIVE -
2026-02-08 10:23:48 DROP TCP 198.51.100.50 203.0.113.5 54322 3306 52 S 1234567891 0 65535 - - - RECEIVE -

ログの各フィールドの意味は以下のとおりです。

フィールド 説明
date / time イベントの日時
action 動作(DROP = ブロック、ALLOW = 許可)
protocol プロトコル(TCP、UDPなど)
src-ip 送信元IPアドレス
dst-ip 宛先IPアドレス
src-port 送信元ポート番号
dst-port 宛先ポート番号

特定の条件でログを絞り込む

[実行環境: PowerShell 7.4 (管理者)]

# ブロックされたTCPポート80への通信を検索
Get-Content -Path "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" |
    Select-String -Pattern "DROP.*TCP.*\s80\s"

リアルタイムでログを監視する

[実行環境: PowerShell 7.4 (管理者)]

# リアルタイムでブロックされた通信を監視(Ctrl+C で停止)
Get-Content -Path "C:\Windows\System32\LogFiles\Firewall\pfirewall.log" -Wait |
    Select-String -Pattern "DROP"

ログの無効化について: トラブルシューティングが完了したら、パフォーマンスとディスク使用量を考慮して、不要なログを無効化することを検討してください。特に-LogAllowed True(許可された通信のログ)は通信量が多いサーバーではログファイルが急速に肥大化する可能性があります。

[実行環境: PowerShell 7.4 (管理者)]

# ログの無効化
Set-NetFirewallProfile -Name Public `
    -LogBlocked False `
    -LogAllowed False

7.10.3 一時的な無効化によるテスト

どうしても原因が特定できない場合、ファイアウォールを一時的に無効化してテストする方法があります。ファイアウォールを無効化した状態で通信が成功すれば、ファイアウォール規則に問題があると切り分けできます。

[実行環境: PowerShell 7.4 (管理者)]

# 現在のファイアウォール状態を記録
Get-NetFirewallProfile |
    Select-Object -Property Name, Enabled

# パブリックプロファイルを一時的に無効化(テスト目的のみ)
Set-NetFirewallProfile -Name Public -Enabled False

# ※ここでクライアントPCから接続テストを実施

# テスト完了後、速やかにファイアウォールを再度有効化
Set-NetFirewallProfile -Name Public -Enabled True

⚠️ 重要な警告: ファイアウォールの一時的な無効化は、あくまで最終手段としてのテスト目的でのみ使用してください。無効化中はサーバーがすべての受信トラフィックに対して無防備になります。テストが完了したら、必ず速やかにファイアウォールを再度有効化してください。VPS環境では、無効化の時間を最小限(数十秒〜数分)にとどめてください。

7.10.4 トラブルシューティングのフローチャート

接続できない場合のトラブルシューティング手順を整理します。

接続できない
  │
  ├─ サービスは起動しているか?
  │   └─ NO → サービスを起動(Start-Service)
  │
  ├─ ポートはリッスンしているか?(Get-NetTCPConnection)
  │   └─ NO → サービスの設定を確認
  │
  ├─ 受信規則は存在するか?(Get-NetFirewallRule)
  │   └─ NO → 規則を作成(New-NetFirewallRule)
  │
  ├─ 規則は有効か?(Enabled = True)
  │   └─ NO → 規則を有効化(Enable-NetFirewallRule)
  │
  ├─ プロファイルは一致しているか?
  │   └─ NO → 規則のプロファイルを修正(Set-NetFirewallRule)
  │
  ├─ アドレス制限はないか?
  │   └─ あり → 送信元IPアドレスが許可範囲内か確認
  │
  └─ ファイアウォールを一時無効化してテスト
      ├─ 接続成功 → ファイアウォール規則の問題
      └─ 接続失敗 → ファイアウォール以外の問題
                    (ネットワーク設定、ルーティング等)

7.11 よくあるエラーと対処法

エラー・問題 原因 対処法
RDP接続ができなくなった RDP規則を誤って削除・無効化した、またはIPアドレス制限が不正 VPSコントロールパネルのコンソール機能でログインし、規則を復元する。Enable-NetFirewallRule -DisplayName "Remote Desktop*"
New-NetFirewallRuleでアクセス拒否 管理者権限でPowerShellを実行していない PowerShell 7.4を「管理者として実行」で起動し直す
規則を作成したのにポートに接続できない サービスが起動していない、またはポートをリッスンしていない Get-NetTCPConnectionでリッスン状態を確認。サービスの起動を確認する
規則を作成したが効かない プロファイルの不一致。規則のProfileが現在のネットワークプロファイルと異なる Get-NetConnectionProfileで現在のプロファイルを確認し、規則のProfileを修正する
DisplayNameで規則が見つからない 表示名のスペルミス、または規則が別のDisplayNameで登録されている ワイルドカード(*keyword*)で検索するか、Get-NetFirewallRuleで全規則を一覧表示して探す
ログファイルに何も記録されない ログ記録が有効化されていない Set-NetFirewallProfile-LogBlocked Trueを設定する

7.12 まとめ

今回は、Windows Defender Firewallの基本概念から実践的な規則の管理までを学びました。

  • ファイアウォールの基本概念
    • ファイアウォールはネットワークトラフィックを監視・制御し、許可された通信のみを通過させるセキュリティシステム
    • 受信規則(Inbound)はデフォルトでブロック、送信規則(Outbound)はデフォルトで許可
    • ステートフルインスペクションにより、サーバーが開始した通信の応答は自動的に許可
  • プロファイル
    • ドメイン・プライベート・パブリックの3種類があり、ネットワーク環境に応じて適用
    • VPS環境ではパブリックプロファイルが適用される
    • Get-NetConnectionProfileで確認、Set-NetConnectionProfileで変更
  • 規則の確認
    • Get-NetFirewallRuleで規則本体を取得
    • ポート・アドレス・プログラムの条件はフィルターオブジェクト(Get-NetFirewallPortFilter等)で確認
    • パイプラインを使って規則とフィルターを連携して検索
  • 規則の作成と管理
    • New-NetFirewallRuleで新規作成。-DisplayNameには分かりやすい名前を付ける
    • Enable-NetFirewallRule / Disable-NetFirewallRuleで有効化・無効化
    • Set-NetFirewallRuleで変更、Remove-NetFirewallRuleで削除
  • セキュリティ上の注意
    • ファイアウォールの無効化は非推奨。規則を正しく設定して対処する
    • VPS環境ではRDP規則の削除・無効化に最大限の注意を払う
    • 管理用ポートへはIPアドレス制限の適用を推奨
  • トラブルシューティング
    • サービス起動 → ポートリッスン → 規則存在 → 規則有効 → プロファイル一致の順で確認
    • ログを有効化して、ブロックされた通信を記録・分析

ファイアウォールの管理は、サーバーセキュリティの基本中の基本です。「必要な通信のみを明示的に許可し、それ以外はブロックする」という原則を常に意識して、安全なサーバー運用を心がけてください。

7.13 次回予告

第8回では「イベントログとパフォーマンス監視 ― トラブルシューティングの基本」と題して、イベントログの構造と読み方、PowerShellによるログの検索・分析方法、パフォーマンスカウンターを使ったシステムリソースの監視方法を学びます。サーバーに問題が発生した際に「何が起きたのか」を調査するスキルは、インフラエンジニアにとって欠かせない能力です。

7.14 参考リンク

Windows Server