小規模firewall構築メモ

Hiroshi Takekawa <sian@big.or.jp> first revision, Last Modified: Thu Jan 21 00:04:55 1999. この文書は、 ipchains で firewall を設定した時のメモです。導入の際にとっつき程度にでもなれば幸いです。 IPCHAINS-HOWTO などに目を通すことをおすすめします。この文書は HOWTO ではなくメモとある通り、自分の覚え書きという側面が強いものです。できる限り他の人が読んでも有用なように書こうとつとめてはいますが、間違っていたり、あまり良くない方法が使われているかもしれません。この文書は更新される可能性

があります。日付が古いようならば、こちら <http://www.big.or.jp/ sian/linux/>で最新版かどうかご

確認ください。

目次

1 firewall とは何か 2 2 何が必要か 2

2.1 カーネル . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 2.2 ipchains . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3

3 何が行われるのか 3

3.1 chain とはなんぞや . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 4 何をすればいいか 4

4.1 X server への接続を制限する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 4.2 web server への接続だけ許可する . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5 4.3 localnet からのアクセスには rpc,X への接続を許可する . . . . . . . . . . . . . . . . . . . . . . 5

5 その他の注意 5 6 更新履歴 5 この文書の著作権は 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/ <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 が interface(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/

<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
#