[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [+]

Routing and Remote Access で細かくフィルタリング

Windows2000 や WindowsXP では、GUI でフィルタリングの設定ができます。
具体的には、Windows2000 の場合は TCP/IP 詳細設定の TCP/IP フィルタリングで、 WindowsXP の場合はインターネット接続ファイアウォールで、設定できます。
ただし、各インターフェースに対して、ポート単位でしかフィルタリングを行うことしかできません。 例えば、"ローカル エリア接続" に対して、 特定のマシンからのみアクセスできるように設定したくても、できません。

しかし、Routing and Remote Access サービスを用いれば、 わりときめ細かいフィルタリングを行うことができます。


目標と手順

ネットワークインターフェースは1つだけあり、 172.16.1.1 というIPアドレスが設定されているとします。
そして、このインターフェースから入ってくるパケットに対して、 以下のようにフィルタリングを行うことを目標とします。

手順は、以下のように行います。

それぞれについて、以下に説明します。


サービスの起動

デフォルトでは、Routing and Remote Access は無効になっています。
管理ツールのサービスを起動して、これを自動起動に設定します。


既定の操作の設定

netsh コマンドを使用して、既定の操作を設定します。
既定の操作とは、後述する詳細設定に該当しないパケットの操作のことです。

デフォルトでは、すべてのインターフェースが許可(FORWARD)になっています。
条件を満たさない(後述の詳細設定に該当しない)場合は拒否する必要がありますので、 拒否(DROP)に変更します。
具体的には、以下を、コマンドプロンプト上で実行します。

netsh routing ip set filter name="ローカル エリア接続" filtertype=input \
  action=drop

set filter によって、 既定の操作を設定できます。
name で指定しているのは、インターフェース名です。 大抵は "ローカル エリア接続" になっていると思いますが、念のため、 ipconfig コマンドなどで確認してみてください。 (きっちり指定する必要がありますので、スペースなどにも注意してください。 例えば、"ローカルエリア接続" では一致しません。)
filtertype には、方向を指定します。 入ってくるパケットに対する設定なので、input を指定します。
action には、既定の操作を指定します。 拒否するので、drop を指定します。


既定と異なる設定

まずは、TCPから行います。
こちらからセッションを確立したパケットはすべて許可しますので、 以下をコマンドプロンプト上で実行します。

netsh routing ip add filter name="ローカル エリア接続" filtertype=input \
  srcaddr=0.0.0.0 srcmask=0.0.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=tcp-est srcport=0 dstport=0

add filter によって、 既定の操作とは異なる、細かい設定を行います。
srcaddr, srcmask を用いて、 送信元アドレスの条件を指定します。 ここでは全部 0 なので、条件なし(すべて該当)になります。
dstaddr, dstmask を用いて、 宛先アドレスの条件を指定します。 ここでも全部 0 なので、条件なし(すべて該当)になります。
proto には、プロトコルを指定します。 tcp-est は、セッション確立済のTCPパケットを指します。
srcport, dstport には、 それぞれ送信元のポート、宛先のポートを指定します。 ここでも全部 0 なので、条件なし(すべて該当)になります。

srcaddr などは、省略できます。
上記コマンドは、以下のように短くすることができます。

netsh routing ip add filter "ローカル エリア接続" input \
  0.0.0.0 0.0.0.0 0.0.0.0 0.0.0.0 tcp-est 0 0

次に、TCPパケットのうち 172.16.0.0/16 からのものを許可します。

netsh routing ip add filter name="ローカル エリア接続" filtertype=input \
  srcaddr=172.16.0.0 srcmask=255.255.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=tcp srcport=0 dstport=0

そして、172.16.0.0/16 からの UDPとICMPのパケットを許可します。

netsh routing ip add filter name="ローカル エリア接続" filtertype=input \
  srcaddr=172.16.0.0 srcmask=255.255.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=udp srcport=0 dstport=0
netsh routing ip add filter name="ローカル エリア接続" filtertype=input \
  srcaddr=172.16.0.0 srcmask=255.255.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=icmp type=0 code=0

...これらは、バッチファイルにしておくと楽だと思います。
ちなみに、わたしはこうしています。(条件などが上記と少し異なります。)

@echo off
set ifname="ローカル エリア接続 4"
set act="add"
set lnet="192.168.152.0"
set lmsk="255.255.255.0"
set anet="0.0.0.0"
set amsk="0.0.0.0"

netsh routing ip set filter name=%ifname% filtertype=input action=drop
netsh routing ip %act% filter name=%ifname% filtertype=input \
  %anet% %amsk% %anet% %amsk% tcp-est 0 0
netsh routing ip %act% filter name=%ifname% filtertype=input \
  %lnet% %lmsk% %anet% %amsk% tcp 0 0
netsh routing ip %act% filter name=%ifname% filtertype=input \
  %lnet% %lmsk% %anet% %amsk% udp 0 0
netsh routing ip %act% filter name=%ifname% filtertype=input \
  %anet% %amsk% %anet% %amsk% icmp 0 0
netsh routing ip show filter name=%ifname%


確認


感想

というわけで、静的ではありますが、そこそこ使えるのではないかと思います。
…とはいえ、ここではすごく単純な例になってしまいました。
実環境できっちり設定しようとすると、UDP の設定に悩まされるかもしれません。
あと、出ていくパケットも、送信元アドレスをチェックした方がいいかもしれません。


捕捉

netsh は、対話的に行うこともできます。
わからないところを ? にすると、 ヘルプが表示されます。

netsh
netsh>routing ip
netsh routing ip>add filter ...
OK

もし設定を間違えた場合は、一旦 delete filter で削除してから、 再度 add filter を行います。(でないと設定がどんどん増えてしまいます。)

netsh routing ip add filter name="ローカル エリア接続" filtertype=input \
  srcaddr=172.26.0.0 srcmask=255.255.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=tcp srcport=0 dstport=0  <--- 間違えた
netsh routing ip del filter name="ローカル エリア接続" filtertype=input \
  srcaddr=172.26.0.0 srcmask=255.255.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=tcp srcport=0 dstport=0  <--- 消す
netsh routing ip add filter name="ローカル エリア接続" filtertype=input \
  srcaddr=172.16.0.0 srcmask=255.255.0.0 dstaddr=0.0.0.0 dstmask=0.0.0.0 \
  proto=tcp srcport=0 dstport=0  <--- 再設定

Powered by Apache PostgreSQL Usupi Logo Kuri Logo
[Home] [Kuri] [Sysad] [Internet?] [Blog] [Java] [Windows] [Download] [Profile] [Flash] [-]
usu@usupi.org Last modified : Tue May 18 23:37:49 2004