5.3. ユーザ空間のセットアップ

まず最初に iptables パッケージのコンパイルの仕方を見ていこう。大切なのは、iptables のコンフィギュレーションとコンパイルの大部分が カーネル のコンフィギュレーションとコンパイルに密接に結びついているということを意識しておくことだ。いくつかのディストリビューションでは、 iptables パッケージがプレインストールされている。例えば Red Hat がそうだが、古い Red Hat のデフォルトでは iptables が無効になっている。有効にする方法は、その他のディストリビューションも含めて、このチャプターの後のほうで、つまびらかにする。

5.3.1. ユーザ空間アプリケーションのコンパイル

まずはともかく、 iptables パッケージを解凍する。ここでは、iptables 1.2.6a パッケージと 2.4 の無垢なカーネルを使用している。通常通り、 bzip2 -cd iptables-1.2.6a.tar.bz2 | tar -xvf - (あるいは tar -xjvf iptables-1.2.6a.tar.bz2 でも、前者とまったく同じ結果が得られが、バージョンの古い tar ではこれは動作しない) で解凍する。パッケージが iptables-1.2.6a という名前のディレクトリに正常に解凍されたはずだ。もっと詳しく知りたければ、iptables-1.2.6a/INSTALL ファイルを読めばいい。コンパイルと、プログラムの動かし方について、かなり役立つ情報が書かれている。

それが終わったら、ここで、どの追加モジュールや追加オプションをカーネルにコンフィギュア/インストールするかが選択できる。ここでは、カーネルへの組み込みが保留されている標準的なパッチのみインストールを検討する。もっと実験的なパッチもまだまだ存在するが、それらは、この後の手順を行ってからでないと手が出せない。

Note

これらのパッチのうちいくつかは極めて実験的であり、インストールするのは得策でない。それでも、この行程でインストールするものの中には、非常に興味深いマッチやターゲットもある。恐れずに、見るだけでも見てみようではないか。

実行するには、 iptables パッケージのルートディレクトリで、こういったことを行う:

make pending-patches KERNEL_DIR=/usr/src/linux/
    

変数 KERNEL_DIR には、カーネルソースのある場所を指定する。通常 /usr/src/linux/ となるが、異なっているかもしれない。おそらく、カーネルソースの所在はあなた自身が一番よく知っているのではなかろうか。

上記のコマンドは、何らかの形でカーネル内に入り込んでゆく一部のパッチをインストールするよう、お伺いを立てる。 Netfilter の開発陣がカーネルに加えようとしているパッチや追加機能はまだまだあるが、それらに辿り着くのはなかなか骨が折れる。そういったものをインストールするひとつの方法は、下記のようにすることだ:

make most-of-pom KERNEL_DIR=/usr/src/linux/
    

上記コマンドは、 Netfilter 界で patch-o-matic と呼び称せられるパーツをインストールするよう、お伺いを立てる。ただし、カーネルに不具合を起こす危惧のある突飛なパッチはスキップされる。「お伺いを立てる」 と書いている点に注目してほしい。なぜか。それが、まさにこれらのコマンドがすることだからだ。カーネルソースに何か変更を加える場合、実行の前に確認を求めてくるのだ。 patch-o-matic の全部をインストールするには、以下のコマンド:

make patch-o-matic KERNEL_DIR=/usr/src/linux/
    

実行する前に、各パッチのヘルプをよく読むこと。或るパッチは、他のパッチを壊してしまうこともあるし、 patch-o-matic やそれ以外のパッチとの組み合わせによってはカーネルを破壊してしまうこともある。

Note

カーネルにパッチを加えるつもりがなければ、上記の手順はまったく無視してもらっても構わない。必須ではないわけだ。それでも、patch-o-matic の中には、一見に値する本当に興味深いものもあるので、コマンドを実行して、そこに何が含まれているか見てみるのも悪くないだろう。

