iptables

常時接続+サーバ公開を考えるとFirewallは必須となる。 セキュリティが何かを考えられない人は、サーバを公開するべきではない。 そこで僕もセキュリティを考慮して、kernel 2.4の標準packet filter機 能であるiptablesを使うことにした。まずはiptablesの仕様について。

もどる

テーブル

3つのテーブルが用意されている。

filter:
デフォルトのテーブル。INPUT(マシンに入ってくるパケット),OUTPUT(ローカ ルで生成されたパケット),FORWARD(マシンを経由するパケット)が組み込み済みのチェ インに含まれる。
nat:
新しく接続を開く場合に参照される。PREROUTING(入ってきたパケッ トをすぐに変換する為のチェイン),POSTROUTING(出ていくパケットを変 換する為のチェイン),OUTPUT(ローカルで生成されたパケットをルーティ ング前に変換する為のチェイン)の3つが組み込み済みチェインに含まれ る。
mangle:
特別なパケット変換に使われる。。PREROUTING(入ってきたパケッ トをすぐに変換する為のチェイン),OUTPUT(ローカルで生成されたパケットをルーティ ング前に変換する為のチェイン)の2つが組み込み済みのチェインが含まれる。

defaultのテーブル(filter)には3つのチェインは INPUT,OUTPUT,FORWARDがある。 これらのチェインは以下のようになっている。

入ってくる。
               +---------------------+     +---------+               出ていく
        -----> |ルーティングの決定 | --> |FORWARD | ------------->     
               +---------------------+     +---------+       +--->  
                         |                                   |
                         |                                   |
                         V                                   |
                      +-------+         +--------+           |
                      |INPUT  |  -----> |OUTPUT  | ----------+ 
                      +-------+         +--------+
    
ターゲット

パケットをどのように処理するかを決めるのがターゲットである。 基本TARGETは以下のようなものがある。

基本TARGET
ACCEPTパケットを通す
DROPパケットを落す
QUEUEユーザ空間に渡す(多分使わない。カーネルがサ ポートしていれば)
RETURN前のチェインの次のルールで停止する。

拡張ターゲットには以下のものがある。

拡張TARGET
LOGカーネルログに表示する
MARKパケットに関連づけられたnetfilterのmark値を指 定する。(mangleテーブルのみ)
REJECTマッチしたパケットの応答としてエラーパケッ トを送信する。
TOSType Of Service フィールドを設定する。 (mangleテーブルのみ)
MIRRORIPヘッダの送信元と送信先フィールドを入れ換 えて、パケットを再送信する。
SNATパケットの送信元アドレスを修正させる。(natテー ブルとPOSTROUTINGチェインで有効)
DNATパケットの送信先アドレスを修正する。(natテー ブルとPREROUTING,OUTPUTチェインで有効)
MASQUERADE動的割り当てIPの場合にのみ使う。固定 IPならばSNATと同じ。
REDIRECTパケットの送信先IPアドレスをマシン自信の IPアドレスに変換する。(natテーブル内のPREROUTINGチェインとOUTPUTチェ インで有効)
パラメータ

ルールの仕様を決める。!をつけることにより、否定をすることができる。

-p,--protocol [!] protocol
ルールに使われるプロトコル。/etc/protocolsを参照。

-s,--source,--src [!] address[/mask]
送信元の指定。

-d,--destination,--dst [!] address[/mask]
送信先の指定。

-j,--jump [!] target
ルールのターゲット。パケットがマッチした場合にどうするかを決 める。

-i,--in-interface [!] name
パケットを受信するインタフェース名。 INPUT,FORWARD,PREROUTINGチェインで有効。

-o,--out-interface [!] name
パケットを送信するインタフェース名。 OUTPUT,FORWARD,POSTROUTINGチェインで有効。

-p tcp,-p udpの場合に有効なマッチングの拡張。必ず、-p tcp --sport 0 といっ たように、-p tcpの後に指定する。

--source-port,--sport [!] [port[:port]]
送信元ポートまたはポート範囲の指定。例えば0〜128までの場合は --sport 0:128でよい。

--destination-port,--dport [!] [port[:port]]
送信先ポートまたはポート範囲の指定。例えば0〜128までの場合は --dport 0:128でよい。

-m state の場合に有効なマッチングの拡張。

--state 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のスクリプトをのせています。 参考にしてください。

もどる


Kenji Ohmori
Last modified: Tue May 31 01:58:39 JST 2005