ノード間の通信プロトコルを制限したい場合はどうしていますか?
Windows ファイアウオールは、サービスをセットアップすると必要ポートが自動的に開くのでこのような用途には向きませんね。
運用環境であれば、ファイアウオール製品を導入するか、L3SW やルーターでパケットフィルタを実装するのがセオリーですが、検証環境でこれらの機材が準備できない場合はどうしましょうか?
そんな時は、ソフトウエアルーターにパケットフィルタを実装します。Linux で実装する例は良くありますが、実は Windows Server の標準機能でも実現できます。
まずは、2 NIC 環境の Windows Server 2016 を準備します
ping に反応するように設定しておいた方が何かと楽なので、ping 反応するようにします。
GUI ではなく、PowerShell で ping に反応するように設定するのならこうします
Get-NetFirewallRule | ? Name -Match "FPS-ICMP.-ERQ-In" | Set-NetFirewallRule -Enabled True |
ルーター機能である RRAS の役割を有効にします。
default のまま
GUI ポチポチが面倒であれば、PowerShell でインストールするのもアリですね。
Add-WindowsFeature Routing -IncludeManagementTools |
ルーターの役割を設定すると、ルーティングが開始されます。
この状態でノード間の疎通確認をしておきましょう。
GUI を使わずに、コマンドラインで RRAS を構成するのであれば以下のようにします。
# RRAS サービスの自動起動設定 Set-Service remoteaccess -StartupType Automatic # RRAS 有効化 netsh ras set conf confstate=Enabled # IPv4 ルーター構成 netsh ras set type ipv4rtrtype=lanonly ipv6rtrtype=none rastype=ipv4 # RRAS サービス再起動 Restart-Service remoteaccess |
2ホップ以上の通信が必要で、Next hop を設定したい場合は、ここで設定できます。
Next hop をコマンドラインで追加するには、毎度お馴染みの route add -p で設定します。(New-NetRoute コマンドレットでも OK)
route add -p 192.168.0.0/24 172.16.0.253 |
パケットフィルタでプロトコル制限をする場合は default 通信遮断にし、許可ポートだけに通信許可を与える穴あけ方式で設定します。
この時注意する点は、パケットの往復を意識して、往路用と復路用それぞれのパケットフィルタ 2 つを 1
セットに通信許可を与えないと通信が成立しない点です。
片方だけの通信許可だと戻りパケットが通過できません。
また、パケットフィルタをどこに仕掛けるかも意識する必要があります。
RRAS の場合は NIC に対してフィルタを設定します。
フィルタを仕掛けた個所から見て RRAS に向かってくる input と、RRAS から出ていく output の方向も意識しておく必要があります。
まずはルールにマッチしないパケットをすべて切断するデフォルト動作を設定します。
RRAS は in/out それぞれに設定が必要なので、両方のデフォルト動作を drop にします。
netsh routing ip set filter name=インターフェース名 filtertype=input
action=drop netsh routing ip set filter name=インターフェース名 filtertype=output action=drop |
「External」と名付けた NIC に設定する場合は、以下のようにします。
netsh routing ip set filter name=External filtertype=input
action=drop netsh routing ip set filter name=External filtertype=output action=drop |
デフォルト動作設定を確認するには以下のようにします
netsh routing ip show filter |
許可ルールは以下のように追加します
in/out セットに書くのをお忘れなく
netsh routing ip filter name=インターフェース名 filtertype=input
srcaddr=IP srcmask=サブネットマスク dstaddr=IP dstmask=サブネットマスク proto=プロトコル
srcport=ポート番号 dstport=ポート番号 netsh routing ip filter name=インターフェース名 filtertype=output srcaddr=IP srcmask=サブネットマスク dstaddr=IP dstmask=サブネットマスク proto=プロトコル srcport=ポート番号 dstport=ポート番号 |
単純にポート番号だけでフィルタするのであれば、IP/サブネットマスクは 0.0.0.0 を指定して無制限にします。
ポート番号 0 は無制限を意味します。
例えば、RDP(tcp/3389)を許可するのであれば以下のようにします
インターフェイス | 方向 | 送信元IP | 送信元サブネット | 宛先IP | 宛先サブネット | プロトコル | 送信元ポート | 宛先ポート |
External | input | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | tcp | 0 | 3389 |
External | output | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | tcp | 3389 | 0 |
netsh routing ip add filter name=External filtertype=input
srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0
proto=tcp srcport=0 dstport=3389 netsh routing ip add filter name=External filtertype=output srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=tcp srcport=3389 dstport=0 |
UDP も戻りパケットがある場合は TCP と同様ですね。
ポート指定は、範囲指定や複数指定は出来なく 1 ポート指定なので、必要数のフィルタを個別に書く必要があります。
ICMP の場合は、ポート番号のかわりにタイプを指定します。
タイプ/コードは ANY を指定すると無制限にります(0 は無制限ではなく 0 を指定した事になるのに注意)
例えば、ping (要求:8/応答:0)を許可する場合は以下のようにします
インターフェイス | 方向 | 送信元IP | 送信元サブネット | 宛先IP | 宛先サブネット | プロトコル | タイプ | コード |
External | input | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | ICMP | 8 | ANY |
External | output | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | 0.0.0.0 | ICMP | 0 | ANY |
netsh routing ip add filter name=External filtertype=input
srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0
proto=ICMP type=8 code=ANY netsh routing ip add filter name=External filtertype=output srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=ICMP type=0 code=ANY |
netsh routing ip show filter とすると、現在いくつのルールが設定されているかが確認できます。
netsh routing ip show filter name=External のように、インターフェース名を指定するとルール詳細が確認できます。
ルールを削除する場合は以下のように delete します。
# RDP 許可ルール削除 netsh routing ip delete filter name=External filtertype=input srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=tcp srcport=0 dstport=3389 netsh routing ip delete filter name=External filtertype=output srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=tcp srcport=3389 dstport=0 # ping 許可ルール削除 netsh routing ip delete filter name=External filtertype=input srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=ICMP type=8 code=ANY netsh routing ip delete filter name=External filtertype=output srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 proto=ICMP type=0 code=ANY |
デフォルト動作を転送に戻す場合は以下のようにします
# デフォルト動作を解放 netsh routing ip set filter name=External filtertype=input action=forward netsh routing ip set filter name=External filtertype=output action=forward |
PowerShell で IPv4 アドレス計算
http://www.vwnet.jp/windows/PowerShell/CalcNetworkAddressv4.htm
Copyright © MURA All rights reserved.