| iptables |
常時接続+サーバ公開を考えるとFirewallは必須となる。 セキュリティが何かを考えられない人は、サーバを公開するべきではない。 そこで僕もセキュリティを考慮して、kernel 2.4の標準packet filter機 能であるiptablesを使うことにした。まずはiptablesの仕様について。
| テーブル |
3つのテーブルが用意されている。
defaultのテーブル(filter)には3つのチェインは INPUT,OUTPUT,FORWARDがある。 これらのチェインは以下のようになっている。
入ってくる。
+---------------------+ +---------+ 出ていく
-----> |ルーティングの決定 | --> |FORWARD | ------------->
+---------------------+ +---------+ +--->
| |
| |
V |
+-------+ +--------+ |
|INPUT | -----> |OUTPUT | ----------+
+-------+ +--------+
| ターゲット |
パケットをどのように処理するかを決めるのがターゲットである。 基本TARGETは以下のようなものがある。
| ACCEPT | パケットを通す |
| DROP | パケットを落す |
| QUEUE | ユーザ空間に渡す(多分使わない。カーネルがサ ポートしていれば) |
| RETURN | 前のチェインの次のルールで停止する。 |
拡張ターゲットには以下のものがある。
| LOG | カーネルログに表示する |
| MARK | パケットに関連づけられたnetfilterのmark値を指 定する。(mangleテーブルのみ) |
| REJECT | マッチしたパケットの応答としてエラーパケッ トを送信する。 |
| TOS | Type Of Service フィールドを設定する。 (mangleテーブルのみ) |
| MIRROR | IPヘッダの送信元と送信先フィールドを入れ換 えて、パケットを再送信する。 |
| SNAT | パケットの送信元アドレスを修正させる。(natテー ブルとPOSTROUTINGチェインで有効) |
| DNAT | パケットの送信先アドレスを修正する。(natテー ブルとPREROUTING,OUTPUTチェインで有効) |
| MASQUERADE | 動的割り当てIPの場合にのみ使う。固定 IPならばSNATと同じ。 |
| REDIRECT | パケットの送信先IPアドレスをマシン自信の IPアドレスに変換する。(natテーブル内のPREROUTINGチェインとOUTPUTチェ インで有効) |
| パラメータ |
ルールの仕様を決める。!をつけることにより、否定をすることができる。
-p tcp,-p udpの場合に有効なマッチングの拡張。必ず、-p tcp --sport 0 といっ たように、-p tcpの後に指定する。
-m state の場合に有効なマッチングの拡張。
指定可能な接続状態は以下の通り。
| NEW | 新しい接続を開始したパケット |
| INVALID | どのパケットとも関係ないもの |
| ESTABLISHED | 既存のコネクションに属するパケット |
| RELATED | 既存のコネクションの一部ではなく関係のある パケット |
| チェインの操作 |
○ 新しいチェインをつくる。(-N)
# iptables -N syn-flood # iptables -A INPUT -i eth1 -p tcp --syn -j syn-flood
新しく、syn-floodのチェインを作る。 さらにeth1から入ってくる SYN packetをsyn-floodのチェインに送る。
○ チェイン内のルールを空にする。(-F)
○ 空のチェインを削除する。(-X)
# iptables -F HOGE # iptables -X HOGE
HOGEチェインを空にして、空になったHOGEチェインを削除 する。
○ 組み込み済みのチェインのポリシーを変更する。(-P)
# iptables -P INPUT DROP # iptables -P OUTPUT ACCEPT # iptables -P FORWARD DROP
INPUTチェインのポリシーをDROPに設定する。 OUTPUTチェインのポリシーをACCEPTに設定する。 FORWARDチェインのポリシーをDROPに設定する。
○ チェイン内のルールをリストアップする。(-L)
# iptables -L OUTPUT Chain OUTPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT all -- 192.168.1.0/24 anywhere ACCEPT udp -- anywhere anywhere udp dpt:ntp ・ ・ ・
OUTPUTチェインのルールをリストアップする。(-v)をつけるとパ ケット数とバイト数もリストアップする。
# iptables -L OUTPUT -v Chain OUTPUT (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 2320 196K ACCEPT all -- any lo anywhere anywhere 153 61740 ACCEPT all -- any eth0 192.168.1.0/24 anywhere ・ ・
○ チェイン内のルールのカウンタをリセットする。(-Z)
# iptables -Z OUTPUT
# iptables -L OUTPUT -v
Chain OUTPUT (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT all -- any lo anywhere anywhere
0 0 ACCEPT all -- any eth0 192.168.1.0/24 anywhere
OUTPUTチェインのカウンタをリセットする。その後、リストアップすると カウンタが0になっている。
○ チェインに新しいルールを追加する。(-A)
# iptables -A INPUT -i eth0 -s 192.168.1.0/24 -p tcp -j ACCEPT
INPUTチェインに入ってくるインタフェースがeth0で送信元が 192.168.1.0/24でプロトコルがtcpのものをACCEPTする。
○ チェインに新しいルールを挿入する。(-I)
# iptables -I INPUT 3 -i eth0 -s 192.168.1.0/24 -p tcp -j ACCEPT
INPUTチェインの3番目に入ってくるインタフェースがeth0で送信元が 192.168.1.0/24でプロトコルがtcpのものをACCEPTするルールを挿入す る。
○ チェインのルールを置換する。(-R)
# iptables -R INPUT 3 -i eth0 -s 192.168.1.0/24 -p tcp -j ACCEPT
INPUTチェインの3番目のルールを入ってくるインタフェースがeth0で送信元が 192.168.1.0/24でプロトコルがtcpのものをACCEPTするルールに置換する 。
○ チェインのルールを削除する。(-D)
# iptables -D INPUT 3
INPUTチェインの3番目のルールを削除する。
# iptables -D INPUT -i eth0 -s 192.168.1.0/24 -p tcp -j ACCEPT
-Aのときと同じ記述で書かれたものを削除する。
| 実際にfirewallとして使う。 |
Firewallの項にiptablesを使った firewallのスクリプトをのせています。 参考にしてください。