iptablesにムカつく私
コマンドラインは好きだけど、わけわからんコマンド・インターフェースは嫌いだ。iptablesは相当にひどい水準。
[hiyama@microapplications ~]$ sudo iptables -L INPUT --line-numbers -n
Chain INPUT (policy DROP)
num target prot opt source destination
1 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED
2 ACCEPT all -- 0.0.0.0/0 0.0.0.0/0
3 ACCEPT icmp -- 192.168.10.100 0.0.0.0/0
4 ACCEPT udp -- 0.0.0.0/0 0.0.0.0/0 udp spts:1024:25534 dpt:53
5 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 state NEW tcp spts:1024:65534 dpt:53
6 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 state NEW
... (省略)
1番と2番に注目すると;
- state が RELATED,ESTABLISHED ならば ACCEPT
- なんでもかんでも ACCEPT
と解釈できる。チェーン内では、ルールは番号順に実行(検査)されるから、2番ですべてのパケットが受理されてしまう。と、この表示をみる書限りそう思える。
が、実際は違う。-v (--verbose)オプションを付ければ分かることは分かるんだが:
- 2番のルールはローカル・ループバック・インターフェース(lo)入力にだけ適用される。
in/out条件はものすごく重要な情報なのに、デフォルトでは表示しない。in/outネットワークインターフェイスごとのルール表示も(僕が探した限り)できないようだ。ルールがどのインターフェース(両端)に適用されるかを無視してフラットに表示するって、混乱するだろうよ。
ルール番号はチェーンごとにシーケンシャルだが、異なるインターフェースに対するルールを混ぜて連番を付ける。実装がそうなっているからって、UIにそのまま露出させるこたーない。なんか表示に工夫があってもいい。つうか、表示コマンドは別(iptables-showとか)にして、検索や表示形式指定をねんごろにサポートスべきじゃないのか。
それと、範囲指定に':'と'-'が混じっているのにもスゲー腹がたった。':'は addr:port という使い方もされている。いくらなんでもヒドすぎないか、同じコマンド内なのに。
次に、テーブルとチェーンという概念についてだが; テーブルは、概念的にはパケット操作の種類に対応する。これは悪くはない。チェーンは、パケットが通過する経路の空間的構造を形成するから分かりやすい。が、テーブルとチェーンとの関連がわかりにくい。いっそ、テーブルという概念をなくすことも一案かもしれない(ネーミングがiptablesなのにテーブルがない、つうのもナンだが)。
テーブルの種類を、チェーンにかかる修飾語として使うのはどうだろう。filterチェーン、natチェーンのように。種類(filter, nat, mangle)が違えばチェーンに同じ名前を付けてもいい。つまり、種類=テーブル名がチェーン名の名前空間となっている。INPUT filteチェーンとかFORWARD natチェーンと呼ぶ; 逆順で、filter INPUTチェーン、nat FORWARDチェーンがいいかな? filter:INPUT とか filter/INPUT とか表現してもいいかも。
いずれにしても、チェーンが中核概念であり、チェーンを繋いで、入り口から出口にむかう経路を作る。経路の上にはルール群が配置される。いきなりルール群から長い経路全体を作るのは大変だから、チェーンというモジュール単位で繋ぐ。チェーンは、ルール群の構造化の単位。プログラムが関数や手続きで構成されるのと同じ。
- 処理のアトム(構成素、単位)はルール
- 制御構造が順序(シーケンス)とターゲット(アクション)
- 手続きに対応するのがチェーン
- テーブルは用途ごとの名前空間
- 実行時には、チェーンが連接されて経路が作られる。
- 個々のパケットは、経路上のルールで操作されルーティングされる。
なんつーか、概念レベルのモデルをすっ飛ばして実装を露出させる、それをまた個別ケースごとに経験論と現象論で対処している、ってその感じが、僕の神経をいたく逆なでする。こういうところは、[UL]*x の悪い文化だ。