PCルーター構築完全マニュアル(iptables編)



サンプルは別ページに新規作成、解説つき。

更新履歴
[ 2002.01.07 ] [ 2002.01.14-1 ] [ 2002.01.14-2 ] [ 2002.01.31 ] [ 2002.03.09 ] [ 2002.03.15 ]


ご注意:はっきり言ってしまケロはまだ iptables 初心者です(iptables の歴史を考えれば開発者以外は誰しも初心者)。運用実績も多くはないです。ここで敢えて紹介するのは iptables ユーザー層拡大を目指し、新たな知識の獲得、カン違いの修正などの恩恵を共有するためです。ですので、以下の内容、サンプルは鵜呑みにしてはいけません。また、ipchains サンプルのときと同じですが、これは特別に書き下ろしたもので、運用実績はありません。あくまでサンプルです。(追記: 2002/03/15)最近はさすがに初心者ではなくなったかと(^^;(さらに追記:2003/01/16)いいかげんちゃんとしたルールを見せてみい!つことで、サンプルを更新。サンプルはサイト内の「スクリーンドブランチネットのファイアウォール」にあります。


以下は iptables についてイチから説明するものではないです。主に ipchains を使っていた人のためのもので、主に私が実際にハマったリ、ハマりそうになったり、今もハマっていて抜け出せないポイントについて書いたものです。ipwadm や ipfw だった人でも何とかなるでしょうが、そうでない場合はキツイかも。またパケットフィルタリング自体よく分からないヒトにはただの暗号文です。そういう人は基本的なほかのドキュメントなどで勉強してからがよいでしょう。JF にはうんざりするほどたくさんありますし、しまケロが Linux World 1月号に書いたファイアウォールの記事も入門によいでしょう(宣伝(^^;)。

さて、今回はFAQのように書いていってみようかな(自問自答だけど)。

  • iptables ってなんですか?

    Linux カーネル2.4 標準のパケット操作ツールです。2.2 系標準の ipchains よりメタメタ機能拡張されてます。ただ、ネーミングに主体性がないように感じますね。いいけど。


  • ipchains とどこが違いますか?

    かなり機能拡張されました。最も違うのは NAT 機能です。IPマスカレードの設定の手続きには根本的な変更があります。また、ポートフォワードも手軽にできるようになっています。ipmasquadm ともおさらばです(コレについては、おさらばどころか探しても見つからなかったヒトもいるかも)。フィルタリングに関しては、大筋は似ていて、主なオプションは引き継いでいますが、がらっと変わってしまった部分もたくさんあります。以下で説明します。


  • 組み込みチェインの挙動がおかしいのですが

    これが最も重要です。たとえば ipchains ではこのルーターを通っていくパケットは input, forward, output の全てで検閲されましたが、iptables は違います。通り過ぎるパケットは FORWARD のみで検閲されます。このホストに入ってくる(それ以上フォワードされない)パケットはINPUTで検閲され、このホストで生成されて出て行くパケットが OUTPUT で検閲されます。よく考えれば ipchains より明確です。POSTROUTING, PREROUTING などという NAT 系のターゲットはこれらを理解してから使ったほうがよいでしょう。


  • input チェインにルールが追加できません。

    マニュアルをちゃんと見ましょう。組み込みチェインは INPUT, OUTPUT, FORWARD と大文字になりました。で、ユーザー定義チェインは小文字で書くのが美しい、ということになってるそうです。


  • forward チェインに MASQ ターゲットを指定したら怒られました。IPマスカレードはどうすればよいのでしょう!

    マニュアルを見てよ。MASQ というターゲットはなくなりました。それより、IPマスカレードは iptables では全く別の手続きで設定するようになったのです。つまり、以前のように forward チェインにターゲットを指定するのではないということです。後でも述べますが、例えば以下のようにします。
    iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
    
    " -t nat " というのが、従来のパケットフィルタリングとNAT機能をごっちゃにしていた状況を打開するキーワードです。 POSTROUTING というチェインはパケットが出て行く最後に評価されます。つまりこれは「インターフェース ppp0 から出ていくパケットは何もかもマスカレード」という意味で、これで幸せになれます。


  • -y オプションを指定しても怒られます

    マニュアル読めっつてんだろコラ! -y はなくなって --syn となりました。否定の ! はそのまま使えます。で、 SYNフラグだけでなく、他のものもチェックできるようになりました。それは SYN ACK FIN RST URG PSH ALL NONE です。パケットについて熟知しているヒトには嬉しいお知らせですね。


  • --syn を使ってみました、でもエラーです。

    -p tcp とあわせて用い、しかも直後に置かねばなりません(たぶん)。つまり、
    -p tcp --syn ...
    
    のように使います。フラグは TCP プロトコルのみでのお話なので当然といえば当然でしょう。ここで憶えてほしいのは、いろいろな拡張オプションはモジュールで提供されているので、 -p tcp --syn のように依存関係を考慮しなければならないオプションが他にもあることです。ただし普通に指定する分にはあまり考えなくてよいようにちゃんと出来ているようです。


  • OUTPUT チェインで -i オプションが使えないのは不便ではないですか?

    お、やっとマニュアルを読みましたね。でも中途半端に読んだのですね。 -i オプションは意味が変わりました。" interface " ではなく、" input interface " です。つまり入力専用になったのです。だから OUTPUT チェインとは組み合わせられません。同様に INPUT と -o もダメです。FORWARD はともにOKです。


  • iptables -A INPUT -p tcp -i ppp0 ! --syn -s XXX.XXX.XXX.XXX 1024: -j ACCEPT はエラーです。なんで?

    XXX.XXX.XXX.XXX XXX のような「アドレス ポート」の書き方はできなくなりました(たぶん)。
    iptables -A INPUT -p tcp -i ppp0 ! --syn -s XXX.XXX.XXX.XXX --sport 1024: -j ACCEPT
    
    のように --sport つきで書きましょう。


  • ログは -l ではないのですね、イマイチ使い方が分かりません。

    こいつは全然変わりました。たとえば
    iptables -A INPUT -i ppp0 -p tcp --syn --dport 12345\
     -j LOG --log-level info --log-prefix 'Packet log TROJ'
    
    のようにします。syslog で用いる形式のレベルと(上の例の info)、出力メッセージが自分で指定できます(上の例の Packet log TROJ)。


  • 「ログに書いてDROP」と一発で指定できるというオプションがあると聞きましたが

    それを忘れちまったのです!どこで見たのかも忘れてしまいました。あるいは私とあなたが同じ夢を見ただけかもしれません。誰か教えてください!


  • 教えましょう。それは夢です。しかし貴殿の夢は
    iptables -N log-and-drop
    iptables -A log-and-drop -j LOG
    iptables -A log-and-drop -j DROP
    
    とかいうチェインでも作れば叶うでしょう(謎の紳士より)。

  • ipchains とログのフォーマットが全然違います。スクリプトで処理していたので、困ります。

    オレに言うな!私も困っているのです。


  • LAN内のプライベートアドレスを持ったサーバーを公開したいのですが。

    ほう、いい度胸ですね、どうなっても知りませんよ、ひひ。
  • iptables -A PREROUTING -t nat -p tcp -i ppp0 --dport 80 -j DNAT --to 192.168.100.1:80
    
    のようにするとポートフォワードできるので簡単に出来ます。こうすると、LAN 内の 192.168.100.1 が WEB 鯖として公開できます。宛先は XXX.XXX.XXX.XXX:XXX のように指定する点に注意しましょう。

  • 他に何かいいことはありますか

    はい、最近ノートPC(新品)を買いました。スペックがよろしいので快適です。


  • あの、そういうことではないのですが.....

    わかってますよ。えと、インターフェースが無効なときはエラーでなく、無視してくれます。これはADSL接続には大変うれしいことです。ppp0 というインターフェースは接続して初めて実在し、接続していないときは実在しないため、以前の ipchains では -i ppp0 とか書いておくとエラーになりました。iptables なら無造作に書いておいていいので幸せになれます。

    あと、とにかくパケットを細かく検査できるので、簡易パケットキャプチャツールのようにも使えそうです(特に意味は無いけど)。


  • 安定していますか?セキュリティホールが心配です。

    こういったツールに本来の安定はありません。それを承知の上で使うべきです。セキュリティの何もかもをたった一つのツールに託す使い方はあまりよろしくありません。不具合はすぐにフィックスされます。その間はその他のツールたちに任せて、迅速に対処すればよいのです。また、テスト運用時もそうです。こちらはテストでも攻撃者にとっては格好の餌食です。


  • CodeRed や Nimda のパケットを破棄することはできますか?(2002.01.07)

    フィルタリングを行うツールは、通常パケットのデータ部まで詳細に調べてどうこうするということはしません。ipchainsなどもそうです。それらはパケットキャプチャツールにおまかせするのが一般的でした。しかし、iptablesではstringモジュールというものを使うことによってデータ部の文字列を検査することができます。詳しくは
    [ ここ ]に書いてあります。CodeRed や Nimda が送りつけてくるパケットには cmd.exe や default.ida?NNNN... といった決まった文字列が入っていますので、これにマッチしたら破棄とすればよいのです。
    -m string --string "default.ida"
    
    (追記: 2002/03/15)ホントはこの方がイイ
    -m string --string "NNNNNNNN"
    -m string --string "AAAAAAAA"
    
    とすればマッチします(安易すぎますが、これは単なる例だからよいのです)。

    また
    [ ここ ]に書いてありますが、なんと Snort のルールから iptables のルールを生成するツールなるものが存在します。
    [ http://www.stearns.org/snort2iptables/ ]
    Nimda や CodeRed だけでなく、さまざまな凶悪パケットを選択して料理することができるのです。


  • サンプルが動きません。検証してくれませんか?(2001.01.14)

    むむむ.....しかし、現在のサンプルは動くはずです。まあ、やっと実験環境が整ったのでぼちぼちちゃんとやります。赤帽嫌いとしては本運用以外に赤帽機を持つのはかなりの苦痛なので、ここまで引っ張ってきました。ご理解ください。みんながみんなカーネル2.4の安定版を出してくれるといいんですけど。


  • 最新の iptables を使うにはどうしたらよいですか?(2001.01.31)

    おおお、こんな重要なことを言うのを忘れていました。スマンスマン。でも、ここまで誰も聞かなかったというのは、そんな要望がないということか、みんなトーゼン知ってたかのどちらでしょうか?

    どっちにしても、この前説明した string モジュールだって、当然パッチをあてなければいけないわけで、そのとき説明しなきゃいかんでしたねえ。-m string なんて使えないぞ!と怒られそうです(汗)。まあ、いいや。
    [ 開発元 ] から、樽玉をもってきて展開して、カーネルにパッチを当てて、それからパッケージを作る、という雰囲気です。展開したディレクトリの中の INSTALL を読んでその通りにすればよいです。当然、カーネルのバージョンが対応してなければだめです。それから、iptables のようなツールはただ新しけりゃいいってもんじゃない、ことも頭に入れておきましょう。革新的、実験的なコードはバグの元でもあるのです。iptables の開発者は気合が入ってますので、逆に怖い部分もあるかもれません。しかし、それでもとにかく最新版を追う、というのはiptables 愛好家の心意気というものでしょう。






トップページ