小規模firewall構築メモ Hiroshi Takekawa 著 first revision, Last Modified: Thu Jan 21 00:04:55 1999. この文書は、ipchainsでfirewallを設定した時のメモです。導入の際にとっつ き程度にでもなれば幸いです。IPCHAINS-HOWTOなどに目を通すことをおすすめ します。この文書はHOWTOではなくメモとある通り、自分の覚え書きという側 面が強いものです。できる限り他の人が読んでも有用なように書こうとつとめ てはいますが、間違っていたり、あまり良くない方法が使われているかもしれ ません。この文書は更新される可能性があります。日付が古いようならば、こ ちら で最新版かどうかご確認くださ い。 ______________________________________________________________________ Table of Contents: 1. firewallとは何か 2. 何が必要か 2.1. カーネル 2.2. ipchains 3. 何が行われるのか 3.1. chainとはなんぞや 4. 何をすればいいか 4.1. X serverへの接続を制限する 4.2. web serverへの接続だけ許可する 4.3. localnetからのアクセスにはrpc,Xへの接続を許可する 5. その他の注意 6. 更新履歴 ______________________________________________________________________ この文書の著作権はHiroshi Takekawaが所有しております。 (C)Copyright 1999 by Hiroshi Takekawa. この文書は、自由に配布してかまいませんが、改変しないでください。特に著 作権表示を変更/削除してはいけません。 この文書は役に立つように願って書かれておりますが、間違っている可能性が あります。この文書によって生じたあらゆる事故等に対する責任を筆者はいっ さい負わないものとします。間違いの指摘、御意見、御感想等は広く募集いた しておりますが、御期待に添えないこともあります。御了承ください。 ______________________________________________________________________ 1. firewallとは何か 簡単に書きます。正確なところは文献をあたってみてください。web上にもよ い資料があることでしょう。 IPネットワーク上の通信はパケット(packet)単位で行われます。一度に送れる データの量がきまっているので、分割しておくるわけです。そこで、packetと いうのは、データの断片と種類(protocol)、その送り元(source)と宛 先(destination)がセットになったものと考えるとよいでしょう。 ここで作ろうとしてい るfirewallは、packetのprotocolやsource、destinationなどをみて選 別(filtering)して、それぞれなんらかの処理をする、というPacket filtering basicsに基づいたものです。これによりデータの流れをコントロー ルしたり、セキュリティを確保したりすることができます。 いまやインターネットが常識となってきた時代です。世界中のコンピュータに 接続できる反面、接続される可能性もあるわけです。悪意のあるアクセスがな いとも限りません。しっかり自分のマシンを守りましょう。 2. 何が必要か まずネットワークに関する基本的な知識は前提とします。また、カーネルの再 構築、設定ファイルの編集などといったことも十分慣れているものとします。 このあたりのことはLDP、JFなど、他にすばらしい文書があるので読んでみる ことをおすすめします。 2.1. カーネル まず、IP firewall機能が使えるようにカーネルを再構築する必要がありま す。 IPCHAINS-HOWTOによると、 2.0.x用 CONFIG_EXPERIMENTAL=y CONFIG_FIREWALL=y CONFIG_IP_FIREWALL=y CONFIG_IP_FIREWALL_CHAINS=y 2.1.x or 2.2.0用 CONFIG_FIREWALL=y CONFIG_IP_FIREWALL=y と設定するとあります。menuconfigやxconfigでいうところのNetwork firewallsと、 IP: firewalling にあたります。これを使えるようにしてくだ さい。 rebootしたら、/proc/net/ip_fwchains があることを確認してくださ い。ありましたか?それでは次にすすみましょう。 2.2. ipchains 次に選別の仕方を指定するツールである、ipchainsをインストールしま す。http://www.rustcorp.com/linux/ipchains/ からたどって最新のipchainsを 持ってきて、make && make install でインストールします。 # ipchains --version ipchains 1.3.8, 27-Oct-1998 これでipchainsのインストールは完了です。 3. 何が行われるのか カーネルの中で何が行われるのか見てみましょう。正確な説明 はIPCHAINS-HOWTOを御覧ください。 3.1. chainとはなんぞや ところでなぜchainという名が使われてるのでしょうか。これは、ルールの適 用が鎖の様に連なっていっているからではないかと思います。例えばこんな感 じです。 input rule0: → (nothing but counting packets) rule1: → ppp-in rule0: → DENY rule1: → RETURN rule2: → ACCEPT rule2: → REJECT packetが入ってくるとまずinputという選別規則鎖(chain)から見ます。例で はrule(例えばある特定のマシン行きであるかどうか、などの規則)が3つあ り、上から順に適用(matching)されていきます。ruleに適合(match)すると、 なんらかの指示(target)があるのですが、rule0にmatchすると何もしないで、 ただmatchするようなpacketがどれだけ来たかを数えるために使われま す。rule1にmatchするとppp-inという新たな鎖へと移り、またruleの適用が始 まります。またruleをみて行き全部みおわったら、もとの鎖にもど りinputのrule2から見始めるわけです。同様にpacketがでていく時にはoutput chainから、転送される時にはforward chainからmatchingが始まります。 DENY、REJECT、ACCEPTといったtargetは最終的なpacketの扱いを決めるもの で、全部で6種類あります。 DENY あたかもpacketを受けとらなかったのように振舞います。 REJECT DENYに似ていますが、sourceにICMPを使ってdestinationに到達できな かった旨を知らせます。 ACCEPT packetを受けとります RETURN そのchainの最後にいったことと同じことをします。 MASQ packetをmasqueradeします。今の所これ以上の説明はできません。 REDIRECT packetをlocal portに転送します。今の所これ以上の説明はできませ ん。 RETURNの解説をしましょう。例で、inputのrule1にmatchする とppp-inのrule0からmatchingをはじめますが、rule1にmatchすると、rule2を 調べずに、inputのrule2のmatchingにとびます。ppp-inがsubroutineのよう だ、というとプログラミングに慣れてる方にはわかりやすいかもしれません。 では、どこにもmatchしなかったpacketはどうなるのでしょう。そういっ たpacketに対するデフォルトを指定するものとしてポリシーの指定がありま す。ポリシーには、ACCEPT、DENY、REJECT、MASQ(forward chainのみ)が指定 できます。 …なんともあやしげな解説ですね。HOWTOはipchainsのパッケージにもテキス トで附属してきてますので、是非目を通してみてください。 4. 何をすればいいか さて、では、いよいよfirewallの設定に入りますが、この設定はポリシーや ネットワーク環境などにより、さまざまです。ここでの例はあくまで参考にと どめておいてください。(また私がこのような設定をしてるとも限りません。) ipchainsを用いたfirewallingは柔軟な設定を可能としています。というと、 設定は複雑になるのでは…と思われるかもしれませんが、それほどではありま せん。どちらかというと、どう設定するかよりも、どのような設定をすればい いかの方で悩むことでしょう… では、いくつかの例をあげながら説明を試みてみます。 4.1. X serverへの接続を制限する # ipchains -A input -p tcp -s ! 192.168.1.2 -i eth0 -d 192.168.1.1 6000:6010 -j REJECT 自ホストが192.168.1.1であるとします。-Aは追加、inputはinput chainへの 追加を表します。以降がruleの指定です が、-pがprotocol(TCP)、-sがsource(192.168.1.2以外)、-iがinter- face(eth0)、-dがdestination(192.168.1.1 のport 6000-6010)、最後 の-jがjump to target(REJECT)となります。つまり192.168.1.2以外からport 6000などにeth0経由でconnectしようとするとREJECTされる、という設定にな ります。オプションの詳細はipchains -hやman、HOWTOを御覧ください。 IPアドレスを適当に変更して、このruleを設定して実際に接続をこころみてみ ましょう。telnetをたたくだけでいいです。どうでしょうか、すぐ切られてし まうはずです。次にpacketがcountされてるか確認してみましょう。 # ipchains -L input -n -v Chain input (policy ACCEPT: 40983 packets, 11807637 bytes): pkts bytes target(略) 14 1518 REJECT(略) 細かな数字はどうでもいいのですが、pktsやbytesが0でなければ、そ のruleにmatchするpacketがそれだけ来た、ということになります。 4.2. web serverへの接続だけ許可する # ipchains -P input REJECT # ipchains -A input -p tcp -d 192.168.1.1 80 -j ACCEPT なお、ftpのクライアントになる場合は注意が必要です。1024以上のport(X等 の予約分のぞく)をひらかない場合、passive modeでないとserverか らclientにデータを送れません。 4.3. localnetからのアクセスにはrpc,Xへの接続を許可する # ipchains -P input REJECT # ipchains -N localnet # ipchains -A input -s 192.168.0.0/24 -d 192.168.0.1 -j localnet # ipchains -A localnet -p tcp -d 192.168.0.1 6000:6010 -j ACCEPT # ipchains -A localnet -p tcp -d 192.168.0.1 sunrpc -j ACCEPT もうちょっとipchainsっぽい定義(?)をしてみます。localnetからのアクセス があると、ユーザ定義chainであるlocalnetのrule群をみるように設定しま す。-N localnetで新しいchainを作り、Xに対するアクセス、rpcに対するアク セスをACCEPTするように設定します。 5. その他の注意 spoofingをふせぐために、Source Address Verificationを有効にしましょ う。これはipchainsと直接は関係ありませんが、重要です。(HOWTOにものって ます) 設定例 if [ -e /proc/sys/net/ipv4/conf/all/rp_filter ]; then echo -n "IP spoofing protection " for f in /proc/sys/net/ipv4/conf/*/rp_filter; do echo 1 > $f done fi syncookieと一緒に設定してやるとよいでしょう。 ipautofwやipportfwは別のコマンドになりま す。http://www.geocities.com/SiliconValley/Campus/4869/ からipmasqadmをお としてつかってください。 IPv6 over IPv4 のpacketを通してやるためには、protocol番号41を通す必要 があります。(名前で指定できないので、私はipchainsのコードにpatchをあて ました。) 6. 更新履歴 # Last Modified: Thu Jan 21 00:04:55 1999. # $Id: firewall-memo.sgml,v 1.3 1999/01/20 15:05:57 sian Exp sian $ ______________________________________________________________________ # $Log: firewall-memo.sgml,v $ # Revision 1.3 1999/01/20 15:05:57 sian # new section added # # Revision 1.2 1999/01/20 12:18:52 sian # add more example # # Revision 1.1 1999/01/17 12:53:24 sian # Initial revision #