pingを使うと、相手のコンピュータが稼働しているかどうかを確認できる。ただWindows OSはデフォルトではpingに応答しないため、pingを使って稼働しているかどうかの確認ができない。そこでWindows Defenderファイアウォールの設定を変更することで、これを許可する方法を紹介する。
対象OS:Windows 10/Windows 11、Windows Server 2019/2022/2025
TIPS「Windowsのpingコマンドでネットワークトラブルの原因を調査する」では、Windows OSに付属する「ping」コマンドの基本的な使い方について説明している。その中では、「pingを実行すると対象PCからpingの応答が返ってくるので、それを使って相手のPCが稼働しているかどうかを確認できる」と紹介した。システムの死活監視においては、pingは一番基本的なコマンドである。
pingは、ネットワークプロトコルでいうと、TCP/IPの補助プロトコルである「ICMP(Internet Control Message Protocol)」の「エコー要求/エコー応答」メッセージを使って相手と通信している。しかし現在のWindows OSでは、セキュリティなどの理由のため、デフォルトではこのパケットの受信を許可していない。pingでPCの存在が判明すると、次は脆弱(ぜいじゃく)性を狙う攻撃につながるなど、好ましくない使われ方がされる危険性があるためだ。
そのため、インストールしたばかりのWindows PCに向けて「ping pc01」のようなコマンドを実行しても応答がないことも多い(Active Directoryドメイン環境などでは、管理者があらかじめ許可していることもあり、その場合は応答がある)。しかし社内や家庭内など、限定された環境ならば管理のために、必要最小限の範囲でpingを許可しても問題ないだろう。
本Tech TIPSでは、Windows 10/11などを対象として、pingに応答するようにWindowsファイアウォールの設定を変更する方法を紹介する。GUIだけではなく、コマンドライン(PowerShell)で設定する方法も説明する。グループポリシーでの設定については、ニーズがあれば紹介したい。
以下のスクリーンショットはWindows 11のもので、他のWindows OSとは若干異なることがある。しかし、特記しない限り、基本的に画面は同じ構成になっている。
pingコマンドに応答させるためには、Windowsファイアウォールの設定を変更して、「ICMPのエコー」プロトコルの受信を許可すればよい。以下、Windows 11でのスクリーンショットを例に、その手順を紹介する(特記しない限り、Windows 10と操作手順は共通)。
まずは「Windowsセキュリティ」アプリを起動する。
[スタート]メニューを開く 2.(Windows 11のみ)ここにある | [すべてのアプリ]ボタンをクリック 3.スクロールして「W」という見出しを見つける 4.[Windowsセキュリティ]をクリック,「Windowsセキュリティ」アプリを起動する | |
---|---|---|
「Windowsセキュリティ」アプリの画面が表示されたら、「プロファイル」と呼ばれるネットワーク接続状況のうち、「アクティブ」(有効)になっているものを確認する。
ちなみに、「windowsdefender://Network」というコマンドラインを実行すると、以下の「ファイアウォールとネットワーク保護」という画面を直接呼び出せる。
実際に適用されるファイアウォールの規則は、プロファイルによって異なる。「パブリック」は公共/公衆ネットワーク環境を想定していて、最も制限が厳しい状態に設定されている。「ドメイン」はActive Directoryドメインに参加している場合に適用されるプロファイルである。
ネットワークインタフェースが複数あるシステムでは、2つ以上のプロファイルがアクティブになっていることがあるので、よく確認しておく。
もしプロファイルが2つしか表示されていなかったり、「アクティブ」が見当たらなかったりする場合は、いずれかのプロファイルをクリックして開き、すぐに左ペインの[ファイアウォールとネットワーク保護]をクリックして、この画面に戻ってみよう。これで3つのプロファイルが表示されるはずである。どうしても表示されない場合は、無視して次のステップへ進んで構わない。
アクティブなプロファイルを確認できたら、[詳細設定]リンクをクリックして、「セキュリティが強化されたWindows Defenderファイアウォール」を開く。その左ペインのツリーにある[受信の規則]をクリックして、受信に対するファイアウォール規則の一覧画面を表示させる。
真ん中のペインの「受信の規則」一覧から、以下の手順でpingを受け付けるための規則を見つける。
デフォルトでは以下のスクリーンショットのように、IPv4向けとIPv6向けの規則がそれぞれ2つずつ、計4つある。いずれも行頭にチェックマークがない無効状態のはずだ。
上述の規則の候補が見つかったら、以下の手順で絞り込んでから有効化する。
規則を右クリックする前に、[Ctrl][Shift]キーを使って複数の規則を選択すると、同時にそれらを有効化できる。
以上の手順を実行すると、同じサブネット内からのICMPのエコー要求の受信が許可され、直ちにpingに応答するようになるはずだ。実際に以下の手順で試してみよう。
ICMPを許可すると、途中からすぐに応答が返ってくるようになるはずだ。
もしpingの応答がない場合は、前述のファイアウォール設定で、使用しているプロファイル名などを再確認すること。
上の例では、「プライベート」と「パブリック」プロファイルに対するpingの応答を許可した。そのため、例えばノートPCを携帯電話回線や屋外の無線LANなどにつないで利用している場合でも、同じサブネット内の未知のノードからのpingに応答することになる可能性がある(実際には、こうしたネットワークでは隣接ノードとの通信を禁止していて、pingが届かないこともよくあるが)。
このような状況を回避し、本当にプライベート(家庭内や社内のローカルLAN)からのpingだけを許可したければ、受信規則に含まれるプロファイルから「パブリック」を除外するか、受信規則を複製して、プライベートプロファイルのみを対象とする規則を作ればよい。
プライベートプロファイルだけに限定する手順は以下の通りだ。
「プライベート」「パブリック」プロファイル向けの「ファイルとプリンターの共有(エコー要求 - ICMPv<4または6> 受信)」の受信規則は、デフォルトでローカルサブネットからの着信のみ受け付けるように設定されている。つまり、この受信規則を有効にしても、そのままでは別のサブネットからルーティングされて届いたpingには応答しない。
セキュリティ上は、このように着信可能なリモートアドレスを必要最小限に留めることが望ましい。広範囲のリモートアドレスに着信許可を無闇に与えると、対象PCの存在が簡単に知られてしまうため、冒頭でも触れたように脆弱性を狙う攻撃を受けやすくなるからだ。
しかし、状況や環境、業務内容などによってはローカルサブネット以外からのpingにも応答するように設定せざるを得ないこともあるだろう。そのような場合は、以下の手順で該当の受信規則の「スコープ」を変更する必要がある。
「リモートIPアドレス」欄で[任意のIPアドレス]ラジオボタンを選択すると、全てのネットワークからの着信が許可される。これは設定が簡単な半面、前述のように脆弱性を狙う攻撃を受けやすくなる。面倒でも、上のスクリーンショットのように着信可能なサブネットを限定した方が無難だ。
「セキュリティが強化されたWindows Defenderファイアウォール」ツールでファイアウォールの設定を変更するのは分かりやすい半面、決まった手順で繰り返す場合は手間が多くて面倒である。複数のPCやサーバで実施するならなおさらだろう。
そのような場合はコマンドラインで設定する方がよい。以下ではPowerShellによる設定手順を紹介する。
ここでは既存のファイアウォール規則の設定を変更して、IPv4(ICMPv4)とIPv6(ICMPv6)の両方でping応答を有効化する。またPowerShellのバージョンは5.1または7以降を前提としている。その他、PowerShellは管理者権限で起動する必要がある。
まずは、pingのプロトコルの1つであるICMPv4エコー要求の受信を許可する既存のファイアウォール規則をリストアップする。
# 1行目のGet-NetFirewallPortFilter: ICMPv4のポートフィルターオブジェクトを取得
# 2行目のWhere-Object:エコー要求だけに絞り込み
# 3行目のGet-NetFirewallRule:関連付けられている規則を取得
# 4行目のWhere-Object:受信だけに絞り込み
# 5行目のSort-Object:表示名とプロファイルで並び替え
# 6行目のFormat-Table:主要なプロパティを一覧表示
Get-NetFirewallPortFilter -Protocol ICMPv4 | `
Where-Object { $_.IcmpType -eq 8 } | `
Get-NetFirewallRule | `
Where-Object { $_.Direction -eq 'Inbound' } | `
Sort-Object -Property DisplayName,Profile | `
Format-Table -Property Name,DisplayName,Profile,Enabled
ICMPv6の場合、ICMPv4の場合と比べて、プロトコルを「ICMPv6」、ICMPの種類を表す番号を「128」にそれぞれ変更する。
Get-NetFirewallPortFilter -Protocol ICMPv6 | `
Where-Object { $_.IcmpType -eq 128 } | `
Get-NetFirewallRule | `
Where-Object { $_.Direction -eq 'Inbound' } | `
Sort-Object -Property DisplayName,Profile | `
Format-Table -Property Name,DisplayName,Profile,Enabled
表示された規則一覧から、対象のプロファイルに合致する規則を選んで有効化してみよう。
以下のコマンドラインの<規則名>には、表示された規則一覧の「Name」列に表示されているいずれかの規則名を指定すること(例: 「CoreNet-Diag-ICMP4-EchoRequest-In」「FPS-ICMP6-ERQ-In」)。
Set-NetFirewallRule -Name <規則名> -Enabled true
意図通りに設定できたかどうかを確認するには、Get-NetFirewallRuleコマンドレットで表示されるプロパティ一覧で、「Enabled」プロパティが「True(有効)」なのか「False(無効)」なのかを調べればよい。
Get-NetFirewallRule -Name <規則名>
Publicプロファイルではpingに応答させたくない、すなわちPrivateプロファイルのみ応答させたい場合には、以下のコマンドラインの<コンマで区切ったプロファイル一覧>に「Private」と指定する。
Set-NetFirewallRule -Name <規則名> -Profile <コンマで区切ったプロファイル一覧>
複数のプロファイルを対象とするなら「Private,Public」、全プロファイルを対象とするなら「Any」というように指定すればよい。
設定できたかどうかを確認するには、前述のGet-NetFirewallRuleコマンドレットで「Profile」プロパティを調べればよい。
例えばローカルサブネットと「192.168.1.0/24」のサブネット、「172.16.0.11」の3つに対してpingの応答を許可し、他は禁止したい場合は、以下のコマンドラインの<コンマで区切ったリモートアドレス一覧>に「LocalSubnet,192.168.1.0/24,172.16.0.11」と指定する。
Set-NetFirewallRule -Name <規則名> -RemoteAddress <コンマで区切ったリモートアドレス一覧>
どのリモートアドレスにも制限なく応答させたければ、<コンマで区切ったリモートアドレス一覧>に「Any」を指定する。ただし、前述のように脆弱性を狙う攻撃を受けやすくなるので推奨しない。
「LocalSubnet」を指定した場合、IPv4とIPv6の両方が許可される。どちらか一方のローカルサブネットに限定したい場合は、「LocalSubnet4」「LocalSubnet6」のいずれかを指定すること。
設定したリモートアドレスを確認するには、以下のように「Get-NetFirewallRule」「Get-NetFirewallAddressFilter」コマンドレットを併用する必要がある。
Get-NetFirewallRule -Name <規則名> | Get-NetFirewallAddressFilter
■関連記事(Windows Server Insider)
■更新履歴
【2025/09/09】PowerShellでpingの応答を許可する手順を追記しました。
【2022/03/02】Windows 11に対応しました。
【2017/12/21】初版公開(対象OSはWindows 7/8/8.1/10、Windows Server 2008 R2/2012/2012 R2/2016)
Copyright© Digital Advantage Corp. All Rights Reserved.