iptablesについて

iptablesって、理解すれば簡単な仕組みなんだけど、どうにもこう、前提のお話がすっとんでいてmanページとか読んでもわかりにくい。
いや、書いてるんだけど、こう、なんかわかりにくい。
ので、ちょっとわかりやすくするようなお話をしてみようと思う。

iptablesの用語がたぶん一番わかりづらくしてるんだと思う。
iptablesには重要な用語がいくつかある。

  1. チェイン
    ルールの集合体。
    いろいろなルールをひとまとめにしたもの。
  2. ルール
    いわゆる条件判定。
    対象のパケットが条件にマッチするかどうかを判定する。
  3. ターゲット
    ルールにのっとって判定をして、マッチした場合どうするか、のアクション。

これでもちょっとわかりにくいが、プログラミングしてる人にわかりやすく言えば、チェインは関数、ルールはif文、ターゲットはリターンコードって感じでイメージするとピンと来るはず。

ターゲットは基本として以下のものが用意されている。

ACCEPT — 許可
DROP — 破棄
QUEUE — パケットをユーザ空間に渡す(よくわからん)
RETURN — このチェインの検討を中止して、呼び出し元チェインに戻って、次のルールのチェックへ移行する

で、基本的にiptablesでパケットをごにょごにょしたいときの流れは以下のようになる。

  1. ユーザ定義チェインを作成する
  2. そのチェインにルールを記述する
  3. 設定を有効にする

とってもシンプル。
で、チェインにはデフォルトチェインっていうのがある。
大抵デフォルトはこんな感じ。

# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

上から順に、入力パケットは全部受け入れます、転送パケットは全部受け入れます、出力パケットは全部受け入れます、という意味。
ポリシーってのは、デフォルトのターゲットをどうするかっていうやつ。
デフォルトチェインには初期はなんのルールも記述されておらず、ポリシーACCEPTであるため、てらフリーダム。

そこで、たとえば8080ポートは内部ネットワークからしか使わせないという風にしたい場合を考えよう。

# iptables -N test
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain test (0 references)
target     prot opt source               destination

なんかtestっていうチェインが増えました。
ここにルールをかいていきます。

# iptables -A test -p tcp –destination-port 8080 -s ! 192.168.1.0/24 -j DROP
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain test (0 references)
target     prot opt source               destination
DROP       tcp  — !192.168.1.0/24       anywhere            tcp dpt:http-alt

なんか増えました。
ルールの詳細を見てみましょう。

# iptables -A test -p tcp –destination-port 8080 -s ! 192.168.1.0/24 -j DROP

testチェインに、tcpパケットで、8080ポート宛で、接続元が192.168.1.0/24でないパケットは、DROPターゲットに送ります、という意味。

ただ、この時点ではこのチェインは参照されない。
なぜかというと、外からのパケットはまっさきにINPUTチェインへ飛んでいくからだ。
そこで、INPUTチェインに飛んできたパケットを、testチェインでチェックさせないと、testチェインはあるだけ無駄な子になってしまう。
いうなれば、main関数はすっからかんのまま、新しい関数を作った状態。
なので、呼び出しさせましょう。

# iptables -A INPUT -j test
# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination
test       all  —  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain test (1 references)
target     prot opt source               destination
DROP       tcp  — !192.168.1.0/24       anywhere            tcp dpt:http-alt

こうすると、INPUTチェインに、新しいルールが記述されているのがわかります。
入力パケットはとりあえずtestチェインに渡して、そこで処理してもらうんだぜ、ということです。
で、testチェインで実際にパケットのチェックが行われるということです。

で、ここまでくるとふと思う人はいるでしょう。
testチェインなんて作らないで直接INPUTチェインにかけばいいんじゃね?
そのとおりです。
でもさー。
後でルール変更したいときとか面倒なことになったりするんです。
個人的には、チェインは機能ごとに一まとめでユーザ定義して、各デフォルトチェインからは呼び出しだけを行うようにするのが好ましいと思います。

ということでiptablesの簡単な説明でした。

あとはmanページ読めばわかると思う。

http://www.linux.or.jp/JM/html/iptables/man8/iptables.8.html

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

次のHTML タグと属性が使えます: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>