iptablesでいこう(3.最新兵器)

Netfilter Extensions HOWTO 和訳(風)

更新履歴
[ 2002.02.03 extension の組み込み方概略 ]




Netfilterの拡張機能を用いると IDS 並みかそれ以上のパケット操作が可能となる。ただし、実際の運用に適用するには注意が必要である。例えば、一般公開しているサーバーホストに対してこの機能を用いるのは好ましくない。実験的な試みであるためのバグ、未定義動作が懸念されるからではなく、RFC で定義される動作や、よく知られた動作からかけ離れた動作をする可能性があるからである。これは何も知らないユーザーからすれば、極端に言って「攻撃」並みの迷惑である。その辺を頭に入れておいて欲しい。

まあ RFC 無視というのは M 社では当たり前のことなのだが、「自分も M 社と同じになりたいのか」と言うことで。

もちろん、実験、遊び、あるいは非公開のホストについてはバンバン試してみよう。たのしいぞっ(荒岩)。

と、いうことで、なぜか今回は Netfilter 開発元の Netfilter Extensions HOWTO の和訳風という形式をとる。

「そうか、ついにコミュニティに貢献する気になったか」 「心を入替えたのか?」 「何を企んでいるのか?」

などという声が聞こえてきそうだが、特に意図はなく、つまり自分もよく知らないことが多いので、そうするだけである。なので、基本的に自分がわかりやすい、そして飽きない、眠くならない、わからない言い回しは無かったことにする、といった訳を目指している。また、面白そうな項目しか訳さない。よってとても JF には出せるようなものではないので Linux コミュニティの皆様、許してください。

これらの拡張は標準では組み込まれていない。組み込み方はページの最後に簡単に書いておきましょうね。なお、これらを実際に使った例は別ページで予定しています。

[ 原文 ]


--------------------------------------------------
以下目次は原文、リンク、注は訳者(わし)付与

  Netfilter Extensions HOWTO
  Fabrice MARIE , mailing list netfil-
  ter-devel@lists.samba.org
  $Revision: 1.1 $

  This document describes how to install and use current iptables exten-
  sions for netfilter.
  ______________________________________________________________________

  Table of Contents



  1. Introduction
  2. Patch-O-Matic
     2.1 What is Patch-O-Matic ?
     2.2 Running Patch-O-Matic
     2.3 So what's next ?

  3. New netfilter matches
     3.1 ah-esp patch
     3.2 iplimit patch
     3.3 ipv4options patch
     3.4 length patch
     3.5 mport patch
     3.6 nth patch
     3.7 pkttype patch
     3.8 pool patch
     3.9 psd patch
     3.10 random patch
     3.11 realm patch
     3.12 record-rpc patch
     3.13 string patch
     3.14 time patch
     3.15 ttl patch

  4. New netfilter targets
     4.1 ftos patch
     4.2 IPV4OPTSSTRIP patch
     4.3 NETLINK patch
     4.4 NETMAP patch
     4.5 SAME patch
     4.6 tcp-MSS patch
     4.7 TTL patch
     4.8 ulog patch

  5. New connection tracking patches
     5.1 eggdrop-conntrack patch
     5.2 ftp-fxp patch
     5.3 irc-conntrack-nat patch
     5.4 record-rpc patch
     5.5 snmp-nat patch
     5.6 talk-conntrack-nat patch
     5.7 tcp-window-tracking patch

  6. New IPv6 netfilter matches
     6.1 agr patch
     6.2 ipv6header patch
     6.3 ipv6-ports patch
     6.4 length patch

  7. New IPv6 netfilter targets
     7.1 LOG patch
     7.2 REJECT patch

  8. New IPv6 connection tracking patches
  9. Contributing
     9.1 Contributing a new extension
     9.2 Contributing to this HOWTO


  ______________________________________________________________________

1.  序

うす。この度は netfilter の開発、テスト、バグ報告に莫大な時間を費やし
てくれた皆の衆に感謝感激の雨あられを降らせるサイコーの幸運なのだ。
みんなありがとうよー。

いっとくけど、この文章は Rusty の Linux 2.4 Packet Filtering HOWTO
 .  をしっかり読んで、理解してることが前提だかんな。まだ読ん
