8.2. restoreの欠点

既に脳裏にこんな疑問が浮かんだ読者もいるかもしれない。 iptables-restore でスクリプトの類は扱えるのか? 答は、今のところノーだ。おそらくは将来もできないだろう。これが iptables-restore の不備な点であり、設定ファイルから広範な事柄を行うことはできない。例えばあなたが IPアドレスを動的に割り当ててもらっているとしよう。コンピュータが起動する毎にこのダイナミック IP を読み取って、スクリプトの中で利用したいとしたら? iptables-restore では事実上不可能だ。

ひとつの打開策として可能性があるのは、スクリプト中で利用したい値を把握するために小さなスクリプトを用意して、特定のキーワードで iptables-restore ファイルを sed し、小スクリプトによって把握しておいた値に置き換える方法だ。この時点で置き換え結果をテンポラリファイルに保存し、それを iptables-restore でロードする。だがこのやり方にも問題は多い。あなたがリストア用スクリプトに書いておいた置き換え対象のキーワードは、 iptables-save を使用したらすべて削除されてしまう。だから、あなたはもう iptables-save コマンドをろくに使えなくなってしまうのだ。解決策としてはあまりにも不格好だ。

次に考えられるのは、既に述べた例の方法だ。つまり、ルールを iptables-restore のフォーマットで吐き出すようなスクリプトを作成し、その出力を iptables-restore の標準入力に渡すというやり方である。極めて大きなルールセットを扱う場合には、iptables コマンドを直接使うよりもこちらのほうが適切といえるだろう。iptables コマンドには、当チャプターの冒頭でも述べたように、非常に大きなルールセットを登録する時に多くの CPU パワーを消費する悪い癖があるからだ。

他に、先に iptables-restore スクリプトをロードしておいてから、動的ルールを必要箇所に追加で挿入するシェルスクリプトを走らせるという方法も考えられる。だが、こちらもたいして格好が良くなったとはいえない。 iptables-restore は、 IPアドレスが動的割り当ての場合や、設定オプションに応じて振る舞いを変えたいようなケースには、元来、不向きにできているのだ。

iptables-restore および iptables-save のもうひとつの欠点は、このドキュメントの執筆時点でだが、完璧には機能しないケースがあるということだ。これらのツールをまだあまりたくさんの人たちが使っていないために、それだけバグを発見する機会も少ない。そのせいで、一部のマッチやターゲットが正常に挿入されず、予想外の奇妙な挙動を引き起こす場合がある。しかし、こうした問題があってもなお、僕は iptables-restoreiptables-save の利用を強くお勧めする。ツールに扱い方が分からないような極端なターゲットやマッチでも使っていない限り、ほとんどのルールセットでは絶大な効果を発揮してくれるはずだ。