Windows ファイアウォールの受信規則を netsh で作ったあと、「特定の接続元 IP だけ許可したい」と思っても、GUI では見つけにくく、コマンドだと追加方法に迷いがちです。本記事では remoteip の指定(範囲・CIDR・複数)と、既存ルールを安全に更新する手順を具体例付きで整理します。
Windows ファイアウォールで Remote IP を絞り込む意味
Windows ファイアウォールの受信規則は「ポートを開ける/閉める」だけではなく、接続元(Remote IP)を限定できます。たとえば FTP・RDP・管理用 Web コンソールなど、外部に公開すると攻撃対象になりやすいサービスは、許可する接続元を絞るだけでリスクが大きく下がります。
特にサーバー運用では、次のような場面で Remote IP 制限が効きます。
- 社内・拠点・VPN の固定グローバル IP からだけ管理を許可したい
- 踏み台サーバー(ジャンプホスト)からのみアクセスさせたい
- 特定の監視サーバーからの疎通(TCP/UDP)だけを許可したい
- 公開は必要だが、国や ISP レベルで広く開けたくない
GUI(Windows Defender ファイアウォールの詳細設定)でも Remote IP は設定できますが、運用が進むと「どのルールが対象か」「同名ルールがあるか」「カスタム扱いで項目が見つけにくい」などで詰まりがちです。そこで netsh advfirewall で確実に指定・更新する方法を押さえておくと、再現性の高い手順として残せます。
最初に押さえる結論:remoteip= で指定し、既存ルールは new remoteip= で更新する
今回の主題は次の 2 点です。
- 新規作成時:remoteip= を付ければ Remote IP(単体/範囲/CIDR/複数)を指定できる
- 既存ルール更新:set rule で new remoteip= を使う(ただし「追加」ではなく「置き換え」)
これだけ覚えておけば、GUI で作った「カスタム」ルールでも、ルール名で特定できる限り同様に更新できます。
netsh でよく使う操作の早見表(作成・確認・変更・バックアップ)
| やりたいこと | コマンド例 | ポイント |
|---|---|---|
| ルールを新規作成 | netsh advfirewall firewall add rule ... remoteip=... | remoteip= で接続元を限定 |
| 既存ルールの Remote IP を更新 | netsh advfirewall firewall set rule name="..." new remoteip=... | 「追加」ではなく置き換え |
| ルール内容を確認 | netsh advfirewall firewall show rule name="..." verbose | 更新前後で必ず確認 |
| 設定をバックアップ | netsh advfirewall export "C:\backup\firewall.wfw" | 変更前に取ると安心 |
| 設定を復元(置き換え) | netsh advfirewall import "C:\backup\firewall.wfw" | 現在の設定が上書きされる |
remoteip= の指定ルール(範囲・CIDR・複数)を整理
remoteip= は「カンマ区切り」で複数指定できます。IP の表記は混在させられるので、単体 IP/範囲/CIDR を必要に応じて組み合わせます。運用で事故が起きやすいので、スペースを入れずに書くのが無難です。
| 指定パターン | 例 | 意味 | 使いどころ |
|---|---|---|---|
| 単体 IP | 203.0.113.10 | その 1 台だけ許可 | 固定 IP の管理端末/踏み台サーバー |
| IP 範囲(開始-終了) | 192.168.1.1-192.168.1.100 | 範囲内を許可 | 社内セグメントの一部だけ許可 |
| CIDR | 172.16.0.0/16 | ネットワーク単位で許可 | 拠点/VPN セグメントをまとめて許可 |
| 複数指定(カンマ区切り) | 192.0.2.10,198.51.100.0/24 | 複数の条件を同時に許可 | 複数拠点・複数踏み台からのアクセス |
| 全許可 | any | Remote IP を限定しない | 一時的な切り分け/制限を外す |
| ローカル サブネット | localsubnet | 同一サブネットからのみ許可 | 閉域ネットワーク内のサーバー公開 |
なお、Remote IP 制限は「受信規則」では 接続元(クライアント側) を意味しますが、「送信規則」では 宛先(サーバーが接続する相手) を意味します。direction(dir)と合わせて理解しておくと混乱しません。
| ルール方向 | remoteip が指すもの | 例(イメージ) |
|---|---|---|
| dir=in(受信) | 接続元(相手の IP) | 「この IP から来た接続だけ許可」 |
| dir=out(送信) | 接続先(相手の IP) | 「この宛先 IP への通信だけ許可」 |
IPv6 を扱うときの注意
IPv6 環境では、クライアントが IPv6 を優先して接続する場合があります。Remote IP 制限を IPv4 だけで設計すると「IPv4 は制限したのに IPv6 側は想定外に通る/通らない」といった現象が起きます。必要に応じて IPv6 のプレフィックス(CIDR)も設計に含めてください。
netsh advfirewall firewall set rule name="FTP1" new remoteip=172.16.0.0/16,2001:db8::/32
新規作成時:remoteip= を付けて Remote IP 制限つきルールを作る
まずは「最初から Remote IP を絞った状態」でルールを作る例です。質問にある FTP の TCP 20 番(受信許可)を例にします。
netsh advfirewall firewall add rule name="FTP1" dir=in action=allow protocol=TCP localport=20 ^
remoteip=192.168.1.1-192.168.1.100,157.60.0.1,172.16.0.0/16
上の例では Remote IP に「範囲」「単体」「CIDR」を混在させています。実務では、次のような追加オプションも併用すると運用しやすくなります。
- profile=(domain/private/public)で適用範囲を明確化する
- description= で「なぜこの IP を許可しているか」を残す
- enable=yes/no で段階的に有効化する
netsh advfirewall firewall add rule name="FTP1" dir=in action=allow protocol=TCP localport=20 ^
remoteip=172.16.0.0/16,192.168.1.1-192.168.1.100 ^
profile=domain,private ^
description="FTP TCP/20: allow only VPN+office ranges" ^
enable=yes
コマンドは管理者権限(管理者として実行)で実施してください。権限が足りないと作成・更新に失敗します。
既存ルールの Remote IP を変更する(GUI の「カスタム」ルールでも可)
既存ルールを更新する場合は、netsh advfirewall firewall set rule を使い、new remoteip= で Remote IP を更新します。
netsh advfirewall firewall set rule name="FTP1" new remoteip=192.168.1.1-192.168.1.100,157.60.0.1,172.16.0.0/16
GUI で作ったルールがプロパティ上「カスタム」と表示されていても、ルール名(表示名)で特定できる限り、同じように更新できます。カスタムとは「条件が複数付いている(標準テンプレートに収まらない)」という意味合いで、netsh で編集できないことを意味しません。
重要:new remoteip= は「追加」ではなく「置き換え」
ここが最重要ポイントです。netsh の set rule で指定する new remoteip= は既存値の追記ではなく、指定した内容で丸ごと置き換えです。つまり「追加したい」場合でも、最終的に許可したい Remote IP の一覧をすべて書き直す必要があります。
具体例:既存の Remote IP に 1 件だけ「増やす」
たとえば現在の Remote IP が 172.16.0.0/16 のみで、ここに 198.51.100.10 を追加したい場合を考えます。やることは「現在値を確認 → 最終一覧に追記 → その一覧で置き換え」です。
まず現在値を確認します。
netsh advfirewall firewall show rule name="FTP1" verbose
Remote IP が 172.16.0.0/16 だった場合、追加後の最終一覧は 172.16.0.0/16,198.51.100.10 です。これをそのまま new remoteip= に渡します。
netsh advfirewall firewall set rule name="FTP1" new remoteip=172.16.0.0/16,198.51.100.10
「増やしたいのに、なぜ全部書くの?」と感じますが、これが netsh の仕様です。置き換え前に控えを残す(あるいは export でバックアップする)運用が欠かせません。
既存ルールの内容を確認する(show rule verbose)
置き換え事故を防ぐために、更新前後で必ず現在値を確認します。次のコマンドでルールの詳細が表示されます。
netsh advfirewall firewall show rule name="FTP1" verbose
出力の中に「RemoteIP」や「リモート IP」といった項目があるので、そこが期待通りかを確認してください。Windows の言語設定により表示項目名が異なる場合があります。
「同名ルール」がある場合の注意
Windows ファイアウォールは同じ表示名(name)を複数作れてしまいます。その状態で set rule を実行すると、同名の複数ルールに一括で適用されることがあります。意図せず別ルールまで書き換えるのは典型的な事故です。
同名が疑わしい場合は、条件を足して対象を絞るか、命名規則を見直して一意にするのが安全です。例えば「方向」「プロトコル」「ポート」を条件に付けて更新します。
netsh advfirewall firewall set rule name="FTP1" dir=in protocol=TCP localport=20 ^
new remoteip=172.16.0.0/16,192.168.1.1-192.168.1.100
ルールをまとめて管理したい場合は、作成時に group= を付け、更新も group 指定で行うと運用が楽になります(例:FTP 関連ルールを同じグループ名で揃える)。
netsh advfirewall firewall add rule name="FTP TCP20" group="MyServer-FTP" dir=in action=allow protocol=TCP localport=20 remoteip=172.16.0.0/16
netsh advfirewall firewall add rule name="FTP TCP21" group="MyServer-FTP" dir=in action=allow protocol=TCP localport=21 remoteip=172.16.0.0/16
netsh advfirewall firewall set rule group="MyServer-FTP" new remoteip=172.16.0.0/16,198.51.100.10
「追加したい」運用を安全に回すための実務テクニック
netsh 単体では差分追加ができないため、運用では「現状を確認 → 追記した最終一覧で置き換え」が基本です。次のチェックリストを守るだけでも事故率が下がります。
- 更新前に export でバックアップ(復旧ルートを確保)
- show rule で Remote IP を控え、最終形を作ってから set rule
- 同名ルールがないか確認し、必要なら dir/protocol/port で絞る
- リモート作業中は、管理系(RDP/WinRM など)のルールを誤って閉じない
バックアップ:エクスポートしておく
ファイアウォール設定はエクスポートできます。変更前に 1 回取っておくと、万が一の復旧が早いです(ただしインポートは現在の設定を置き換えるので取り扱い注意)。
netsh advfirewall export "C:\backup\firewall.wfw"
復元(インポート)する場合:
netsh advfirewall import "C:\backup\firewall.wfw"
「一時的に全許可」に戻して切り分ける
Remote IP 制限のせいで疎通できないか切り分けたい場合は、まず new remoteip=any で制限を外し、通信できるか確認してから段階的に絞る方法が安全です。
netsh advfirewall firewall set rule name="FTP1" new remoteip=any
Remote IP 制限が効かない/期待と違うときに疑うポイント
Remote IP を設定したのに「なぜか通る」「なぜか通らない」場合、設定ミスではなくネットワーク構成が原因のことがあります。
| 症状 | よくある原因 | 対策の方向性 |
|---|---|---|
| 想定外の接続元から通ってしまう | 実際の接続元が NAT/ロードバランサの IP になっている | 手前機器の IP を許可する、もしくは手前で制限する |
| 許可したはずなのに通らない | プロファイル(domain/private/public)が想定と違う | 適用プロファイルを確認し、profile= を明示する |
| 同じポートなのにルールが効いたり効かなかったり | 別ルール(ブロック)が優先、またはプログラム/サービス指定の差 | 該当ポートの関連ルールを棚卸しし、意図を揃える |
| IPv4 は通るのに IPv6 だけ通る/通らない | remoteip に IPv6 を含めていない、またはクライアントが IPv6 優先 | IPv6 の Remote IP も設計する(もしくは IPv6 を無効化/制限) |
特に NAT 配下では「クライアントの実 IP」ではなく「NAT 装置の IP」に見えることがあり、Remote IP 制限が期待通りに動きません。経路上の機器(プロキシ、ロードバランサ、VPN ゲートウェイ)を含めて、サーバーから見える接続元を確認しましょう。
FTP は 20 番だけでは足りないことが多い(アクティブ/パッシブの違い)
質問例では FTP の TCP 20 番を開けていますが、FTP は構成により必要ポートが変わります。20 番だけ許可しても通信できないケースが多いので、実務では「どのモードで使うか」から設計するのが安全です。
| モード | 制御接続 | データ接続 | ファイアウォールで注意する点 |
|---|---|---|---|
| アクティブ | TCP 21(クライアント→サーバー) | TCP 20(サーバー→クライアント) | データ接続の向きが逆転しやすく、NAT と相性が悪い |
| パッシブ(一般的) | TCP 21(クライアント→サーバー) | サーバー側の任意ポート範囲(クライアント→サーバー) | パッシブ用ポート範囲を固定し、その範囲だけ許可する設計が必須 |
パッシブ FTP を採用する場合は、FTP サーバー側で「パッシブに使うポート範囲」を固定し、その範囲をファイアウォールで許可するのが基本です(例:TCP 50000-50100 など)。
FTP を Remote IP 制限つきで設計する例
例として、次の 3 本を「同じ Remote IP 制限」で揃えると整理しやすいです。
- TCP 21(制御)
- TCP 20(アクティブのデータ、使わないなら不要な場合も)
- TCP 50000-50100(パッシブ用に固定したデータ範囲)
rem 制御(21)
netsh advfirewall firewall add rule name="FTP TCP21" group="MyServer-FTP" dir=in action=allow protocol=TCP localport=21 ^
remoteip=172.16.0.0/16,198.51.100.10 profile=domain,private
rem アクティブ用(20)※構成によっては不要
netsh advfirewall firewall add rule name="FTP TCP20" group="MyServer-FTP" dir=in action=allow protocol=TCP localport=20 ^
remoteip=172.16.0.0/16,198.51.100.10 profile=domain,private
rem パッシブ用(固定範囲)
netsh advfirewall firewall add rule name="FTP Passive 50000-50100" group="MyServer-FTP" dir=in action=allow protocol=TCP localport=50000-50100 ^
remoteip=172.16.0.0/16,198.51.100.10 profile=domain,private
FTP は「つながる/つながらない」がポート設計に強く依存するため、Remote IP 制限を入れる前に、まず必要ポートが整理できているかを確認してください。
GUI で作成した「カスタム」ルールを netsh で編集するコツ
GUI で作ると、次のような理由で「カスタム」表示になることがよくあります。
- プログラム指定やサービス指定をしている
- 特定のプロファイル(ドメインのみ等)に限定している
- インターフェイス種別、エッジ トラバーサルなど複数条件がある
この場合でも、Remote IP という「アドレス条件」を更新するだけなら netsh で問題なく反映できます。ポイントは 対象ルールを 1 つに特定することです。
- ルール名(name)を一意にする(おすすめ)
- 一意にできないなら、dir/protocol/port などで絞って set rule
- 複数ルールをまとめるなら group を活用
よくあるエラーと対処(netsh のつまずきポイント)
No rules match the specified criteria.
指定した条件に一致するルールが 1 つもない状態です。多い原因は「ルール名が違う(全角半角、スペース、記号)」か「dir/protocol/localport で絞り込みすぎ」です。まずは show で存在確認をしてから set すると確実です。
netsh advfirewall firewall show rule name="FTP1"
同名ルールが複数あって意図しないものまで変わった
先述の通り、name は一意ではありません。運用では、ルール名に「ポート」「方向」「用途」を含めて一意にするのが安全です。例:
- Allow-FTP-In-TCP21
- Allow-FTP-In-Passive-50000-50100
すでに混在してしまっている場合は、まず GUI か PowerShell で棚卸しし、命名とグループを揃えるところから着手すると、その後の netsh 運用が安定します。
Remote IP を指定したら管理アクセスまで遮断してしまった
リモート作業中に RDP/WinRM/管理 Web を絞り込みすぎると、サーバーに入れなくなることがあります。次のような保険が現実的です。
- 変更前に out-of-band(iLO/iDRAC/コンソール)やクラウドのシリアルコンソールが使えるか確認
- 管理用ルールは「まず any にして疎通確認 → 段階的に絞る」
- 作業時間帯を短くし、ロールバック手順(export/import)を用意
補足:PowerShell で同じことをする場合(将来の運用向け)
netsh は今でも使えますが、Windows のファイアウォール管理は PowerShell(NetSecurity モジュール)の方が扱いやすい場面が増えています。特に「現在の Remote IP を取得して追加して更新する」といった差分処理は PowerShell が得意です。
例:ルールのアドレスフィルターを確認し、RemoteAddress を設定する(基本形)。
Get-NetFirewallRule -DisplayName "FTP1" |
Get-NetFirewallAddressFilter
Get-NetFirewallRule -DisplayName "FTP1" |
Get-NetFirewallAddressFilter |
Set-NetFirewallAddressFilter -RemoteAddress "192.168.1.1-192.168.1.100","172.16.0.0/16"
ただし、環境によっては DisplayName が重複する・複数ヒットするなどの注意点は同じなので、運用上は「命名とグルーピング」を先に整えるのが近道です。
まとめ:Remote IP 追加のつもりで「置き換え」事故を起こさない
- 新規作成は remoteip= で Remote IP を範囲/CIDR/複数指定できる
- 既存ルール更新は set rule の new remoteip= で更新できる(GUI のカスタムでも可)
- new remoteip= は追加ではなく置き換えなので、最終的に許可したい一覧を全部指定する
- 同名ルールの存在、プロファイル差、NAT/IPv6 など実務の落とし穴も合わせて確認する
Remote IP 制限は「開けたポートを最小権限に近づける」効果が高い一方で、置き換え操作の事故が起きやすい設定でもあります。show/export を習慣にし、ルール名・グループ名を整備してから運用すると、netsh でも安全に回せます。

コメント