IP filter ショートガイド Dec, 1999 ホームページ: http://coombs.anu.edu.au/~avalon/ip-filter.html FTP: ftp://coombs.anu.edu.au/pub/net/ip-filter/ 外山 純生 山本 泰宇 ----- はじめに 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 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 and YAMAMOTO Hirotaka 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.