でない奴ぁ出直してこい、おとといきやがれ(訳者注:私が言ってるんじゃ
ありませんが、原文でも言っていないかもしれません、天から聞こえてきたもんで
...)。あとな、カーネルのコンパイル、インストールもちゃんとできなきゃだめな
んだかんな。

iptables ディストリビューションはフツーのユーザーは使わない、実験的な意
味合いの、カーネルに正式に組み込むかどうかまだ決まってないような拡張も
含まれてるわけよ。これらはフツーはコンパイルされてないけどな。

ま、この文章の目的はそういった netfilter 拡張部分にとっかかりやすくする
ためにインストールとか基本的な使い方を説明してやろうってわけさ。

(C) 2001 Fabrice MARIE.  Licensed under the GNU GPL.

訳者注:以下カーネルへのパッチの当て方。
    訳しないほうがわかりやすいので原文を参照のこと。

〜 〜 省略 〜 〜

3.2 iplimit patch

Gerd Knorr  の手によるこのパッチは特定ホストあるいは
ネットワークから同時並行で確立する TCP コネクションの数を制限できるように
するための新たなマッチングを与える。


例として、ある1つの IP アドレスからの 同時並行で確立する HTTP コネクショ
ン数を4つに限定してみっか。



     # iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-above 4\
      -j REJECT

     # iptables --list
     Chain INPUT (policy ACCEPT)
     target   prot opt source    destination
     REJECT   tcp  --  anywhere  anywhere     tcp dpt:http flags:SYN,RST,ACK/SYN\
      #conn/32 > 4 reject-with icmp-port-unreachable



あるいは class A ネットワーク全体からのコネクションを同じように制限したいと
きもあるかもね。それならこうだ。


     # iptables -A INPUT -p tcp --syn --dport http -m iplimit --iplimit-mask 8\
      --iplimit-above 4 -j REJECT

     # iptables --list
     Chain INPUT (policy ACCEPT)
     target   prot opt source    destination
     REJECT   tcp  --  anywhere  anywhere     tcp dpt:http flags:SYN,RST,ACK/SYN\
      #conn/8 > 4 reject-with icmp-port-unreachable



Supported options for the iplimit patch are :


o

    [!] --iplimit-above n



o

   --iplimit-mask n


※訳者注:
目からウロコが落ちるようなものではないが、使う機会があるときもありそう。


--------------------------------------------------

3.4 length patch


3.4.  length patch

James Morris  の手によるこのパッチはパケットの
長さに基づいた新たなマッチングを与える。


例としてサイズが 85 バイトよりでかい ping のパケットを破棄するにはこうだ。


     # iptables -A INPUT -p icmp --icmp-type echo-request -m length\
      --length 85:0xffff -j DROP
      # ptables --list
     Chain INPUT (policy ACCEPT)
     target     prot opt source               destination
     DROP       icmp --  anywhere             anywhere           icmp echo-request\
      length 85:65535



Supported options for the length match are :


o

   [!] --length length[:length]


値あるいは範囲でもいい(混在も可)。


値の最小値は 0 最大値は 65535 だかんな、そこんとこ頼んだぜ。


※訳者注:
ちゃんと計画を立てればけっこう使えるかな、保険として入れといてもいいし。


--------------------------------------------------

3.9 psd patch


3.9.  psd patch

Dennis Koslowski  の手によるこのパッチはポートスキャン
を検出するための新しいマッチングを与える。


いちばん簡単な形式だとこんなんでいい



     # iptables -A INPUT -m psd -j DROP

     # iptables --list
     Chain INPUT (policy ACCEPT)
     target  prot opt source    destination
     DROP    all  --  anywhere  anywhere    psd weight-threshold: 21 delay-threshold: 300\
      lo-ports-weight: 3 hi-ports-weight: 1



Supported options for psd match are :


o

   [--psd-weight-threshold threshold]



o

   [--psd-delay-threshold delay]



o

   [--psd-lo-ports-weight lo]



o

   [--psd-hi-ports-weight hi]



※訳者注:
こういうのはチューニングが難しいのね。使いこなすには(誤検知少なくしたり)
結構時間かかるよ。でも、まさに IDS ですねえ。


--------------------------------------------------

3.12 record-rpc patch


3.12.  record-rpc patch

