B.1. モジュールロードのトラブル

モジュールのロードで問題にぶつかることがあるかもしれない。例えば、そのような名前のモジュールはないという旨のエラーなどだ。このエラーは下記のような表示となるだろう:

insmod: iptable_filter: no module by that name found

だが、そんなに心配することはない。そのモジュールはカーネルにスタティックにコンパイルされているのかもしれない。この問題を解決しようとする時に真っ先に検討すべきはこの点だ。そのモジュールが既にロード済みかどうか、あるいはカーネルにスタティックにコンパイルされているかどうかは、そのモジュールの機能を使用するようなコマンドを発行してみれば一目瞭然だ。上記の例ならば、filter テーブルをロードしようとしてもできないはずだ。当該の機能が存在しなければ、filter テーブルは、はなから使えないはずである。filter テーブルが存在するかどうか調べるには以下のようにする:

iptables -t filter -L
   

結果は、filter テーブル内のすべてのチェーンが出力されるか、もしくはエラーになるかのどちらかだ。もし問題がなければ、既にルールを入れてあるかどうかにもよるが、出力は下記のようなものになるはずだ:

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
    

一方、filter テーブルがロードできていない場合には下記の ようなエラーとなる:

iptables v1.2.5: can't initialize iptables table `filter': Table \
     does not exist (do you need to insmod?)
Perhaps iptables or your kernel needs to be upgraded.
    

こうなると事態は少々深刻だ。第一の可能性としては、その機能がカーネルにコンパイルされていない、第二に、そのモジュールが通常のパス上に見つからない、ということを示しているからだ。こうなる原因として考えられるのは、モジュールをインストールするのを忘れたか、モジュールデータベースを更新する depmod -a をやり忘れたか、その機能がスタティックにもモジュールとしてもコンパイルされていないかだ。モジュールがロードされない原因はもちろんこの他にも考えられるが、主なものはこれらだ。これらの問題は簡単に解決できる。最初の原因なら、カーネルのソースディレクトリで make modules_install を実行すればよい (ただしソースがコンパイル済みでモジュールがビルド済みの場合)。 2番目である場合は、depmod -a を 1回実行してから、動くかどうか確かめてみることだ。3番目の問題はここで扱うには少々手に余るので、自分で頭をひねっていただくしかなさそうだ。この件についての詳しい情報は、Linux Documentation Project で見つかるだろう。

iptables 実行時に遭遇するかもしれないもうひとつのエラーは下記 のものだ。

iptables: No chain/target/match by that name
   

このエラーは、そのようなチェーンはない、あるいは、ターゲットまたはマッチがない と告げている。これには膨大な数のファクターが絡んでくるが、一番ありがちなのは、チェーン、ターゲット、マッチのスペルを打ち間違えていることだ。また、利用不可能なマッチを使用しようとした場合にも、このエラーが出る。適切なモジュールがロードされていないか、カーネルにコンパイルされていない、あるいは、iptables がモジュールの自動ロードに失敗したかのいずれかが原因だろう。おしなべて言えば上記の解決策を全部検討してみるべきだが、ルールの中に某かの誤字がないかも見直してみたほうがいい。