Home > Windows にまつわる e.t.c.

Windows Server を Router にしてパケットフィルターを設定する


ノード間の通信プロトコルを制限したい場合はどうしていますか?

Windows ファイアウオールは、サービスをセットアップすると必要ポートが自動的に開くのでこのような用途には向きませんね。

運用環境であれば、ファイアウオール製品を導入するか、L3SW やルーターでパケットフィルタを実装するのがセオリーですが、検証環境でこれらの機材が準備できない場合はどうしましょうか?

そんな時は、ソフトウエアルーターにパケットフィルタを実装します。Linux で実装する例は良くありますが、実は Windows Server の標準機能でも実現できます。

 

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 のインストール

ルーター機能である 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

 

 

back.gif (1980 バイト)

home.gif (1907 バイト)

Copyright © MURA All rights reserved.