Marcelo Barbosa Lima  の手によるこのパッチは
元のパケットがrpc のポートマッパーから振られてきたもんかどうか、あるいは
ポートマッパーに対しての新たな GET リクエストのパケットかどうかという新た
なマッチングを与える。これは RPC サービスに対する効果的なフィルタリングと
なるわけよ。 


RPC を用いたコネクショントラッキング情報に対してマッチさせるにはこうだ。



     # iptables -A INPUT -m record_rpc -j ACCEPT

     # iptables --list
     Chain INPUT (policy ACCEPT)
     target     prot opt source               destination
     ACCEPT     all  --  anywhere             anywhere



オプションなーし。男らしいだろ?


マッチング情報が出力されないが、ま、心配すんな。このマッチング用の print() 関数
の中身がが空っぽなだけなのだ、わははは。

※訳者注
 おいおい...


     /* Prints out the union ipt_matchinfo. */
     static void
     print(const struct ipt_ip *ip,
           const struct ipt_entry_match *match,
           int numeric)
     {
     }



※訳者注:
なんか、最後に不吉な事が書いてありますね。

ポートマッパは素通し(111番素通しとかね)しといて、その先で捉える、
ってことができるのかな?それなら結構使えそうですねえ。どうかな?
早く実験したいなあ。 print は自分で書いてコンパイルすればいいか。


--------------------------------------------------

3.13 string patch


3.13.  string patch

Emmanuel Roger  の手によるこのパッチは
パケット内のどこかにある文字列にマッチさせるという新たなマッチングを与える。


たとえば、どこかに cmd.exe という文字列を含んだパケットにマッチさせて、
ユーザーランドの IDS(侵入検知システム)に QUEUE するなら、こんな風にできる



     # iptables -A INPUT -m string --string 'cmd.exe' -j QUEUE

     # iptables --list
     Chain INPUT (policy ACCEPT)
     target     prot opt source               destination
     QUEUE      all  --  anywhere             anywhere           STRING match cmd.exe



このマッチングを使うには細心の注意を払ってほしい。多くの人がこのマッチングを
 DROP ターゲットと共に用いて、ワームを遮断する目的で使いたいと考えるが、
これは大きなマチガイである。IDS 回避手続きで破られてしまうだろう。


同様に、多くの人は POST という文字列を含んだパケットを破棄する、とかい
いった手段で、POST や GET といった HTTP の特定の関数を遮断する目的に
このマッチングを使っていたが、理解していただきたいのは、こういった作業
はフィルタリング型プロキシにやらせたほうがよい、ということだ。さらに言
えば POST という語句が含まれた HTML コンテンツは前述の手続きで却下され
てしまう。このマッチングはただ興味深いパケットをさらに解析するためにユ
ーザーランドへ QUEUE することができるようにということで設計されたのであ
る。このようなやり方に基づいた破棄の仕方は、やはりIDS 回避手続きで破ら
れてしまうだろう。


Supported options for the string match are :


o

   --string [!] string


※訳者注
実は

It would be defeated by any IDS evasion method.

の訳に自信がない。上の訳では内容に疑問が残るからだ。
まあ、仮に正しいとして.....

おそらくもっとも「使え」そうなマッチングなのだが、作者のほうでは
ウルサイほど「 IDS のように使うな」と訴えている。つまり、それだけ
そうやって使いたい、使おうと考える人々が多いことを表している。
そんなことをしてもダメで(その上を行かれるから、ということだと思う)
、IDS に任せろとか言っているが、さしあたって既知の自動アタックに
対しては DROP ターゲットも十分使えると思う。ただし、その場合は
必要なパケットも破棄してしまわないように工夫したルールを作成せねば
ならないのは言うまでもない。

--------------------------------------------------

3.14 time patch


3.14.  time patch

Fabrice MARIE  の手によるこのパッチは
パケットの到着あるいは出発(ローカルで生成されたパケット)の
タイムスタンプにマッチさせるという新たなマッチングを与える。


たとえば月曜から金曜の8時から18時に到着したパケットだけを許可
するならこうだ。

