6.6. ユーザ定義チェーン

パケットが例えば filter テーブルの INPUT チェーンにいる時に、そこから同じテーブル内の別のチェーンへ飛ばす jump ルールを指定することができる。ジャンプ先のチェーンはユーザ定義チェーンでなければならず、 INPUTFORWARD のようなビルトインチェーンでは駄目だ。ルールをチェーンの中で指し示すポインタだと考えると、このポインタは通常、ルールから次のルールへ、上から下へと、然るべきターゲットに行き当たるかメインチェーン (例えば FORWARDINPUT など) の終点に行き着くまで移動していく。終点に到達した場合には、当のビルトインチェーンのデフォルトポリシーが適用される。

マッチしたルールがジャンプ定義によって他のユーザ定義チェーンを指していた場合には、ポインタは指定されたチェーンに飛び移り、そのチェーンを上から下へと進行していく。例として、上図のルール 3 からチェーン 2 へのジャンプするところを見ていただきたい。パケットがルール 3 にマッチしたとして、そこで指定されていたジャンプ/ターゲットが、パケットをチェーン 2 へ送ってさらなる審査を行えという指示だったとしよう。

Note

ユーザ定義チェーンには、チェーンの末尾に達した時に適用するデフォルトポリシーを指定することはできない。それが可能なのはビルトインチェーンだけだ。ただし、そのユーザ定義チェーン内のどのルールにもマッチしなかったパケットを捕まえるルールを末尾に書いておき、それをデフォルトポリシーのように作用させれば、この制限に対処することはできる。ユーザ定義チェーンでいずれのルールもマッチしなかった場合、規定の動作では、元のチェーンへ舞い戻ることになっている。上の図で言えば、ルールの執行はチェーン 2 から、チェーン 1 のルール 4 へ、つまり、チェーン 2 の執行のきっかけとなったルールのすぐ下のルールへと戻ることになる。

ユーザ定義チェーン内では、順々にひとつずつルールが審査されていき、それが終わるのは、いずれかのルールにマッチした時か (この場合、ターゲットによっては処理がそこで終了する場合とさらに続く場合がある)、ユーザ定義チェーンの終端に達した時だ。ユーザ定義チェーンの終端に達した場合には、パケットは、このジャンプをトリガーしたチェーンへ戻される。トリガーするチェーンは、別のユーザ定義チェーンでもいいしビルトインチェーンでもいい。