ipf(5) FreeBSD 一般コマンドマニュアル

ipf

前のページ 上に戻る 次のページ

ipf



解説

       ipf のルールファイルは、どんな名前でも良く、標準入力でもか
       まいません。カーネル内部のフィルタリストを表示する と き、
       ipfstat は解釈可能なルールを出力しますので、この出力を ipf
       への入力としてフィードバックするのに使えます。よって、入力
       パケットに対する全フィルタを除去するためには、次のようにし
       ます:

       # ipfstat -i | ipf -rf -


文法

       ipf がフィルタルール構築に使用するフォーマットは、 BNF  を
       使った文法で次のように示すことができます:

       filter-rule = [ insert ] action in-out [ options ] [ tos ] [ ttl ]
                  [ proto ] [ ip ] [ group ].

       insert    = "@" decnumber .
       action    = block | "pass" | log | "count" | skip | auth | call .
       in-out    = "in" | "out" .
       options   = [ log ] [ "quick" ] [ "on" interface-name [ dup ] [ froute ] ] .
       tos  = "tos" decnumber | "tos" hexnumber .
       ttl  = "ttl" decnumber .
       proto     = "proto" protocol .
       ip   = srcdst [ flags ] [ with withopt ] [ icmp ] [ keep ] .
       group     = [ "head" decnumber ] [ "group" decnumber ] .

       block     = "block" [ return-icmp[return-code] | "return-rst" ] .
       auth    = "auth" | "preauth" .
       log  = "log" [ "body" ] [ "first" ] [ "or-block" ] [ "level" loglevel ] .
       call = "call" [ "now" ] function-name .
       skip = "skip" decnumber .
       dup  = "dup-to" interface-name[":"ipaddr] .
       froute    = "fastroute" | "to" interface-name .
       protocol = "tcp/udp" | "udp" | "tcp" | "icmp" | decnumber .
       srcdst    = "all" | fromto .
       fromto    = "from" [ "!" ] object "to" [ "!" ] object .

       return-icmp = "return-icmp" | "return-icmp-as-dest" .

       object    = addr [ port-comp | port-range ] .
       addr = "any" | nummask | host-name [ "mask" ipaddr | "mask" hexnumber ] .
       port-comp = "port" compare port-num .
       port-range = "port" port-num range port-num .
       flags     = "flags" flag { flag } [ "/" flag { flag } ] .
       with = "with" | "and" .
       icmp = "icmp-type" icmp-type [ "code" decnumber ] .
       return-code = "("icmp-code")" .
       keep = "keep" "state" | "keep" "frags" .
       loglevel = facility"."priority | priority .

       nummask   = host-name [ "/" decnumber ] .
                "inforep" | "maskreq" | "maskrep"  | decnumber .
       icmp-code = decumber | "net-unr" | "host-unr" | "proto-unr" | "port-unr" |
                "needfrag" | "srcfail" | "net-unk" | "host-unk" | "isolate" |
                "net-prohib" | "host-prohib" | "net-tos" | "host-tos" |
                "filter-prohib" | "host-preced" | "cutoff-preced" .
       optlist   = "nop" | "rr" | "zsu" | "mtup" | "mtur" | "encode" | "ts" |
              "tr" | "sec" | "lsrr" | "e-sec" | "cipso" | "satid" | "ssrr" |
              "addext" | "visa" | "imitd" | "eip" | "finn" .
       facility = "kern" | "user" | "mail" | "daemon" | "auth" | "syslog" |
               "lpr" | "news" | "uucp" | "cron" | "ftp" | "authpriv" |
               "audit" | "logalert" | "local0" | "local1" | "local2" |
               "local3" | "local4" | "local5" | "local6" | "local7" .
       priority = "emerg" | "alert" | "crit" | "err" | "warn" | "notice" |
               "info" | "debug" .

       hexnumber = "0" "x" hexstring .
       hexstring = hexdigit [ hexstring ] .
       decnumber = digit [ decnumber ] .

       compare = "=" | "!=" | "<" | ">" | "<=" | ">=" | "eq" | "ne" | "lt" |
              "gt" | "le" | "ge" .
       range     = "<>" | "><" .
       hexdigit = digit | "a" | "b" | "c" | "d" | "e" | "f" .
       digit     = "0" | "1" | "2" | "3" | "4" | "5" | "6" | "7" | "8" | "9" .
       flag = "F" | "S" | "R" | "P" | "A" | "U" .

       この文法は、可読性のためにいくぶん簡略化しています。この文
       法にマッチする組み合わせであっても、意味をなさないためにソ
       フ トウェアが許可しないものがあります (非 TCP パケットに対
       する tcp flags など)。