訳者注:
公務員パケットかい(^^;



  # iptables -A INPUT -m time --timestart 8:00 --timestop 18:00 --days Mon,Tue,Wed,Thu,Fri -j ACCEPT

  # iptables --list
  Chain INPUT (policy ACCEPT)
  target     prot opt source           destination
  ACCEPT     all  --  anywhere         anywhere        TIME from 8:0 to 18:0 on Mon,Tue,Wed,Thu,Fri



  Supported options for the time match are :


  o

     --timestart value



  o

     --timestop value



  o

     --days listofdays



     o  Mon

     o  Tue

     o  Wed

     o  Thu

     o  Fri

     o  Sat

     o  Sun


訳者注:
鯖の定休日とか作るのにいいかも。xinetd も似たようなことできるし(笑)。

--------------------------------------------------

4.3 NETLINK patch
予定

  4.3.  NETLINK patch

  This patch by Gianni Tedesco  adds a new target
  that allows you to send dropped packets to userspace via a netlink
  socket.


  For example, if you want to drop all pings and send them to a userland
  netlink socket instead, you can do as follows :



       # iptables -A INPUT -p icmp --icmp-type echo-request -j NETLINK --nldrop

       # iptables --list
       Chain INPUT (policy ACCEPT)
       target     prot opt source               destination
       NETLINK    icmp --  anywhere             anywhere           icmp echo-request nldrop



  Supported options for the NETLINK target are :


  o

     --nldrop


  o

     --nlmark 



  o

     --nlsize 



  For more information on netlink sockets, you can refer to the Netlink
  Sockets Tour
  .


--------------------------------------------------

4.6 tcp-MSS patch
予定

  4.6.  tcp-MSS patch

  This patch by Marc Boucher  adds a new target that
  allows you to examine and alter the MSS value of TCP SYN packets, to
  control the maximum size for that connection.


  As explained by Marc himself, THIS IS A HACK, used to overcome
  criminally brain-dead ISPs or servers which block ICMP Fragmentation
  Needed packets.


  Typical usage would be :



       # iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu

       # iptables --list
       Chain FORWARD (policy ACCEPT)
       target     prot opt source               destination
       TCPMSS     tcp  --  anywhere             anywhere           tcp flags:SYN,RST/SYN TCPMSS clamp to PMTU



  Options supported by the tcp-MSS target are (mutually-exclusive) :


  o

     --set-mss value



  o

     --clamp-mss-to-pmtu




--------------------------------------------------



■ extension の組み込み方概略

Netfilter 開発元の CVS リポジトリから最新のものを持ってくる。iptables のバージョンは当然最新の物を使う。iptables を極めようというヒトならカーネルも最新バージョンを使うのは言うまでもないが、開発版は使わなくてよい。

大まかな流れとしては


  1. カーネルソースをバックアップ
  2. カーネルソースにパッチを当てる
  3. カーネルコンフィギュレーションで組み込んだものをモジュールとして有効化
  4. カーネルを再構築
  5. iptables をインストール
  6. 新しいカーネルで再起動
1. 念のためです。 2. iptables のバージョンを新しくした場合は、 iptables のソースを展開したディレクトリに入って hoge# make pending-paches KERNEL_DIR=/usr/src/linux 以下、 /usr/src/linux は読み替えてね、新たに extension を組み込む場合は hoge# make patch-o-matic として、インタラクティブにパッチを当てる。複数のパッチを当てると 不具合が出る可能性があるが、それが怖いなら hoge# make most-of-pom というコマンドを使え、と開発側では言っているが、全リストを表示して こないため、たとえば string モジュール などが出てこないからしようがない。 さらに、extension はひとつだけを選んで、ほかを試したかったら、またカーネルを 作るぐらいのつもりでいろ、とも言っているので、そうしたほうがよいだろう。 3. ふつうのカーネル再構築手順。.config 直書きでない場合は code maturity level options の Prompt for development and/or incomplete code/drivers をオンにすること。 Netfilter の項目で組み込んだヤツをモジュールにする。これに関わる 必要な設定があれば行う。 4. 普通に作業する。 5. hoge# make KERNEL_DIR=/usr/src/linux hoge# make install KERNEL_DIR=/usr/src/linux で OK ユーザー空間に持ってきて何かしようというなら hoge# make install-devel とするとライブラリが提供される。入れておこう。ただし、ip_queue モジュールが 必須である。 6. フツーに


トップページ