iptables
iptablesは、Linuxに実装されたパケットフィルタリングおよびネットワークアドレス変換 (NAT) 機能であるNetfilter(複数のNetfilterモジュールとして実装されている)の設定を操作するコマンドのこと (from iptables - Wikipedia) iptablesでできること(例)
ブロードバンドルータ(NAT装置)の自作
ファイアーウォールの自作
IPベースのロードバランサの自作
iptablesの仕組み
以下のサイトがわかりやすかった
上記サイトにも書いてあるが、「テーブル」「チェイン」「フィルタ」という3階層の構造を意識してみるとうまく理解できる
ルールを記述する順番で全く違う意味のルールになる
iptablesのルールはマッチした時点でルールの評価が行われてパケットの処理が行われる
記述順については以下のページがわかりやすかった
モジュールという仕組みでマッチする条件を拡張することができ、デフォルトでさまざまなモジュールが存在する
iptablesの例
filterテーブルの詳細を表示する
-L にくわえて -v をつける
code:sh
$ sudo iptables -vL -t filter
Chain INPUT (policy ACCEPT 78620 packets, 20M bytes)
pkts bytes target prot opt in out source destination
814K 327M ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
Chain FORWARD (policy ACCEPT 273 packets, 17678 bytes)
pkts bytes target prot opt in out source destination
6646 2653K ACCEPT all -- any any anywhere anywhere state RELATED,ESTABLISHED
63 5292 DROP all -- br0 eth0 anywhere anywhere
Chain OUTPUT (policy ACCEPT 259K packets, 255M bytes)
pkts bytes target prot opt in out source destination
ブリッジのスレーブを指定する
例として、br0がマスターで、tap0 eth1 がスレーブとして存在する場合
eth1 からはいってきたパケットはフォワードしたいが tap0 からはいってきたパケットは破棄したい場合、 -i br0 とすると、eth1 からはいってきたパケットも破棄してしまう
こういうときは physdev モジュールを使用する
code:sh
$ sudo iptables -A FORWARD -m physdev --physdev-in eth1 -j ACCEPT # eth1 からはいってきたパケットはフォワードする
$ sudo iptables -A FORWARD -i br0 -o eth0 -j DROP # eth1 以外の br0 のスレーブからはいってきたパケットは破棄する
$ sudo iptables -vL -t filter
Chain FORWARD (policy ACCEPT 85 packets, 23845 bytes)
pkts bytes target prot opt in out source destination
90 7153 ACCEPT all -- any any anywhere anywhere PHYSDEV match --physdev-in eth1
13 1092 DROP all -- br0 eth0 anywhere anywhere