ここまでやれば、インストールの pach-o-matic 部分は完了。カーネルソースに追加した新しいパッチの有効となった、新しいカーネルをコンパイルする環境が整った。さっき追加したパッチは今のコンフィギュアオプションにはまだ記述されていないはずなので、カーネルをもういちど configure するのを忘れずに。ただし、できれば、ユーザ空間の iptables プログラムをコンパイルするまで、カーネルのコンパイルは待っていただきたい。

ユーザ空間のアプリケーション iptables を、ここでコンパイルする。 iptables をコンパイルするには、こういうシンプルなコマンドを発行する:

make KERNEL_DIR=/usr/src/linux/
    

これでユーザ空間アプリケーションはきちんとコンパイルされたはずだ。うまくいかない場合は、自分で解決するか、Netfilter メーリングリスト に投稿してみよう。 Netfilter メーリングリストなら、トラブルの解決を助けてもらえるチャンスがある。 iptables のインストール時に問題が起こることはあまりないので、うまく動かなかったとしてもパニックに陥らないでほしい。理論的に考察してどこに間違いがあるか探すか、誰か助言してくれる人を見つけよう。

すべてうまくいったら、もうバイナリをインストールする準備が整った。インストールを実行するには下記のコマンドを発行:

make install KERNEL_DIR=/usr/src/linux/
    

うまくいけば、今やすべてはプログラムとして動いてくれるはずだ。ユーザ空間アプリケーション iptables に加えた変更を利用するには、まだやっていないならここでカーネルとカーネルモジュールを再コンパイルしなくてはいけない。ユーザ空間アプリケーションをソースからインストールするためのより詳しい情報が欲しければ、ソースに含まれる INSTALL ファイルを見てみよう。インストールに関する情報が充実している。

5.3.2. Red Hat 7.1 でのインストール

Red Hat 7.1 には、Netfilter と iptables を組み込んだ 2.4 カーネルがプレインストールされている。 iptables を動かせるだけの基本的なユーザ空間プログラムと設定ファイルも含まれている。しかし Red Hat 陣は、下位互換の ipchains モジュールを使用することによって、それら一切を無効化してしまっているのだ。うっとうしい話だ。おかげで、なぜ iptables が動かないのか、という質問がそこらじゅうのメーリングリストで飛び交っている。そこで、 ipchains モジュールを殺して iptables をインストールする方法を、ざっとさらっておくことにする。

Note

Red Hat 7.1 にデフォルトインストールされているユーザ空間アプリケーションは、悲しくなるほどバージョンが古い。 iptables を本気でいじりたいのなら、新しいバージョンのアプリケーションをコンパイルして、カスタムカーネルの再構築・インストールを行うことをお勧めする。

まずはともかく、 ipchains モジュールが以後起動しないよう無効にしておかなくてはならない。それには /etc/rc.d/ ディレクトリ下のいくつかのファイル名を変える必要がある。以下のコマンドで行える:

chkconfig --level 0123456 ipchains off
    

これによって、/etc/rc.d/init.d/ipchains スクリプトを指す全てのソフトリンクの名前が K92ipchains に変わる。ファイル名の最初の文字は、デフォルトでは S で、そのスクリプトを start せよ、と init スクリプトに伝える。それを K に変えることにより、反対に、サービスを kill せよ、または、起動していない場合でも起動しなくていい、と伝えられる。これで、 ipchains サービスが将来再び起動することはなくなった。

しかし、現在既に作動中のサービスを止めるには、コマンドがもうひとつ必要。作動中のサービスに働きかける service コマンドだ。 ipchains サービスを止めるには下記のコマンドを発行する:

service ipchains stop
    

これでやっと iptables サービスが開始できる。まず、どの runレベル で起動させるか決めなくてはならない。通常は runレベル 2、3、5 だ。これらの runレベルは以下の目的に使われる:

以上の runレベルiptables を有効にするには、下記のコマンド:

chkconfig --level 235 iptables on
    

