iptables設定ドキュメント
iptablesとは、パケットフィルタリングやIPマスカレード・NATを行なうサービスの事である。
iptablesはカーネル2.4から実装されたサービスで、それ以前はipchainsというものがその代わりにあった。iptablesはipchainsの機能を理解しやすく整理し、機能を強化したツールである。
パケットフィルタリングを行なうfilter、IPマスカレードとNAT処理を行なうnat、複数のポートをまとめて1つのポートで処理を行なうように見せかけるmangleという3つのテーブルから成っている事から、iptablesという名前がついている。
■構成
マシンにはNICが2枚刺さっており、外に繋がっているNICをeth0、内側のネットワークに繋がっているNICをeth1とする。
■準備
/etc/sysconfig以下に「ipchains」もしくは「iptables」ファイルが存在していないかをチェック。もしどちらかがあるなら、すでにiptables(又はipchains)が設定されているという事になる。
ここではどちらも存在しなかった場合、あるいはiptablesが存在した場合を元に設定を行なっていく。
★filterテーブル
■フィルタリングテーブルの参照
iptablesで現在のフィルタリングテーブルを見る
# /sbin/iptables -nL |
Chain INPUT (policy ACCEPT) target prot pot source destination Chain FORWARD (policy ACCEPT) target prot pot source destination Cahin OUTPUT (policy ACCEPT) target prot pot souce destination |
最初は全て許可(ACCEPT)に設定されている。
上の状態では、設定されているテーブルは無い。
# /sbin/iptables -nL -v |
とすると、もっと詳しく表示させる事もできる。
■iptables(filter)コマンド
コマンドの基本構造
# /sbin/iptables <オプション> <チェーン> (<ルール> <ルール指定>) (-j) <ターゲット> |
オプション
-A 設定の追加
-D 設定の削除
-P デフォルトポリシーの設定
-L 現在の設定を表示する
-F チェーンからポリシー以外の設定を削除
-I 新しいルールを特定の位置に挿入
チェーン
INPUT 入力パケット
FORWARD 転送するパケット
OUTPUT 出力パケット
ルール
-s 送信元IPアドレス
-d 宛先IPアドレス
--dport 受け入れるポート番号
-p プロトコル(tcp,udp,icmpなど)
-i 受信インターフェース
-o 送信インターフェース
ターゲット(-j)
ACCEPT 許可
DROP 破棄・不許可
REJECT 拒否
■フィルタリングテーブルの設定(INPUTチェーン)
フィルタリングは、まず全て遮断。それから許すものだけ通す設定を追加していくという方法で設定するのが常套手段である。
次のコマンドで全てのINPUTパケットをDROP(破棄)する
# /sbin/iptables -P INPUT DROP |
このままでは、自分自身(localhost)へのパケットも全て破棄されてしまうので、まずlocalhostへのパケットを通す。
# /sbin/iptables -A INPUT -i lo -j ACCEPT |
次に、eth1(内側のネットワーク)から来るパケットは安全と見なす事ができるため、全て通す。
# /sbin/iptables -A INPUT -i eth1 -j ACCEPT |
次に、外部の他のPCからのパケットを受け入れる。
# /sbin/iptables -A INPUT -p tcp -s 192.168.5.0/24 --dport 22 -j ACCEPT |
これは、192.168.5.0/24ゾーンから22番ポート(sshサービス)へのtcpパケットアクセスが来た時に通すという設定である。
しかし、この設定では外部からのアクセスにはまだ応答しない。なぜなら、22番ポートは応答するが、応答を返す時には1024番〜65535番ポートのいずれかのポートを使用して応答を行なうからである。1024番〜65535番ポートは閉じてある。これを開けなければならないが、全て開けてしまえばセキュリティ的に問題である。
そのため、次のコマンドを使用する。
# /sbin/iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT |
RELATED,ESTABLISHEDというのは、現在使用している応答に関するポートを開ける、というオプションである。これにより、安全に応答を返す事ができるようになる。
ここまで設定して来た項目は、まだ保存されていない。保存するには次のコマンドを使用する。
# /etc/init.d/iptables save |
すると/etc/sysconfig/に保存ファイルiptablesが作成される。
# /sbin/iptables -nL -v |
のコマンドで詳細表示をさせると
Chain INPUT (policy DROP 30 packets 3485 bytes) pkts bytes target prot opt in out souce destination 1444 98610 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT all -- eth1 * 0.0.0.0/0 0.0.0.0/0 0 0 ACCEPT tcp -- * * 192.168.5.0/24 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT all -- * * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy ACCEPT 0 packets, 0 byte) pkts bytes target prot opt in out souce destination Chain OUTPUT (policy ACCEPT 0 packets, 0 byte) pkts bytes target prot opt in out souce destination |
という風に、設定が加えられているのが分かる。
この状態だと、マシンに来るパケットはフィルタリングできているが、フォワードさせて他のマシンに届くパケットはまったくフィルタリングされていない。
■フィルタリングテーブルの設定(FORWARDチェーン)
FORWARDチェーンでは自分自身へのパケットではなく、転送するパケットのみに付いて記述することに注意する。
設定は-A INPUTを-A FORWARDに変える事が違うくらいで、大きく変わる事は何も無い。このマシンをルータ状態にしている場合、フォワードするパケットを制限したりする事で、ファイアウォールとして機能させる事ができるようになる。
例えば
# /sbin/iptables -A FORWARD -s
192.168.100.10 -i eth0 -j DROP |
とする事で、192.168.100.10を宛先とする通信をフォワードさせない事ができる。
もちろん設定を保存しなければ再起動後は設定が元に戻ってしまう。
■フィルタリングテーブルの設定(OUTPUTチェーン)
OUTPUTに関しては、自分自身が送出するパケットの制限なのであまり使用する事はない。ACCEPTのままにしておけばよいだろう。