「開発機では問題なく動くのに、客先に入れたらクライアントからサーバーにつながらない」「初回起動のときに何か警告が出て、現場の人がキャンセルしたらしい」「netstatで見るとポートは待ち受けているのに、隣のPCからは届かない」── 業務アプリの導入現場で、この種の「通信できない」の問い合わせは定番中の定番です。そして原因の上位に居座り続けているのが、Windowsファイアウォール(Windows Defender Firewall)です。
やっかいなのは、開発機では問題が見えないことです。開発機ではVisual Studioのデバッグ実行時に自分で許可を押していたり、そもそも自分が管理者だったりするため、既定の受信ブロックに気づかないまま出荷してしまう。一方の客先では、操作するのは管理者権限のない一般ユーザーで、ネットワークはGPOで管理されている。「動くはずのものが動かない」のではなく、「開発機がたまたま動いていた」が実態です。
この記事では、自社開発アプリで「客先で通信できない」に直面する業務アプリ開発者と、その問い合わせを受ける中小企業の情シス担当者を対象に、Windowsファイアウォールの既定動作とプロファイルの仕組みを最低限押さえたうえで、受信規則の設計、インストーラーでの登録実務、切り分け手順、GPO/Intune管理下での注意点までを、2026年8月時点の一次情報にもとづいて整理します。
1. まず結論
- Windowsファイアウォールの既定は「受信はブロック、送信は許可」です。要求への応答ではない受信トラフィックは、規則に一致しない限り破棄されます。1
- 受信規則が必要なのは、ポートを待ち受けるサーバー型のアプリだけです。自分から接続するだけのクライアントアプリは、既定のままで通信できます。まずここで切り分けてください。1
- プロファイルは3つ(ドメイン/プライベート/パブリック)。ドメインはドメインコントローラー検出時に自動適用、パブリックは未識別ネットワークの既定です。規則はプロファイル単位で有効・無効が決まります。1
- あの「重要な警告」ダイアログに本番を任せてはいけません。管理者がキャンセルするとブロック規則が作られ、管理者権限のないユーザーではどのボタンを押してもブロック規則が作られます。作られた規則を削除するまでダイアログは再表示されません。2
- 結論は「業務アプリの受信規則はインストーラーで登録する」です。Microsoft自身が、初回起動前に規則を配置し、受信通知は無効化することを推奨しています。2
- 規則は最小権限で設計します。プログラム+プロトコル+ポートを軸に、プロファイルをドメイン/プライベートに限定し、リモートIPを必要なサブネットに絞ります。プログラムパスにワイルドカードは使えません。23
- 切り分けは Test-NetConnection → Get-NetFirewallRule → pfirewall.log の順です。ファイアウォールログは既定では書き込まれず、破棄パケットの記録を有効にして初めて出ます。456
- サービス停止による全体無効化はサポート対象外です。GPO/Intune管理下では「ローカル規則のマージ」が無効化されている場合があり、そのときローカル規則は効きません。規則の集中配布を情シスに申請します。12
この記事の知識マップ
Windowsファイアウォールの既定は受信ブロック・送信許可で、受信の規則が必要なのはポートを待ち受けるサーバー型の業務アプリだけです。規則のないアプリが待ち受けると「重要な警告」ダイアログが表示されますが、操作次第でブロック規則が焼き付いて通信できない障害の原因になるため、受信規則はインストーラーで登録するのが原則です。GPO/Intune管理下ではローカル規則のマージが無効化され、ローカルで登録した規則が適用されないこともあります。
flowchart LR
accTitle: Windowsファイアウォールと業務アプリの知識マップ
accDescr: Windowsファイアウォール、受信の規則、待ち受け型アプリ、「重要な警告」ダイアログ、インストーラーと管理者権限、規則の絞り込み(プログラム指定・リモートIP限定)、ローカル規則のマージ、通信できない障害と切り分けコマンドの関係を示す図
windows_firewall["Windowsファイアウォール"]
inbound_rule["受信の規則"]
listen_app["待ち受け型の業務アプリ"]
installer["インストーラー"]
network_profile["ネットワークプロファイル"]
communication_failure["「通信できない」障害"]
firewall_notification["「重要な警告」ダイアログ"]
exe_path_change["実行ファイルのパス変更"]
pfirewall_log["ファイアウォールログ(pfirewall.log)"]
group_policy["グループポリシー"]
intune["Microsoft Intune"]
local_policy_merge["ローカル規則のマージ"]
mpssvc["ファイアウォールサービス(MpsSvc)"]
port_rule["ポート指定の規則"]
over_permission["規則の過剰許可"]
test_netconnection["Test-NetConnection"]
get_netfirewallrule["Get-NetFirewallRule"]
unsolicited_inbound["未要求の受信通信"]
netsh_advfirewall["netsh advfirewall"]
new_netfirewallrule["New-NetFirewallRule"]
admin_rights["管理者権限"]
remote_ip_scope["リモートIPの限定"]
program_rule["プログラム指定の規則"]
mpssvc_stop["MpsSvcサービスの停止"]
firewall_disable["ファイアウォールの無効化"]
named_pipe["名前付きパイプ"]
smb_445["SMB(TCP 445)"]
get_netconnectionprofile["Get-NetConnectionProfile"]
block_rule["ブロック規則"]
notify_disable["受信通知の無効化"]
service_rule["サービス指定の規則"]
profile_limit["プロファイルの限定"]
updater_reregistration["更新時の規則再登録"]
netstat["netstat"]
listen_app -->|"前提とする"| inbound_rule
inbound_rule -->|"で構成できる"| installer
network_profile -.->|"原因になり得る"| communication_failure
firewall_notification -.->|"原因になり得る"| communication_failure
exe_path_change -.->|"原因になり得る"| communication_failure
communication_failure -->|"で確認できる"| pfirewall_log
windows_firewall -->|"で構成できる"| group_policy
windows_firewall -->|"で構成できる"| intune
inbound_rule -.->|"前提とする"| local_policy_merge
mpssvc -->|"実装を担う"| windows_firewall
windows_firewall -->|"利用する"| network_profile
port_rule -.->|"原因になり得る"| over_permission
exe_path_change -.->|"原因になり得る"| firewall_notification
firewall_notification -->|"で構成できる"| group_policy
communication_failure -->|"で確認できる"| test_netconnection
communication_failure -->|"で確認できる"| get_netfirewallrule
windows_firewall -->|"防止する"| unsolicited_inbound
inbound_rule -->|"で構成できる"| netsh_advfirewall
inbound_rule -->|"で構成できる"| new_netfirewallrule
inbound_rule -->|"前提とする"| admin_rights
remote_ip_scope -->|"軽減する"| over_permission
program_rule -->|"軽減する"| over_permission
firewall_notification -->|"用いるのは非推奨"| inbound_rule
mpssvc_stop -->|"用いるのは非推奨"| firewall_disable
remote_ip_scope -->|"推奨される対応"| over_permission
program_rule -->|"推奨される対応"| over_permission
named_pipe -->|"利用する"| smb_445
network_profile -->|"で確認できる"| get_netconnectionprofile
firewall_notification -.->|"原因になり得る"| block_rule
block_rule -->|"原因になり得る"| communication_failure
notify_disable -->|"防止する"| firewall_notification
service_rule -->|"軽減する"| over_permission
profile_limit -->|"軽減する"| over_permission
updater_reregistration -->|"推奨される対応"| exe_path_change
communication_failure -->|"で確認できる"| netstat
図の実線は常に成り立つ関係、破線は条件付きの関係です(成立条件は詳細ページの各関係の説明に記載)。関係すべての一覧(全35件、根拠・確度つき)と主要概念の定義は知識マップ詳細ページにまとめています。データ: JSON-LD / Turtle
2. 既定動作を正確に ── 受信は既定ブロック、送信は既定許可
最初に土台を正確に押さえます。Windowsファイアウォールは全エディションで既定で有効なホスト型ファイアウォールで、既定の動作は次の2行に尽きます。1
- 受信(inbound): 要求への応答(solicited)であるか、規則に一致しない限りすべてブロック
- 送信(outbound): 規則に一致しない限りすべて許可
この2行から、業務アプリにとっての最重要の切り分けが出てきます。受信規則が必要なのは「待ち受ける側」だけです。
- 社内のWebサーバー・DBサーバー・基幹システムに自分から接続するだけのクライアントアプリ → 原則、規則は不要。接続の戻りのパケットは「要求への応答」なので既定で通ります。
- TCPやgRPC、独自プロトコルなどでポートを開いて接続を待ち受けるサーバー型のアプリ・Windowsサービス → 受信規則が必須。
- なお、名前付きパイプをリモートから使う構成は例外です。リモートの名前付きパイプはアプリ自身のポートではなくSMB(TCP 445)を経由するため、必要になるのはアプリの規則ではなくファイル共有(SMB)側の規則です。
- 例外は、送信既定を明示的にブロックへ変えている高セキュリティ環境です。この構成は一部の組織にしかありませんが、その場合はクライアントアプリにも送信規則の申請が要ります。2
flowchart TB
APP["自社アプリの通信を洗い出す"] --> Q{"ポートを開いて<br/>接続を待ち受けるか"}
Q -- "待ち受けない<br/>(クライアントとして接続するだけ)" --> C1["受信規則は原則不要<br/>接続の戻りは「応答」として通る"]
Q -- "待ち受ける<br/>(サーバー型・コールバック受信)" --> S1["受信規則が必須<br/>→ インストーラーで登録(5章)"]
C1 -.-> EX["例外: 送信既定ブロックの<br/>高セキュリティ環境では送信規則を申請"]
「クライアントのはずのアプリが実は待ち受けもしている」ケース(結果のコールバック受信、他プロセスからの通知受け口など)は見落としがちです。自作アプリがどの通信方式で待ち受けているかあいまいなら、設計段階の整理として「プロセス間通信の選び方」もあわせて確認してください。
2.1. プロファイルと「ネットワークの場所」
規則はネットワークプロファイル単位で適用されます。プロファイルは3つです。1
| プロファイル | 適用される条件 | 想定される場所 |
|---|---|---|
| ドメイン | ADドメイン参加PCがドメインコントローラーを検出すると自動適用。手動設定は不可 | 社内ドメインネットワーク |
| プライベート | 管理者がネットワークインターフェイスに手動で設定 | 家庭・小規模オフィスのLAN |
| パブリック | 未識別ネットワークの既定。最も厳しい前提で設計されている | 公衆Wi-Fi、ホテル、空港 |
現在どのプロファイルが適用されているかは Get-NetConnectionProfile で確認でき、プライベート/パブリックの切り替えは Set-NetConnectionProfile で行えます。1 現場でよくある事故は、客先の workgroup 環境でネットワークが「パブリック」判定になっており、ドメイン/プライベート限定で作った受信規則が適用されていないというものです。「規則はあるのに通らない」ときは、規則の中身より先にプロファイルの一致を疑ってください。
2.2. 規則の優先順位
規則が複数あるときの評価は、重み付けの順序リストではなく、次の一貫した原則で決まります。2
- 明示的な許可規則は、既定のブロックに優先する
- 明示的なブロック規則は、競合する許可規則に優先する
- 上記2に反しない範囲で、より具体的な規則が優先する
実務上の含意は「どこかにブロック規則が1本あると、後からいくら許可規則を足しても勝てない」ということです。次章で見るとおり、まさにこのブロック規則を、あのダイアログが静かに作ります。
3. 「重要な警告」ダイアログの正体 ── 任せてはいけない理由
アプリが初めてポートの待ち受け(listen)を開始したとき、そのアプリに対する許可規則も管理者定義の規則も存在しなければ、Windowsは「このアプリの機能のいくつかがWindows Defenderファイアウォールでブロックされています」という、おなじみの「Windowsセキュリティの重要な警告」ダイアログを表示します。挙動の仕様は明確です。2
- 管理者権限のあるユーザーに表示された場合: 「アクセスを許可する」で許可規則が作られます。しかし「キャンセル」を押すと、ブロック規則が作られます。通常はTCP用とUDP用の2本です。
- 管理者権限のないユーザーに表示された場合: どの選択肢を選んでもブロック規則が作られます。
- いずれの場合も、作られた規則を削除しない限りダイアログは二度と表示されず、通信はブロックされ続けます。
flowchart TB
L["アプリがポートの待ち受けを開始"] --> Q1{"そのアプリに一致する<br/>規則があるか"}
Q1 -- "ある" --> R1["規則に従う<br/>(ダイアログは出ない)"]
Q1 -- "ない" --> Q2{"受信通知は<br/>有効か"}
Q2 -- "無効" --> R2["黙ってブロック<br/>(規則は作られない)"]
Q2 -- "有効" --> DLG["「重要な警告」ダイアログ"]
DLG -- "管理者が「アクセスを許可する」" --> OK["許可規則が作られる"]
DLG -- "管理者が「キャンセル」" --> NG1["ブロック規則が作られる"]
DLG -- "管理者権限のないユーザー<br/>(どの操作でも)" --> NG2["ブロック規則が作られる"]
NG1 --> NEVER["規則を削除するまで<br/>ダイアログは二度と出ない"]
NG2 --> NEVER
つまりこのダイアログは「ユーザーに許可を求める仕組み」に見えて、業務アプリの現場では「一般ユーザーが触った瞬間にブロック規則を焼き付ける仕組み」として働きます。導入担当者が管理者アカウントで初回起動し、ダイアログで許可した場合、作られた許可規則はPC全体に効くので、翌日からの一般ユーザーもひとまず通信できます。それでも事故は残ります ── 導入時の動作確認では踏まなかった待ち受けを一般ユーザーが最初に踏んだとき、適用されるネットワークプロファイルが導入時と違うとき、そしてアップデートでexeパスが変わったとき(4章・5章)です。
Microsoft自身も、管理者以外が使うデバイスについては次のベストプラクティスを明示しています。2
- アプリの初回起動より前に、必要な規則を配置しておく(インストーラーまたは管理側での配布)
- 受信通知を無効化する(通知を切れば、実行時の自動規則作成そのものが行われなくなる)
通知の無効化は Set-NetFirewallProfile -NotifyOnListen False、またはグループポリシーで設定できます。7 「ダイアログが出たら現場の人に許可を押してもらう」は運用手順ではなく、事故の予約です。受信規則はインストール時に登録する ── これが本記事の結論であり、Microsoftの推奨とも一致します。
4. 受信規則の設計 ── プログラム指定・ポート指定・サービス指定
登録する規則の中身を設計します。指定方法は大きく3系統あり、単独で使うか組み合わせるかを判断します。
| 指定方法 | 向いている場合 | 弱点・注意 |
|---|---|---|
プログラム指定(program= / -Program) |
待ち受けポートが動的・複数。デスクトップアプリ本体が待ち受ける構成 | exeのフルパス指定のみでワイルドカード不可2。アップデートでパスが変わると規則が対象を見失う(5.4節) |
ポート指定(localport= / -LocalPort) |
ポートが固定。情シスへの申請・ネットワーク機器側の設定と揃えやすい | 同じポートで待ち受ける別プロセスも通してしまう。ポート番号の管理台帳が必要 |
サービス指定(-Service) |
Windowsサービスとして動く待ち受けプロセス | サービス名(短い名前)で対象を絞る3。exe直接起動の形態には使えない |
| 組み合わせ(プログラム+プロトコル+ポート) | 本番の業務アプリの基本形 | 条件が増えるほど環境変化(パス・ポート変更)に弱くなるため、規則の内容を文書化しておく2 |
そのうえで、範囲の限定を重ねます。Microsoftの設計推奨も「受信規則はできる限り具体的に」です。2
- プロファイルの限定: 社内でしか使わない業務アプリの受信規則はドメイン/プライベートに限定し、パブリックでは有効にしません。ノートPCが社外Wi-Fiにつながった瞬間に待ち受けポートが世界に開く、という事故を防ぎます。
- リモートIPの限定: 接続元が決まっているなら
-RemoteAddressをそのサブネットに絞ります。家庭・小規模ネットワーク向けにはLocalSubnetキーワードでの限定が推奨されています。23 - 方向と本数: 待ち受けがTCPだけならTCPの規則1本で十分です。ダイアログが自動で作るようなTCP/UDP両方の規則を惰性で作らないこと。
「必要な相手から、必要なポートへ、必要なプログラムだけ」── 受信規則の設計はこの最小権限の一文に尽きます。
5. インストーラーでの登録実務 ── netshとNew-NetFirewallRule
5.1. 前提: 管理者権限が必要
ファイアウォール規則の追加・削除はコンピューター全体の設定変更なので、管理者権限(昇格したプロセス)で実行する必要があります。8 インストーラーは通常、管理者権限で動いているため、規則登録はインストール処理の中に置くのが合理的です。アプリ本体を管理者で動かす理由にはなりません。この線引きの考え方は「管理者権限はいつ必要か」で詳しく扱っています。
5.2. netsh advfirewall での登録
古典的ですが、どのインストーラーからも呼びやすいのが netsh advfirewall firewall add rule です。8
rem add rule は同名規則があっても追記してしまうため、再インストール・修復・
rem アップデートでの再実行に備えて、同名規則を消してから登録し直す
netsh advfirewall firewall delete rule name="MyCompany OrderServer"
rem プログラム指定+ポート指定+プロファイル限定の受信許可規則
netsh advfirewall firewall add rule name="MyCompany OrderServer" dir=in action=allow program="C:\Program Files\MyCompany\OrderServer\OrderServer.exe" protocol=TCP localport=50051 profile=domain enable=yes
rem アンインストール時: 名前で削除
netsh advfirewall firewall delete rule name="MyCompany OrderServer"
add rule は既存の同名規則を置き換えず同名のまま追加するので、先に delete rule を実行しないと再実行のたびに規則が増殖し、パスや範囲を変えた更新後も古い許可規則が生き残ります(初回実行では先頭の delete rule が「一致する規則がない」旨を返しますが、バッチの実行は続行されるため、この並びで問題ありません。インストーラーの成否判定を終了コードで行う場合は、末尾の add rule の結果を見るようにしてください)。remoteip=157.60.0.1,172.16.0.0/16,LocalSubnet のように接続元も絞れます。8 削除は名前で一致した規則をまとめて消すので、規則名は自社プレフィックス付きで一意にするのが安全です。
5.3. PowerShell (New-NetFirewallRule) での登録
より細かく制御するなら NetSecurity モジュールです。-DisplayName は必須、-Profile はコンマ区切り(スペースなし)で複数指定できます。3
# 登録(インストーラーから昇格状態で実行)。-Name は一意な識別子のため、
# 再インストール・修復・アップデートでの再実行では同名規則の作成が
# エラーになる。既存の同名規則を消してから作り直す形で冪等にする
Remove-NetFirewallRule -Name "MyCompany-OrderServer-In" -ErrorAction SilentlyContinue
New-NetFirewallRule -Name "MyCompany-OrderServer-In" `
-DisplayName "MyCompany OrderServer (TCP 50051 受信)" `
-Direction Inbound -Action Allow `
-Program "C:\Program Files\MyCompany\OrderServer\OrderServer.exe" `
-Protocol TCP -LocalPort 50051 `
-Profile Domain,Private -RemoteAddress LocalSubnet
# アンインストール時: 存在しなくてもエラーにしない
Remove-NetFirewallRule -Name "MyCompany-OrderServer-In" -ErrorAction SilentlyContinue
ここで -Name を明示しているのには理由があります。-Name は規則の一意な識別子で、省略するとランダム値が割り当てられます。表示名(-DisplayName)はロケール依存で変わりうるため、スクリプトから規則を特定する鍵には -Name を使うのがMicrosoftの案内です。3 アンインストーラーが確実に自分の規則だけを消すためにも、-Name の固定は必須と考えてください。
5.4. アップデートでexeパスが変わる場合
プログラム指定の規則はフルパスで対象を固定します。つまり、アップデートでインストール先やexe名が変わると、規則は残っているのに対象を見失い、待ち受けが再びブロックされます。このとき、新しいパスのexeは「規則のないアプリ」として扱われるため、通知が有効な環境では3章のダイアログがもう一度現れ、一般ユーザーが操作すればブロック規則が焼き付きます。3章の推奨どおり通知を無効化している環境では、ダイアログすら出ずに黙って失敗します。バージョン番号入りのフォルダーに配置する方式や、自己更新で配置先が動く方式では特に起きやすい事故です。
flowchart TB
V1["v1.0を導入<br/>規則はv1.0フォルダーのexeを指す"] --> UP["アップデートでv1.1フォルダーに配置<br/>実行されるexeのパスが変わる"]
UP --> MISS["旧パスの規則は対象を見失う<br/>(規則は残っているのに効かない)"]
MISS --> Q{"受信通知は<br/>有効か"}
Q -- "有効" --> DLG["ダイアログが再表示<br/>一般ユーザーが触ればブロック規則"]
Q -- "無効" --> SILENT["ダイアログも出ずに<br/>黙ってブロック"]
MISS -.->|"対策"| FIX["パスを更新をまたいで固定する<br/>または更新処理で旧規則を削除して再登録"]
対策はシンプルで、次のいずれかです。
- インストール先を固定し、exeのフルパスが更新をまたいで変わらない配置にする
- パスが変わる更新では、アップデーターが旧規則を削除して新パスで再登録する(5.2/5.3のコマンドを更新処理でも実行する)
MSIであれば、規則の登録はファイル配置後に実行されるカスタムアクション(アンインストール時は削除側のカスタムアクション)として組み込むのが定石です。WiXなどのツールセットにはファイアウォール規則を宣言的に記述する拡張もあります。どの配布方式を選ぶかで実装位置が変わるため、「Windowsアプリの配布方式の選び方」も参照してください。なお、客先展開時のもう1つの定番トラブルであるウイルス対策の誤検知は「Microsoft Defenderの誤検知対応」で扱っています。
6. トラブルシューティング ── 「通信できない」の切り分けフロー
問い合わせを受けたときの手順を、順番に固定しておきます。全体の流れは次のとおりです。
flowchart TB
S["「クライアントから通信できない」"] --> N["サーバー側: netstat -ano"]
N -- "待ち受けていない" --> APP["ファイアウォール以前の問題<br/>アプリ・サービス側を調査"]
N -- "LISTENINGしている" --> T["クライアント側: Test-NetConnection"]
T -- "TcpTestSucceeded=True" --> OTHER["到達性は正常<br/>アプリ層(認証・プロトコル)を調査"]
T -- "False" --> P["サーバー側: Get-NetConnectionProfile<br/>適用中プロファイルを確認"]
P -- "規則の対象と不一致" --> FIXP["規則のプロファイル指定を見直す"]
P -- "一致している" --> R["Get-NetFirewallRule -PolicyStore ActiveStore<br/>許可規則の有無・ブロック規則の混入を確認"]
R --> LOGCHK["pfirewall.logで破棄(DROP)を実測"]
| 手順 | コマンド/操作 | 確認すること |
|---|---|---|
| 1. 待ち受けの確認(サーバー側) | netstat -ano |
対象ポートが LISTENING か。そもそも待ち受けていなければファイアウォール以前の問題 |
| 2. 到達性の確認(クライアント側) | Test-NetConnection -ComputerName sv01 -Port 50051 |
TcpTestSucceeded が True か4 |
| 3. プロファイルの確認(サーバー側) | Get-NetConnectionProfile |
適用中のプロファイルが、規則を有効化したプロファイルと一致するか1 |
| 4. 有効な規則の確認(サーバー側) | Get-NetFirewallRule -PolicyStore ActiveStore |
GPO由来も含む「実際に効いている」規則の中に、目的の許可規則があるか。ダイアログ由来のブロック規則が紛れていないか5 |
| 5. ログでの確認(サーバー側) | pfirewall.log | 対象ポート宛のパケットが破棄(DROP)されているか6 |
手順4の補足です。ポートやプログラムの条件は規則本体ではなくフィルターオブジェクト側にあるため、ポートから規則を逆引きするにはフィルター経由でクエリします。57
# ポート50051に関係する規則を逆引き
Get-NetFirewallPortFilter | Where-Object { $_.LocalPort -eq 50051 } | Get-NetFirewallRule
# 規則の出所(ローカルかGPOか)を追跡
Get-NetFirewallRule -PolicyStore ActiveStore -TracePolicyStore |
Select-Object Name, DisplayName, PolicyStoreSourceType, PolicyStoreSource
手順5のファイアウォールログ(pfirewall.log)は、既定では何も記録されません。既定のパスは %windir%\system32\logfiles\firewall\pfirewall.log、既定の最大サイズは4,096KBで、「破棄されたパケットをログに記録する」「成功した接続をログに記録する」のどちらかを有効にして初めて書き込まれます。6 単体マシンなら次で有効化できます。6
netsh advfirewall set allprofiles logging droppedconnections enable
netsh advfirewall set allprofiles logging allowedconnections enable
ログはテキストファイルで、破棄(DROP)か許可(ALLOW)か、プロトコル、送信元/宛先のIPとポートが1行ずつ記録されるため、「クライアントからのSYNが届いて破棄されているのか、そもそも届いていないのか」をここで確定できます。なお、ポリシーでログを構成した環境ではログフォルダーへの書き込み権限(サービス mpssvc のFullControl)が不足してファイルが作られないことがあり、その場合はフォルダーの作成とACLの付与が必要です。6
さらに深掘りするなら、監査ポリシー「フィルタリングプラットフォームのパケットの破棄」を有効にすると、破棄のたびにセキュリティイベント5152が記録されます。ただしイベント量が非常に多いため、Microsoftは接続単位で記録されるイベント5157(フィルタリングプラットフォームの接続)の利用を勧めています。常用ではなく、切り分けの間だけ有効にする道具です。9
最後に、やってはいけない切り分けを明確にしておきます。ファイアウォールサービス(MpsSvc)の停止による丸ごと無効化はサポート対象外で、スタートメニューの不動作やストアアプリの更新失敗などOS側の問題を引き起こします。どうしても無効化して確かめたいときは、サービスは動かしたまま Set-NetFirewallProfile -Profile Domain,Public,Private -Enabled False でプロファイルを無効化し、確認後すぐ戻します。17 そして原因がファイアウォールだと確定したら、対処は無効化の恒久化ではなく正しい規則を1本足すことです。
7. 組織管理下での注意 ── ローカル規則が効かない環境と申請の作法
インストーラーで規則を登録しても、それが効かない環境があります。GPOやIntune(CSP)でファイアウォールを集中管理している組織では、プロファイルごとに「ローカル規則のマージ」(AllowLocalPolicyMerge)を無効化できます。この設定が無効だと、ローカルの管理者(インストーラーを含む)が作成した規則は適用されず、受信接続が必要なアプリの規則はGPO/CSPからの集中配布が必須になります。2
flowchart TB
GPOR["GPO/Intuneで配布された規則"] --> EFF["実際に効く規則の集合<br/>(ActiveStore)"]
LOCAL["ローカルで作成した規則<br/>(インストーラーの登録を含む)"] --> Q{"ローカル規則のマージ<br/>(AllowLocalPolicyMerge)"}
Q -- "有効(既定)" --> EFF
Q -- "無効" --> DROP["規則は存在するが適用されない<br/>→ GPO/CSPでの集中配布に切り替える"]
開発側・導入側としての現実的な備えは次のとおりです。
- インストーラーの規則登録は「失敗しない」設計にする(登録自体は成功するため、エラーでは検知できません。導入後の疎通確認を手順に含めます)
- 6章の手順4(
-TracePolicyStore)で、効いている規則の出所がローカルかGPOかを確認する5 - ローカル規則が効かない環境だと分かったら、情シス部門への規則配布の申請に切り替える
申請には次の情報を一式で渡します。ファイアウォール規則は方向・プログラム・ポート・範囲が揃って初めて作れるので、これがそのまま「業務アプリのネットワーク仕様書」になります。
| 項目 | 記入例 |
|---|---|
| 規則名(識別子) | MyCompany-OrderServer-In |
| 方向 | 受信 |
| プログラムパス | C:\Program Files\MyCompany\OrderServer\OrderServer.exe |
| プロトコル/ポート | TCP 50051 |
| リモートIP範囲 | 172.16.10.0/24(受注クライアント配置セグメント) |
| プロファイル | ドメインのみ |
| 用途・根拠 | 受注入力クライアントからの接続受け付け(業務システム名) |
| 廃止条件 | 本システム撤去時に削除 |
情シス側から見ても、この表がある申請とない申請では作業量がまったく違います。逆に、ポート番号だけの「開けてください」は、4章で見たとおり過剰許可になりがちです。なお、ドメイン環境のファイル共有・認証まわりの通信要件はファイアウォールとは別の締め付け(署名の必須化など)でも変わってきています。あわせて「SMB署名とLDAPチャネルバインディング」も参照してください。
8. まとめ
- Windowsファイアウォールの既定は受信ブロック・送信許可です。受信規則が必要なのは待ち受けるサーバー型アプリだけで、クライアントとして接続するだけなら原則不要です。
- 規則はプロファイル(ドメイン/プライベート/パブリック)単位で適用されます。「規則はあるのに通らない」の第一容疑者はプロファイルの不一致です。
- 「重要な警告」ダイアログは、キャンセルや権限のないユーザーの操作でブロック規則を作り、以後は再表示されません。本番運用をこのダイアログに任せてはいけません。
- 業務アプリの受信規則はインストーラーで登録する ── これが唯一の原則です。登録は管理者権限で、削除まで含めて
-Nameを固定して実装します。 - 規則はプログラム+プロトコル+ポートを軸に、プロファイルとリモートIPで絞ります。アップデートでexeパスが変わる場合は規則の再登録を忘れないでください。
- 切り分けは netstat → Test-NetConnection → プロファイル確認 → Get-NetFirewallRule(ActiveStore) → pfirewall.log の順で機械的に。サービス停止による無効化はサポート対象外です。
- GPO/Intune管理下ではローカル規則のマージが無効化されている場合があります。そのときは規則名・方向・プログラム・ポート・リモートIP・プロファイルを揃えて情シスに配布を申請します。
関連記事
- Windowsのプロセス間通信をどう選ぶか ── 名前付きパイプ / TCP / gRPC / 共有メモリ / COM 判断表
- Windowsアプリ配布方式の選び方 - MSI/MSIX/ClickOnce/xcopy/独自更新
- Windows の管理者特権が必要になるのはいつなのか - UAC、保護領域、設計上の見分け方
- 自社開発のWindowsアプリがウイルス扱いされたら ── Microsoft Defenderの誤検知対応と、性能影響との付き合い方
- SMB署名とLDAPチャネルバインディング ── NTLM対策の「残り半分」を実務で締める
- Windowsサービスの作り方と運用 ── タスクスケジューラとの使い分けからBackgroundServiceのサービス化まで
関連する相談領域
合同会社小村ソフトでは、サーバー型業務アプリのインストーラー設計(ファイアウォール規則の登録・削除を含む)、客先環境での「通信できない」の原因調査、GPO管理下での展開を見据えたネットワーク要件の整理を扱っています。「開発機では動くのに客先で動かない」の切り分けからで構いません。
参考リンク
-
Microsoft Learn, Windows Firewall overview. Windowsファイアウォールが全エディションで既定で有効なホスト型ファイアウォールであること、既定動作が「受信は要求への応答か規則一致以外ブロック、送信は規則一致以外許可」であること、3つのプロファイル(ドメイン=ドメインコントローラー検出時に自動適用で手動設定不可、プライベート=管理者が手動設定、パブリック=未識別ネットワークの既定)、Get-NetConnectionProfile / Set-NetConnectionProfile によるネットワークカテゴリの確認・変更、ファイアウォールサービス(MpsSvc)停止による無効化がサポート対象外でスタートメニューの停止やストアアプリの更新失敗等を引き起こすこと、正しい無効化はサービスを動かしたままプロファイルを無効にする方法であることについて。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9
-
Microsoft Learn, Windows Firewall rules. 規則の優先順位(明示的許可は既定ブロックに優先、明示的ブロックは許可に優先、より具体的な規則が優先、重み付け順序はない)、アプリの待ち受け開始時に規則がなければダイアログが表示されること、管理者ユーザーが「いいえ」またはキャンセルを選ぶとブロック規則(通常TCP/UDPの2本)が作られること、ローカル管理者でないユーザーでは選択肢にかかわらずブロック規則が作られること、作られた規則を削除するまでダイアログが再表示されず通信がブロックされ続けること、アプリまたはインストーラー自身が規則を追加するのが一般的であること、初回起動前の規則配置と受信通知の無効化が推奨されること、プログラム規則でワイルドカード(C:*\teams.exe等)が使えずフルパス指定のみであること、ローカル規則のマージ(AllowLocalPolicyMerge)をプロファイル単位で無効化でき、無効時は受信接続が必要なアプリの規則の集中配布が必須になること、受信規則をできる限り具体的にし家庭・小規模ネットワーク向けにはリモートアドレスをLocalSubnetに限定する推奨、送信既定ブロックは高セキュリティ環境の選択肢だが受信既定を許可へ変えてはならないことについて。 ↩ ↩2 ↩3 ↩4 ↩5 ↩6 ↩7 ↩8 ↩9 ↩10 ↩11 ↩12 ↩13
-
Microsoft Learn, New-NetFirewallRule (NetSecurity). -DisplayName が規則作成時に必須であること、-Name が一意な識別子で既定はランダム値でありスクリプトでは -Name の使用が案内されていること、-Direction (Inbound/Outbound)・-Action (Allow/Block)・-Program (フルパス)・-Protocol (TCP/UDP/ICMPv4/ICMPv6/番号)・-LocalPort・-RemoteAddress (IP/サブネット/範囲/LocalSubnet等のキーワード)・-Service・-Profile (Any/Domain/Private/Public をコンマ区切り・スペースなしで複数指定)の各パラメーターの仕様と、プログラム指定+プロトコル+ポートを組み合わせた規則作成例について。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Test-NetConnection (NetTCPIP). Test-NetConnection が ping・TCP接続・経路の診断情報を表示するコマンドレットであり、-ComputerName と -Port で指定ポートへのTCP接続を試験し、結果が TcpTestSucceeded として返ることについて。 ↩ ↩2
-
Microsoft Learn, Get-NetFirewallRule (NetSecurity). -PolicyStore ActiveStore で適用中のすべてのポリシーストア(GPO由来を含む結果のポリシーセット)の規則を取得できること、ポートやアドレス等の条件が規則本体ではなくフィルターオブジェクト側にあり Get-NetFirewallPortFilter / Get-NetFirewallApplicationFilter 経由でクエリすること、-TracePolicyStore で規則の出所(PolicyStoreSource / PolicyStoreSourceType のLocal/GroupPolicy)を確認できることについて。 ↩ ↩2 ↩3 ↩4
-
Microsoft Learn, Configure Windows Firewall logging. ログの既定パスが %windir%\system32\logfiles\firewall\pfirewall.log であること、既定の最大サイズが4,096KBで上限到達時は古いエントリから削除されること、「破棄されたパケット」「成功した接続」のいずれかを有効にするまでログが記録されないこと、netsh advfirewall set allprofiles logging droppedconnections/allowedconnections enable による有効化、ログフォルダーにサービス mpssvc のFullControl権限がないとログファイルが作成されない場合があり手動でのフォルダー作成とACL付与が必要になることについて。 ↩ ↩2 ↩3 ↩4 ↩5
-
Microsoft Learn, Manage Windows Firewall with the command line. Set-NetFirewallProfile による既定動作・通知(-NotifyOnListen False)・ログ設定の構成、New-NetFirewallRule によるプログラム規則作成例と Remove-NetFirewallRule / netsh advfirewall firewall delete rule による削除例、-ErrorAction SilentlyContinue で規則が存在しない場合のエラーを抑制するパターン、Get-NetFirewallPortFilter からポート条件で規則を逆引きするクエリ例、Set-NetFirewallProfile -Enabled False によるプロファイル無効化が正しい無効化手段であることについて。 ↩ ↩2 ↩3
-
Microsoft Learn, Use netsh advfirewall firewall context to control Windows Firewall behavior (KB947709). netsh advfirewall firewall add rule の構文(name= / dir=in / action=allow / program= / enable=yes / remoteip= / profile= / protocol= / localport=)によるプログラム規則・ポート規則の追加例、delete rule による削除例、管理者グループのメンバーがUAC有効環境で実行する場合は昇格したコマンドプロンプトから実行する必要があること、netsh advfirewall set currentprofile logging によるログ設定について。 ↩ ↩2 ↩3
-
Microsoft Learn, Audit Filtering Platform Packet Drop. 監査サブカテゴリ「フィルタリングプラットフォームのパケットの破棄」を有効にすると Windows フィルタリングプラットフォームがパケットを破棄した際にイベント5152(および5153)が記録されること、このサブカテゴリのイベント量が非常に多く、ブロックされた接続の監視にはパケット単位ではなく接続単位で記録されるイベント5157の利用が推奨されることについて。 ↩
関連する記事
同じタグを共有する最新の記事です。さらに近い話題で知識を深められます。
Windows証明書ストア実務ガイド ── ユーザーとコンピューター、どちらに入れるか
クライアント証明書はユーザーとコンピューターのどちらのストアに入れるべきか。certmgr.mscとcertlm.mscの違い、秘密キーの権限付与、PowerShellでの期限棚卸しまで、証明書の定番事故を体系的に潰す実務ガイドです。
SMB署名とLDAPチャネルバインディング ── NTLM対策の「残り半分」を実務で締める
NTLMを止めるまでの間、リレー攻撃の被害を抑える防御がSMB署名とLDAP署名・チャネルバインディングです。OSごとの既定値、監査イベントの読み方、強制へ進める手順、業務アプリと機器の直し方までを実務目線で整理します。
NTLM廃止で業務アプリは止まるか ── 監査ログの取り方と、依存を潰す順番
NTLM廃止に向けて、自社のWindows環境と業務アプリがどこでNTLMに依存しているかを洗い出す手順をまとめます。監査ポリシー、NTLM/Operationalログのイベント8001〜8004の追い方、NTLMに落ちる典型パターンと直し方、SMBのNTLMブロックまでを...
PowerShellのセキュリティ強化 ── ログ・AMSI・言語モード・JEA
PowerShellを禁止せずに安全に使うための実務をまとめます。スクリプトブロックログとトランスクリプションの有効化、AMSIと古いバージョンの無効化、言語モードによる制限、JEAによる権限委任までを解説します。
BitLocker実務ガイド ── 回復キーの管理から始めるドライブ暗号化
Windows 11 24H2以降、クリーンインストールではデバイスの暗号化が既定で有効になり「気づいたら暗号化されていた」事故が現実に起きています。回復キーの保存先判断表を軸に、仕組み・組織での運用・事故対応・廃棄まで整理します。
関連トピック
このテーマと近いトピックページです。記事を起点に、関連するサービスや他の記事へ進めます。
Windows技術トピック
Windows 開発、不具合調査、既存資産活用の技術トピックをまとめた入口です。
不具合調査 / 長期稼働テーマ
再現しにくい不具合、通信停止、長期稼働障害、失敗パス検証を整理するトピックです。
このテーマがつながるサービス
この記事は次のサービスページにつながります。近い入口からご覧ください。
Windowsアプリ開発
業務アプリ、装置連携、通信ツールなどの Windows ソフト開発を支援します。
よくある質問
この記事のテーマについて、相談時によくある質問をまとめています。
- クライアントとしてサーバーに接続するだけのアプリにもファイアウォール規則は必要ですか?
- 原則不要です。Windowsファイアウォールの既定は「受信はブロック、送信は許可」なので、自分から接続しに行くだけのクライアントアプリは既定のままで通信できます。受信規則が必要になるのは、ポートを開いて接続を待ち受ける側、つまりサーバー型のアプリだけです。ただし例外が2つあります。高セキュリティ環境では送信も既定ブロックに変更されていることがあり、その場合は送信規則の申請が必要です。また、クライアントアプリでも結果通知の受け口として自分でポートを待ち受ける設計になっていれば、その部分には受信規則が要ります。
- 「Windowsセキュリティの重要な警告」ダイアログで「アクセスを許可する」を押せば済むのではないですか?
- その場では済んでも、本番運用は任せられません。このダイアログは、管理者権限のあるユーザーがキャンセルするとブロック規則が作られます。さらに、管理者権限のないユーザーの場合は、どのボタンを押してもブロック規則が作られます。一度作られた規則を削除しない限りダイアログは二度と表示されず、通信は失敗し続けます。現場のPCを操作するのが一般ユーザーである業務アプリでは、「誰かが一度キャンセルしたら以後ずっと通信できない」状態が簡単に発生します。Microsoftも、アプリの初回起動前に規則を配置しておくことを推奨しています。
- 受信規則はポート指定とプログラム指定のどちらで作るべきですか?
- 単独ではなく組み合わせるのが基本です。プログラム指定はexeのフルパスで対象を絞れる一方、アップデートでパスが変わると規則が対象を見失います(ワイルドカードは使えません)。ポート指定は情シスへの申請が明確になる一方、同じポートで待ち受ける別プロセスまで通してしまいます。本番の業務アプリでは「プログラム+プロトコル+ポート」を軸に、プロファイルをドメイン/プライベートに限定し、リモートIPをクライアントの居るサブネットに絞る、が最小権限の型です。ポートが動的な場合だけプログラム指定単独を使います。
- インストーラーが登録した規則が、客先のPCでは効いていないようです。なぜですか?
- 客先のファイアウォールがGPOやIntuneで集中管理されていて、「ローカル規則のマージ」(AllowLocalPolicyMerge)が無効化されている可能性が高いです。この設定が無効だと、ローカルに作成した規則はプロファイル上は存在していても適用されず、規則はGPO/CSP側で集中配布するしかありません。Get-NetFirewallRule -PolicyStore ActiveStore で有効な規則の全体を確認し、情シス部門に規則の配布を申請してください。申請には規則名・方向・プログラムパス・プロトコルとポート・リモートIP範囲・プロファイルを揃えて渡すと一度で通ります。
- 通信の切り分けのためにファイアウォールを一時的に無効化してもよいですか?
- サービス(MpsSvc)の停止による無効化は絶対に避けてください。Microsoftのサポート対象外の操作で、スタートメニューが動かなくなる、ストアアプリの更新が失敗するなどOS側の問題を引き起こします。どうしても切り分けで無効化したい場合は、サービスは動かしたまま Set-NetFirewallProfile -Enabled False でプロファイルを無効にするのが正しい方法です。ただしこれも「原因がファイアウォールかどうか」を数分で確かめる用途に限定し、確認が済んだら直ちに戻します。無効化したままの運用は、規則を1本足せば済む問題をPC全体の無防備と引き換えにする行為です。