上記コマンドは、runレベル 2、3、5 で iptables サービスを起動させることになる。もし他の runレベルiptables サービスを起動したいなら、その runレベルを指定して同様のコマンドを発行する。しかし、これ以外の runレベルは使ってはいけないので、そうする必要もない。レベル 1 はシングルユーザモードであり、マシンがおかしくなった場合などに使うレベル。レベル 4 は使われていないはず。[訳者による修正: レベル 0 はコンピュータをシャットダウンする時で、レベル 6 はコンピュータを再起動する際にだけ使われる]。

iptablesサービスを活動状態にするには、下のコマンドを走らせればいい:

service iptables start
    

iptables スクリプトには、ルールはまだひとつも書かれていない。 Red Hat 7.1 のコンピュータでルールを追加するには、ふたつの方法がある。まず、 /etc/rc.d/init.d/iptables スクリプトを直接編集する方法。これには望まざる副作用があって、 RPM で iptables パッケージをアップデートすると、ルールが全部消されてしまう。もうひとつは、ルールセットをロードしてから iptables-save コマンドで保存し、それを rcスクリプトで自動的にロードさせる方法だ。

それではまず最初に、 iptables の init.d スクリプトにカット & ペーストして iptables を設定する方法を解説する。コンピュータがサービスを起動したときに読み込まれるようルールを追加するには、start) セクションか start() 関数にルールを記述する。 start) セクションにルールを記述する場合には、start) セクション内の start() 関数を無効化しておくことを忘れずに。また、コンピュータがシャットダウンする時、あるいは iptables を必要としない他の runレベルに移行する際に何をすべきかを stop) セクションに書いておくのも忘れてはいけない。さらにまた、 restart) セクションと condrestart) セクションの点検も忘れないように。心しておくべきは、こうした変更は、例えば Red Hat Network でパッケージの自動アップデートが行われたりすると、全部帳消しになってしまうということ。 iptables を RPM でアップデートした場合も同じだ。

2 番目の設定方法は、以下の手順を踏む: まず初めに、あなたの望む内容で、シェルスクリプトにルールセットを書くか、 iptables で直接ルールセットを作る。少しはテストもしなくてはいけない。バグがなく、問題なく動作する設定に行き着いたら、 iptables-save コマンドを使う。 iptables-save > /etc/sysconfig/iptables のように普通に使うも良し。このコマンドは /etc/sysconfig/iptables ファイルにルールセットを保存する。それ以後は、rc.diptables スクリプトがこれを自動的に読み取って、ルールセットをリストアしてくれる。もうひとつの方法は、service iptables save。これも /etc/sysconfig/iptables にスクリプトを自動的に保存してくれる。次回コンピュータをリブートした際には、 rc.diptables スクリプトが、 iptables-restore コマンドを使用して保存ファイル /etc/sysconfig/iptables からルールセットをリストアする。これらふたつのやりかたをごちゃ混ぜにしてはいけない。かち合って、ファイヤーウォール設定を台無しにしてしまうだろう。

ここまでの行程が終われば、インストールされている ipchainsiptables をアンインストールできる。なぜ iptables をアンインストールするかといえば、プレインストールの古い iptables と、新しいユーザ空間 iptables アプリケーションを混在させたくないからだ。この行程が必要なのは、 iptables をソースパッケージからインストールする場合だけだ。新旧のパッケージがごちゃ混ぜにならないケースも珍しくはない。というのは、 RPM ベースのインストールではファイルが通常とは違う場所にインストールされるため、新たに iptables をインストールしても上書きされないからだ。アンインストールを実行するには下記:

rpm -e iptables
    

もう使うことのない ipchains をそこらに転がしておく道理はないだろう。古い iptables でやったのと同様にして削除できる:

rpm -e ipchains
    

既にソースインストールの手順に従って iptables はアップデートしてあるだろうから、これにて作業は完了。古いバイナリ、古いライブラリやインクルードファイルは、きれいさっぱりなくなっているはずだ。