IP filter ショートガイド					Dec, 1999

ホームページ:	http://coombs.anu.edu.au/~avalon/ip-filter.html
FTP:		ftp://coombs.anu.edu.au/pub/net/ip-filter/

					外山 純生 <sumio@is.s.u-tokyo.ac.jp>
					山本 泰宇 <ymmt@is.s.u-tokyo.ac.jp>

-----
はじめに

IP filter を gateway マシンにインストールすることでパケットフィ
ルタリングを行うことができます。

インストールの方法は、INSTALLに書いてあるので、そちらを参照して
ください。IP filter のバージョン 3.3.5 は、
	     Solaris/Solaris-x86 2.3 - 8 (early access)
	     SunOS 4.1.1 - 4.1.4
	     NetBSD 1.0 - 1.4
	     FreeBSD 2.0.0 - 2.2.8
	     BSD/OS-1.1 - 4
             IRIX 6.2
で動作することが確認されています。

なお、64 bit kernel の走ってる Solaris7 マシンでは、gcc とかでコ
ンパイルした kernel driver は動作しません。

そのような場合には、precompiled binary を
ftp://coombs.anu.edu.au/pub/net/ip-filter/ip_fil3.3.2-sparcv9.pkg.gz
(1999年12月14日現在、まだ3.3.5はパッケージになっていません)
から取ってくるか、Workshop Compiler 5.0 でコンパイルして 64bit
driver を作ってください。

-----
設定ファイルの記述方法

IP filterの設定は「どのアドレス」の「どのポート」から「どのアド
レス」の「どのポート」へのパケットを block するか pass するか、
を指定することで行います。

以下の例では、我々が管理しているサブネットより外から内のアクセス
は、一部のマシンを除いては全てブロックし、内から外へのアクセスは、
原則として全て素通しするポリシーで記述されています。

以下、管理しているサブネットを
	123.45.1.0/24
として例を示します。24はサブネットマスクです。

また、gateway は
	123.45.1.111	(hme0)
が LAN側のインターフェース、
	123.45.2.10	(hme1)
が外側のインターフェースとします。


===================== ここから ====================
########## quickly deny malicious packets
#
block in quick from any to any with short
block in log quick from any to any with ipopts
===================== ここまで ====================

まずはこのルールで、不正なパケットをはねます。block は block す
る意味で、反対に通す場合は pass となります。

log というのは、このルールにマッチするパケットのログを取る指示で
す。ログは /dev/ipl というデバイスファイルからアクセスできますが、
このデバイスは bounded buffer なので、ある程度以上のログは消えて
しまいます。

/dev/ipl の内容を読み出すには ipmon というプログラムを使います。
ipmon は stdout, syslog, もしくは通常のファイルにログを出力しま
す。起動時に ipmon を立ち上げるなら、次のような行を rc ファイル
に書くとよいでしょう。

ipmon -n -o I ${IPMONLOG} < /dev/null > /dev/null 2>&1 &

${IPMONLOG} は適当なファイル名に置換してください。syslog に出力
する場合は、-s オプションを付けます。syslog に出力する場合、
local0.info を記録するように syslog.conf を編集してください。
例えば、