フィルタルール

       「最短」かつ有効なルールは (現在のところ) 無動作と次の形式
       です:
              block in all
              pass in all
              log out all
              count in all

       フィルタルールは順番通りにチェックされ、最後にマッチしたル
       ールがパケットの運命を決めます (例外: 後述 quick オプ ショ
       ンを参照)。

       デフォルトでは、フィルタはカーネルのフィルタリストの最後に
       インストールされます。ルールの前に @n を付けると、現在のリ
       ス トの n 番目のエントリとして挿入するようになります。これ
       は、現在有効なフィルタのルールセットを修正したりテストする
       場合に有用です。更なる情報は ipf(1) を参照してください。


アクション

       アクションは、フィルタルールの残りの部分にパケットがマッチ
       する場合に、そのパケットをどのように扱うのかを示します。各
              す。 このタイプとは、ネットワーク到達不可、ポート到
              達不可、権限による禁止のいずれかです。指定方法 は、
              return-icmp または return-icmp-as-dest の直後に、タ
              イプに関連する ICMP コードを括弧で括るというもの で
              す。例えば
                      block return-icmp(11) ...

       と すると、Type-Of-Service (TOS) ICMP 到達不可エラーを返し
       ます。

       pass   このパケットを、そのままフィルタを通過させるよう に
              印を付けます。

       log     こ の パケットのログを取ります (後述のロギング節参
              照)。パケットがフィルタを通過可能か否かには、影響を
              与えません。

       count   このパケットを、フィルタのアカウンティング統計に含
              めます。パケットがフィルタを通過可能か否かには、 影
              響 を 与 えません。統計は ipfstat(8) にて閲覧可能で
              す。

       call   このアクションは指定されたカーネル内関数を呼び出 す
              た めに使用されます。カーネル内関数は、特定の呼び出
              しインタフェースを満す必要があります。カスタマイ ズ
              し たアクションとセマンティクスを実装し、利用可能な
              アクションを補うことができます。知識があるハッカ ー
              が 使用する機能であり、現在のところ文書化されていま
              せん。

       skip <n>
              フィルタに、次の n フィルタルールをスキップさ せ ま
              す。 ス キッ プされる範囲のルールに挿入または除去が
              あった場合、 n の値は適切に調整されます。

       auth   これにより、ユーザ空間プログラムを実行して正当性 を
              確 認 す るパケット情報を待つことにより、認証できま
              す。プログラムがカーネルに対してパケット通過を許 す
              か否かの実際の フラグを返すまでの間、パケットは内部
              バッファに保持されます。パケット通過を許す前また は
              認 識されない送信元からのパケットをカーネルに落すよ
              う指示する前に、このようなプログラムは、送信元ア ド
              レ スを見るかもしれませんし、ユーザからの (パスワー
              ド等の) ある種の認証を求めるかもしれません。

       preauth
              このクラスのパケットに対しては、更なる明確化のた め
              に 既に認証されたリストを見るべきであると、フィルタ
              に指示します。更にマッチするルールが見付か ら な い
              と、 パ ケットは落とされます (FR_PREAUTH は FR_PASS
              と同じではありません)。更にマッチするルールが見付か
              る と、その結果が使用されます。これが使用される状況

       ます。次のオプションが現在サポートされています:

       log     最後にマッチするルールの場合、パケットヘッダが ipl
              ログに書き込まれます (後述のロギング節参照)。

       quick  フィルタを高速化したり後続のルールよりも優先させ る
              た め に、 ルールの「ショートカット」を許します。パ
              ケットが quick の印が付いたフィルタルールにマッチす
              る 場合、このルールが最後にチェックされるルールにな
              り、「短絡 (short-circuit)」パスにより後続のルー ル
              が このパケットに対して処理されなくなります。 (現在
              のルールが適用された後に) パケットの現在の状態 が、
              パ ケッ ト が通過されるかブロックされるかを決定しま
              す。

              このオプションが指定されな い と、 ル ー ル は 「継
              続(fall-through)」 ルールとされます。つまり、マッチ
              の結果 (ブロック/通過) が保存され、更なるマッチがあ
              るかをみるため処理が継続されます。

       on      マッチ手続きにインタフェース名を組み込みます。イン
              タフェース名は "netstat -i" で表示できます。この オ
              プ ションを使用すると、指定した方向 (入出力) にこの
              インタフェースを通過するパケットに対してのみ、こ の
              ル ールがマッチします。このオプションが指定されない
              と、ルールはこのパケットが置かれたインタフェース に
              依 存せずに (すなわち全インタフェースに) 適用されま
              す。フィルタルールセットは全インタフェースに共通 で
              あ り、各インタフェースに対してフィルタリストを持つ
              のではありません。

              このオプションは特に、単純な IP 詐称 (IP  spoofing)
              に 対する防御として有用です: 指定したインタフェース
              上で、指定した送信元アドレスであるとされる 入 力 パ
              ケッ トのみを通し、他のパケットをログしたりドロップ
              することができます。

       dup-to パケットをコピーし、複写したパケットを指定したイ ン
              タ フェ ースに対して外向きに送ります。また、宛先 IP
              アドレスを指定して、変更することができます。ネッ ト
              ワ ークスニファを使用して、ホスト外でログするために
              有用です。

       to     指定したインタフェースにおいて、パケットを 外 向 き
              キュ ーに移動させます。カーネルのルーティングを回避
              するために使用でき、パケットに対する残りのカーネ ル
              処 理をバイパスするためにも使用できます (内向きルー
              ルに適用された場合)。よって、ルータではなく、フィル
              タ リ ン グハブやスイッチのように、透過的に動作する
              ファイアウォールを構築することがで き ま す。  fas-
              troute キーワードは、このオプションの同義語です。

              ます。この値は、10 進数の整数でのみ与えることができ
              ます。

       proto   特定のプロトコルに対してマッチすることができます。
              /etc/protocols 中の全プロトコル名が認識されますし、
              使 用可能です。また、プロトコルを 10 進数で指定する
              こともできます。これにより、あなた独自のプロトコ ル
              や 新しいプロトコルであるためリストが古くて掲載され
              ていないものに対し、マッチするルールを作成 で き ま
              す。

              TCP または UDP パケットにマッチする、特殊なプロトコ
              ルキーワード tcp/udp を使用することができます。この
              キ ーワードは、同じルールをいくつも書かなくてもよい
              ようにするため、追加されました。

       fromto のキーワードは、 IP アドレス (および省略可能 な
       ポート番号) とマッチさせるために使用されます。送信元と送信
       先の「両方の」パラメータを指定する必要があります。

       IP アドレスの指定方法は、次の 2 つのうちのいずれかです: 数
       値 に よ るアドレス/マスクまたは、ホスト名 mask ネットマス
       ク。ホスト名は、hosts ファイルまたは DNS 中 (設定やライ ブ
       ラリに依存します) の有効なホスト名か、ドット付き数値形式で
       す。ネットワーク指定として特別な記法はありませんが、ネット
       ワ ーク名は認識されます。フィルタルールを DNS に依存させる
       と攻撃の余地を導入してしまうので、勧められません。

       ホスト名には特殊な any が許され、0.0.0.0/0 と認識されま す
       ( 後 述のマスク書式参照)。これは全 IP アドレスにマッチしま
       す。 "any" だけがマスクを暗黙的に指定しますので、他の状 況
       では、ホスト名はマスクとともに指定する必要があります。ホス
       トとマスクに対して "any" を指定できるものの、この言語に お
       いては、意味を持たなくなります。

       数 値フォーマット "x/y" は、 1 のビットが MSB から開始して
       y 個連続するマスクの生成を示します。よって、y の値が 16 で
       あ る 場 合 には、0xffff0000 になります。シンボリックな "x
       mask y" は、マスク y がドット 付 き  IP   表 現、 ま た は
       0x12345678  の形式の 16 進数であることを示します。ビットマ
       スクが示す IP アドレスの全ビットと、パケットのアドレ ス と
       が、厳密にマッチする必要があります; 現在、マッチの意味を反
       転する方法はありませんし、ビットマスクにて容易に表現可能で
       はない IP アドレス範囲にマッチさせる方法もありません (たと
       えるなら、ここまで実現すると、もはや朝食とは言えない で す
       ね)。

       送 信 元と送信先のどちらかまたは両者に port マッチを含む場
       合、 TCP と UDP のパケットに対してのみ適用されます。 proto
       マッチパラメータが無い場合、どちらのプロトコルのパケットも
       比較されます。これは、"proto tcp/udp" と等価です。 port の
       比較を行うときには、サービス名および数値のポート番号のどち
              合に使用します。一般に、IP オプションが存在する場合
              に マッチさせるには、with ipopts を使用します。完全
              なヘッダを格納するには短かすぎるパケットにマッチ さ
              せ るには、 with short を使用します。断片化されたパ
              ケットにマッチさせるためには、with frag を使用し ま
              す。更に、IP オプション固有のフィルタリングに関して
              は、各オプションを列挙可能です。

              with キーワードの後にパラメータを続ける前に、語 not
              ま たは no を挿入し、オプションが存在しない場合にの
              みフィルタルールがマッチするようにできます。

              with 節を連続して記述することが許されます。また、キ
              ー ワード and を、with の代りに使用することができま
              す。これは、純粋に可読性向上のためです  ("with  ...
              and ...")。複数の節を列挙したとき、すべてがマッチす
              るときに、ルールがマッチします。

       flags  TCP フィルタリングにおいてのみ有効です。使用可能 な
              レターは、TCP ヘッダにて設定可能なフラグの 1 つを表
              現します。関連は次の通りです:

               F - FIN
               S - SYN
               R - RST
               P - PUSH
               A - ACK
               U - URG

              様々なフラグシンボルを組み合わせて使用でき ま す の
              で、 "SA" はパケット中の SYN-ACK の組み合わせを表現
              します。 "SFR" などの組み合わせの指定を制限するもの
              は あ り ません。この組み合わせは、規則を守っている
              TCP 実装では通常生成されません。しかしながら、異 常
              を 避けるために、どのフラグに対してフィルタリングし
              ているのかを示す必要があります。このため に、 ど の
              TCP  フラグを比較するのか (すなわち、どのフラグを重
              要と考えるか) を示すマスクを指定できます。これ は、
              マッ チ対象の TCP フラグ集合の後に、"/<flags>" を付
              けることで実現できます。例えば:

            ... flags S
                      # "flags S/AUPRFS" になり、SYN フラグ「のみ」
                      # が設定されているパケットにマッチします。

            ... flags SA
                      # "flags SA/AUPRFSC" になり、SYN および ACK のフラグ
                      # のみが設定されているパケットにマッチします。

            ... flags S/SA
                      # SYN-ACK の組のうち、SYN フラグのみが設定されている
                      # パケットにのみマッチします。これは共通の「確立」

       歴を保存するかです。以下の情報を保存できます:

       state  通信セッションのフロー情報を保存します。 TCP,  UDP,
              ICMP の各パケットに関して状態が保存されます。

       frags   断 片 化されたパケットの情報を保存します。この情報
              は、後に断片化する際に使用します。

       これらにマッチするパケットは素通しし、アクセス制御リストを
       通しません。


グループ

       パラメータの最後の組はフィルタルールの「グルーピング」を制
       御します。他のグループが指定されない限り、デフォルトでは、
       全 フィルタルールはグループ 0 に置かれます。非デフォルトの
       グループにルールを追加するには、グループの「頭 (head)」 を
       作成するところから、グループを開始します。パケットがグルー
       プの「頭」のルールにマッチする場合、フィルタ処理はそのグル
       ープに切り替わり、そのルールをそのグループのデフォルトとし
       て使用します。 quickhead ルールとともに使用する場 合、
       そ の グループの処理から戻るまでは、ルール処理は停止しませ
       ん。

       あるルールは、新規グループの頭でありかつ、非デフォルトグル
       ープのメンバであることが可能です (headgroup を同一ルー
       ル内で同時に使用可能です)。

       head <n>
              新規グループ (番号 n) を作成することを示します。

       group <n>
              このルールを、グループ 0 ではなく、グループ ( 番 号
              n) に置くことを示します。


ロギング

       log アクションまたはオプションにて、パケットのログを行うと
       き、パケットのヘッダが ipl パケットロギング擬似デバイス に
       書 き込まれます。 log キーワードの直後に、次の修飾語句を (
       この順序で) 使用できます:

       body   パケットの内容の最初の 128 バイトを、ヘッダの後でロ
              グすることを示します。

       first   ログが "keep" オプションと共に使用される場合、本オ
              プションも指定することを勧めます。これにより、ト リ
              ガ となるパケットのみをログして、この後に状態情報に
              マッチする全パケットをログしないようになります。

       or-block
              なんらかの理由でフィルタがログを取れない場合 (ロ グ
              読み取りが非常に遅い場合など)、このパケットに対する
              このルールのアクションが block であったと解釈させま

       block in quick from any to any with ipopts

       これは、標準的な長さではないヘッダを持つ (IP オプション を
       持 つ)  パケットにマッチし、この先のルール処理を行わずに、
       マッチが発生したこととパケットをブロックすべきことを記録し
       ます。

       次のような「継続」ルールの解釈により:

               block in from any to any port < 6000
               pass in from any to any port >= 6000
               block in from any to any port > 6003

       範 囲 6000-6003 が許され、他は許さないように設定できます。
       最初のルールの効果よりも、後続ルールが優先することに注意し
       てください。同じことを行う、他の (容易な) 方法は次の通りで
       す:

               block in from any to any port 6000 <> 6003
               pass in from any to any port 5999 >< 6004

       効果を持たせるためには、 "block" および "pass" の両方を こ
       こに書く必要があります。なぜなら、"block" アクションにマッ
       チしないことが通過を意味するわけではなく、ルールが効果を持
       たないことを意味するだけだからです。ポートが1024未満のもの
       を許すには、次のようなルールを使用します:

               pass in quick from any to any port < 1024

       これは、最初のブロックの前 に 置 く 必 要 が あ り ま す。
       le0/le1/lo0 からのすべての内向きパケットを処理し、デフォル
       トでは内向きの全パケットをブロックする新規グループを作成す
       るには、次のようにします:

              block in all
              block in quick on le0 all head 100
              block in quick on le1 all head 200
              block in quick on lo0 all head 300


       そして、le0 で ICMP パケットのみを許すには、次のようにしま
       す:

              pass in proto icmp all group 100

       le0 からの内向きパケットのみがグループ 100 で処理されま す
       ので、インタフェース名を再度指定する必要がないことに注意し
       てください。同様に、次のように TCP などの処理を分解でき ま
       す:

              block in proto tcp all head 110 group 100

       /dev/ipl
       /dev/ipstate
       /etc/hosts
       /etc/services


関連項目

       ipftest(1),  iptest(1),  mkfilters(1),  ipf(4),  ipnat(5),
       ipf(8), ipfstat(8)



                                                           IPF(5)

ABELNET VPSサービス