弊社商品のサポートを行うにあたって検証用に仮想環境を利用していますが、次のような確認をしたいケースがあります。
- ネットワーク分離環境で、特定通信だけ通した場合にアプリケーションが正常に動作するのか
ネットワーク分離(論理分離)を行う場合、一般的にはファイアウォール(FW)を2つのネットワークの間に入れて通信を制御しますが、検証用の仮想環境でFWを入れられないケースも多々あります。
今回紹介するのは、そんなときにWindows Serverの機能だけで模擬的なFWを作成する方法です。
別ネットワークにあるpc1から、sv1に用意したWebサーバーに対して、今回作成する模擬FWを通して、http:80 https:443 でそれぞれアクセスできるかどうかを試すというシナリオで記載します。
事前準備
登場マシン
gw
今回主題となる、模擬FWにするWindows Server
IPアドレス:(NIC1)192.168.1.254/24 ・ (NIC2):192.168.2.254/24
OS:Windows Server 2022 Standard
sv1
アクセス先Webサーバー
IPアドレス:192.168.1.1/24
IIS 有効化 SSLサーバー証明書(証明書A)用意 http(80) https(443) バインド
OS:Windows Server 2022 Standard
pc1
アクセス元端末
IPアドレス:192.168.2.11/24
証明書Aに対するルート証明書を信頼されたルート証明機関に登録(httpsアクセスのための準備)
OS:Windows 11 Pro
※Windows Firewall対策として、すべてのネットワークをプライベートネットワークに設定しておきます。
仮想マシンと仮想スイッチ割り当て
- gw はvswitch1とvswitch2両方に接続
- sv1はvswitch1へ接続
- pc1はvswitch2へ接続
NW構成
上記を簡単に図にまとめると下記になります。
この時点での疎通確認
- sv1 → gw ping通る
- pc1 → gw ping通る
- pc1 → sv1 ネットワークが違うので当然ながらタイムアウト
模擬 FW の作成
gwでサーバーマネージャーから「ルーティングとリモートアクセス」の機能を有効化
※スクリーンショットは要所のみ掲載します。
- サーバーマネージャーの「役割と機能の追加」から、「リモートアクセス」にチェックして次へ
- 「ルーティング」にチェック
- 「機能の追加」クリック
- あとは次へ次へと進んで「閉じる」
ルーティングとリモートアクセスの設定
- スタートメニュー→「Windows 管理ツール」から「ルーティングとリモートアクセス」起動
- サーバー名を右クリック→「ルーティングとリモートアクセスの構成と有効化」を選択
- 次へ
- 「カスタム構成」を選択して次へ
- 「LANルーティング」を選択して次へ
- 完了→サービスの開始
この時点で疎通確認
- pc1 → sv1 の疎通ができるように
トレースからもgwを経由して通信していることを確認
- ブラウザからの http / https アクセスも成功します。
(http)
(https)
ネットワークを分離
このままだとすべての通信が通るので、特定通信(https)のみを通すように設定します。
- ルーティングとリモートアクセスの設定画面で左ペインを展開し、「IPv4」→「全般」→「イーサネット 2」(pc1 が接続されている側のインタフェース)をダブルクリック
- 入出力に対してフィルタが利用できますが、ここでは入力フィルタを使って制御
- 「新規」をクリック
- 「イーサネット 2」への入力は、HTTPS要求(pc1(ANY)→sv1(443)の通信)なので、宛先がTCP 443(https)の通信を許可
※発信元・宛先のIPアドレスを限定することもできますが、今回はIPアドレスはANYで設定しています
- 宛先TCP 443以外はすべて破棄にして、OKをクリック
- インターフェースごとに設定が必要なので「イーサネット」(sv1が接続されている側のインタフェース)をダブルクリック
※「イーサネット」側は通信を制限しないままでも今回の検証はできますが、他にも許可する通信を追加するケースも想定し設定します。
※一般的なFWは行きの通信の設定を行えば暗黙的に戻りの通信も許可されるものもありますが、本機能を利用する場合は行きと戻り両方考慮した設定を行う必要があります。
- 「入力フィルター」をクリック
- 「イーサネット」への入力は、HTTPS応答(sv1(443)→pc1(ANY)の通信)なので、発信元がTCP 443(https)の通信をコンピュータ特定せず許可
- 発信元TCP 443以外はすべて破棄にして、OKをクリック
疎通確認
- https は変わらず開ける
- http でアクセスするとタイムアウト
特定通信として https だけ通すネットワーク分離環境が出来上がりました。
通信制御をテキストで処理する方法
毎回設定ツールを立ち上げて、UI上から1件1件許可設定を打ち込むのが面倒、という場合はテキストファイルから設定を取り込むこともできます。
現状の設定のエクスポート
下記のコマンドを実行
> netsh routing ip dump > 出力先ファイルパス
このように出力されます。
出力したファイルの編集
- 通信許可の設定だけを目的とする場合、「DNSプロキシ構成」以降は不要なので削除します
- 日本語環境で出力すると、「filtertype=入力」や「action=切断」と日本語交じりで出力されますがこの日本語部分が取り込む際にエラーになるので、一括置換で英語に直します。
- 行をコピーして、追加したい設定を増やします
ここでは「イーサネット 2」にTCP 80(http)の許可設定を追加しています。
※記述順に意味があるので、設定を増やす場合は既存行の隣に追加するのが安全です。
設定の反映
- 次のコマンドでファイルから設定を取り込みます。
いくつかエラーが表示されますが無視しても特に動作に問題はないようです。
> netsh -f 入力ファイルパス
設定ツール上で確認
- TCP 80 の設定が追加されています。
※必要に応じて「イーサネット」側も設定を追加してください。
以上です。