local0.info			ifdef(`LOGHOST', /var/log/syslog, @loghost)


quick というのは、このルールにマッチしたパケットは以降のルールを
調べずに、アクション(block or pass)に従わせるというものです。た
だし、例外があります。後述します。


===================== ここから ====================
########## group setup
#
block in on hme1 all head 100
block out on hme1 all head 150
pass in quick on hme0 all
pass out quick on hme0 all
===================== ここまで ====================

次に制御をかけるインターフェース毎にパケットに適用するルールを分
類します。hme0 は LAN 側のインターフェースなので、即座に許可
(pass quick)しています。

all というのは、from any to any の省略形です。

外部とのインターフェースである hme1 は incoming と outgoing で、
それぞれ group 100 番と 150 番に分類します。head というのは、こ
のルールにマッチしたパケットを次の番号のグループに分類するという
意味です。


===================== ここから ====================
########## deny IP spoofing
#
block in log quick from 127.0.0.0/8 to any group 100
block in log quick from 123.45.2.10/32 to any group 100
block in log quick from 123.45.1.111/24 to any group 100
#
########## deny reserved addresses
#
block in log quick from 10.0.0.0/8 to any group 100
block in log quick from 192.168.0.0/16 to any group 100
block in log quick from 172.16.0.0/12 to any group 100
#
===================== ここまで ====================

IP アドレスを改竄したパケットを即座に拒否しています。末尾の 
group 100 というのは head 100 で分類されたパケットにのみマッチす
るルールという意味です。

-----
ここまでで、基本的にLAN内の通信は素通しだが外部との通信はデフォ
ルトで一切禁止という設定になります。以降では、そのデフォルトに対
する例外という形で、通したいパケットを記述していきます。

まず、内部から外部への接続に関する設定をします。
===================== ここから ====================
########## OUTGOING
#
## allow ping out
#
pass out quick proto icmp from any to any keep state group 150
#
## allow all outgoing UDP packets except for netbios ports (137-139).
#
pass out quick proto udp from any to any keep state head 160 group 150
block out log quick proto udp from any to any port 136 >< 140 group 160
#
## pass all TCP connection setup packets except for netbios ports (137-139).
#
pass out quick proto tcp from any to any flags S/SAFR keep state head 170 group 150
block out log quick proto tcp from any to any port 136 >< 140 group 170
===================== ここまで ====================

これは基本的に全てのパケットを許すルールです。しかし、netbios
(137-139/udp, tcp)のポートだけは禁止しています。netbiosは Windows
のファイル共有で使われるポートで、このポートが開いていると、
Windowsの設定によっては、世界中からファイルを読み書きできる
恐れがあります。

ここで、簡単に書式を見ておくと、
* 最初の単語で、blockするかpassするか指定する
* proto の後の単語で、protocolを指定する(udp, tcp, icmp, etc.)。
* from A to B で、どこからどこへのパケットかを指定する
* head XXXを指定すると、その行で指定されあたパケットは、group
  XXXとして参照できる
* groupを指定することで、規則を適用する候補を(予めheadで設定した)
  groupに限定できる。

また、from A to BのAやBは、IPアドレスとportを書くことができます。
     from any to any port 136 >< 140
というのは、
  「任意のポートの任意のアドレスから、137番から139番ポートの任意の
    アドレスへのパケット」
指定していることになります。また、番号の代わりに/etc/serviceに記
述されているサービス名を記述することもできます。
たとえば
      from any to any port = telnet
と
      from any to any port = 23
は同じ意味となります。

さて、ここで quick の例外を説明しておきます。quick の付いた
rule が head で新たなグループを作る場合、処理はまだこの時点
では確定しません。以降、「head で宣言されたグループのルール」
のみ処理するという意味になります。ですから上の、

pass out quick proto udp from any to any keep state head 160 group 150
block out log quick proto udp from any to any port 136 >< 140 group 160

は、まず 150番グループにマッチする UDP パケットは素通し
する、が、以下の 160番に属するルールをまだ処理する。
そして2行目で 160番グループに対して netbios packet を
block している訳です。
一行目にマッチしたパケットは以下にもし150番のグループの
ルールがあったとしても、無視することに注意してください。

----------
次に、外部から内部へのアクセスの設定をします。

* ルーティング情報(RIP)のパケットは、全部許します。
pass in quick proto udp from any to any port = 520 keep state group 100

* ICMPのパケットは全部許します。
pass in quick proto icmp from any to any group 100

* 内部から外部へのftpを許すために、ftp-data portから一般ポートへ
  の任意の接続を受け付けます。これはpassive modeでないFTPの挙動
  です。
pass in quick proto tcp from any port = ftp-data to any port > 1023 flags S/SA keep state group 100

  しかし、これは一般に言って多少危険な行為です。接続できるのが
  1024番以降の一般ポートに限定はされますが、あまりお勧めできません。
  この行を加えずに、passive mode (ftp で pasv コマンドで入れる)
  で FTP をすることを勧めます。なお、最近の FTP client は最初
  から passive mode に無条件でしてしまうものが多いようです。
  
* sendmailやftpdに繋ぐと、相手がidentポートへアクセスしてくるこ
  とがあるので、ident portを開けます。ident は通常は起動されてい
  ない daemon なので、素通ししてもセキュリティホールになることはあ
  りません(connection refusedになるだけです)。これを開けないと、
  相手側は timeout するまで先に進まないので、FTP や mail の送信
  がやたらに遅くなることがあります。
  もし 113 番ポートに接続できるようなら、そのサービスは即座に
  停止することを勧めます。
pass in quick proto tcp from any to any port = 113 flags S/SA keep state group 100

------
次に、外部から firewall へのアクセスを許すサービスを記述していき
ます。まずは、外部からの接続を許したいホストについて、グループ番
号をつけます。

===================== ここから ====================
## grouping by host
block in log quick proto tcp from any to 123.45.1.X flags S/SA head 110 group 100
block in log quick proto tcp from any to 123.45.1.Y flags S/SA head 111 group 100
===================== ここまで ====================

これで、
	外部から 123.45.1.X への接続は group 110
        外部から 123.45.1.Y への接続は group 111
で参照することができます。

他にも許したいホストを増やしたいときは、上と同様にして、headの後
に、新しい数字(112, 113など)を割り当ててください。

もう一度注意しておきますが、quick と head が同時に現れるルール
以降では、head で宣言されたグループのルールしか適用されなくなり
ます。ですから、上の ident や ftp data-port のように、内部の
全てのホストにマッチするルールは、このホストによるグループ分け
の前に置く必要があります。


Xへは、telnet, ftp, ssh を、Yへは、ftp, http, smtp, pop を許すこ
とにします。

* X(group 110)へのtelnetを許します
pass in quick proto tcp from any to any port = telnet keep state group 110

* Xへのftpを許します。ftp-data port も開けておきます。
  (必要があるかどうか確認はしていませんが、開けていても安全でしょう)。
pass in quick proto tcp from any to any port = ftp keep state group 110
pass in quick proto tcp from any to any port = ftp-data keep state group 110

* Xへのsshを許します。
pass in quick proto tcp from any to any port = 22 keep state group 110

* Yへのftpを許します。
pass in quick proto tcp from any to any port = ftp keep state group 111
pass in quick proto tcp from any to any port = ftp-data keep state group 111
pass in quick proto tcp from any to any port 2999 >< 3100 keep state group 111

  Yは anonoymous ftp サーバを運営しているため wu-ftpd を使ってい
  ます。wu-ftpd は passive mode のFTPにも対応していますので、ど
  のポートをPASV用に使うか、wu-ftpd の設定に書いておく必要があり
  ます。ここでは3000から3099番ポートを使用するように、wu-ftpd を
  設定しています。

  passive FTP について解説します。passive FTP は、クライアントが
  ファイアウォールの内側にいる場合のために開発されたプロトコルで
  す。デフォルトでは上で説明したように、データ転送のため、サーバ
  の ftp-data port からクライアントに接続がいきます。

  passive FTP では、データ転送も client からサーバに接続するよう
  になります。その際、サーバは適当なポート番号を割り振って、そこ
  にクライアントが接続するよう指示します。

  このため、サーバがファイアウォール内にいる場合、適当なポート番
  号はファイアウォールではねられてしまいます。そこで、wu-ftpd の
  設定で、割り振るポート番号の範囲を限定して、そこだけファイア
  ウォールに穴を開けているわけです。wu-ftpd の場合は、ftpaccess
  というファイルに

  # passive ports <cidr> <min> <max>
  passive ports 0.0.0.0/0 3000 3099

  と追加することで設定できます。ftpaccess(5)を参照してください。

* Yへのhttpを許します。
pass in quick proto tcp from any to any port = 80 keep state group 111

* Yへのsmtpを許します。
pass in quick proto tcp from any to any port = smtp keep state group 111

* Yへのpopを許します。
pass in quick proto tcp from any to any port = 110 keep state group 111

以上の設定により、X, Y 以外のマシンへの、外部からの接続は、一切
行えなくなりますので、remote exploit 対策は、X, Y にのみ行えばよ
くなり、管理の手間が軽減できます。

他のプロトコルを通す場合も、上を参考にして通したいポート番号を書
くだけですが、いくつか注意点があります。以下も目を通してください。

-----
その他の注意

1) gateway マシンのように、複数のIPアドレスを持つマシンでサービ
スを立ち上げる場合は、それぞれのIPアドレスに対して、port を開く
必要があります。例えば X が IP:a と IP:b を持つなら、group は a,
b それぞれ用意して、両方のグループ用に rule を追加する必要があり
ます。以下の例では、ゲートウェイマシン(123.45.2.10と123.45.1.111
のIPを持つ)にNNTPサーバを立てています。

(例)
#### grouping by host
block in log quick proto tcp from any to 123.45.2.10 flags S/SA head 112 group 100
block in log quick proto tcp from any to 123.45.1.111 flags S/SA head 113 group 100
#### allow NNTP
pass in quick proto tcp from any to any port = nntp keep state group 112
pass in quick proto tcp from any to any port = nntp keep state group 113

gateway が2つ以上あるネットワークでは、両方の gateway に IP
filter が必要になり、設定は更に複雑になります。そのような環境の
場合には、マニュアルを読んで検討してください。

2) NFSとrshはプロトコルの関係上、firewall超えは不可能です。
   NFSの代替については不明ですが、rshの代替としてはsshが使えます。

3) 外部のX client を、ファイアウォール内のXサーバに接続させたい、
   というのは FAQ の一つです。お勧めの解決策は、ssh の X forwarding
   機構を使うことです。sshで接続できるならば、これは完全に secure
   で汎用的な方法です。

それが出来ない場合は、我々は接続させたいホストのペアをユーザに報
告してもらって、以下のようなルールを追加しています。
# X:0 は tcp:6000 番になります。

# 123.45.1.Z:0 (server) <-> A.B.C.D (client)
pass in quick proto tcp from A.B.C.D port > 1023 to 123.45.1.Z port = 6000 flags S/SA keep state group 100

-----
最後に、残るパケットは全てブロックされる訳ですが、それについての
全てのログを残すことを希望する場合、次のルールを「必ず最後に」加
えます。

## log blocked packets
block in log quick from any to 123.45.1.111/24 group 100
block in log quick from any to 123.45.2.10 group 100

------
今迄の設定をひとつにまとめたファイルを最後に添付します。

===================== ここから ====================
########## Packet Filtering Rules for 123.45.1. ##########
#
# The following routes should be configured, if not already:
#
# route add 123.45.1.111 localhost 0 (hme0)	(LAN)
# route add 123.45.2.10 localhost 0   (hme1)	(upstream)
#
########## quickly deny malicious packets
#
block in quick from any to any with short
block in log quick from any to any with ipopts
#
########## group setup
#
block in on hme1 all head 100
block out on hme1 all head 150
pass in quick on hme0 all
pass out quick on hme0 all
#
########## deny IP spoofing
#
block in log quick from 127.0.0.0/8 to any group 100
block in log quick from 123.45.2.10/32 to any group 100
block in log quick from 123.45.1.111/24 to any group 100
#
########## deny reserved addresses
#
block in log quick from 10.0.0.0/8 to any group 100
block in log quick from 192.168.0.0/16 to any group 100
block in log quick from 172.16.0.0/12 to any group 100
#
########## OUTGOING
#
## allow ping out
pass out quick proto icmp from any to any keep state group 150
#
## allow all outgoing UDP packets except for netbios ports (137-139).
#
pass out quick proto udp from any to any keep state head 160 group 150
block out log quick proto udp from any to any port 136 >< 140 group 160
#
## pass all TCP connection setup packets except for netbios ports (137-139).
#
pass out quick proto tcp from any to any flags S/SAFR keep state head 170 group 150
block out log quick proto tcp from any to any port 136 >< 140 group 170
#
######### INCOMING
## ICMP
pass in quick proto icmp from any to any group 100
## RIP
pass in quick proto udp from any to any port = 520 keep state group 100
## FTP
pass in quick proto tcp from any port = ftp-data to any port > 1023 flags S/SA keep state group 100
## IDENT
pass in quick proto tcp from any to any port = 113 flags S/SA keep state group 100
#
## grouping by host (112 & 113 is the gateway address)
block in log quick proto tcp from any to 123.45.1.X flags S/SA head 110 group 100
block in log quick proto tcp from any to 123.45.1.Y flags S/SA head 111 group 100
block in log quick proto tcp from any to 123.45.2.10 flags S/SA head 112 group 100
block in log quick proto tcp from any to 123.45.1.111 flags S/SA head 113 group 100
#
## telnet, ftp, ssh, www, smtp, pop
pass in quick proto tcp from any to any port = telnet keep state group 110
pass in quick proto tcp from any to any port = ftp keep state group 110
pass in quick proto tcp from any to any port = ftp-data keep state group 110
pass in quick proto tcp from any to any port = 22 keep state group 110
pass in quick proto tcp from any to any port = ftp keep state group 111
pass in quick proto tcp from any to any port = ftp-data keep state group 111
pass in quick proto tcp from any to any port 2999 >< 3100 keep state group 111
pass in quick proto tcp from any to any port = 80 keep state group 111
pass in quick proto tcp from any to any port = smtp keep state group 111
pass in quick proto tcp from any to any port = 110 keep state
group 111
#
## allow NNTP on the gateway
pass in quick proto tcp from any to any port = nntp keep state group 112
pass in quick proto tcp from any to any port = nntp keep state group 113
#
## X connections
# 123.45.1.Z:0 (server) <-> A.B.C.D (client)
pass in quick proto tcp from A.B.C.D port > 1023 to 123.45.1.Z port = 6000 flags S/SA keep state group 100
#
## log blocked packets
## THIS MUST BE THE LAST RULE!
block in log quick from any to 123.45.1.111/24 group 100
block in log quick from any to 123.45.2.10 group 100
===================== ここまで ====================

----
この文書の取り扱いについて
Copyright (C) 1999 TOYAMA Sumio <sumio@is.s.u-tokyo.ac.jp>
                   and YAMAMOTO Hirotaka <ymmt@is.s.u-tokyo.ac.jp>

THIS DOCUMENT IS PROVIDED ``AS IS'' AND WITHOUT ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, WITHOUT LIMITATION, THE IMPLIED
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE.

Permission to modify this document and to distribute it is hereby
granted, as long as above notices and copyright notice are retained.