スポンサーリンク

IP6FW(8) FreeBSD システム管理者マニュアル IP6FW(8)

名称

ip6fw − IPv6 ファイアフォール用制御ユーティリティ

書式

ip6fw [−nq] [

                    −p preproc [                                  −D macro[=value]] [−U macro]] pathname

ip6fw [−n] [−f | −q] flush
ip6fw
[−nq] zero [number ...]
ip6fw
[−n] delete number ...
ip6fw
[−aftN] list [number ...]
ip6fw
[−ftN] show [number ...]
ip6fw
[−nq] add [number] action [log] proto from src to dst [via name | ipv6no] [options]

解説

簡単に設定するために、ルールをファイルに格納して、最初の書式に示すように ip6fw に処理させることが可能です。絶対 pathname を使用する必要がありま す。ファイルは、1 行ずつ読み込まれ、 ip6fw ユーティリティへの引数に適用さ れます。

オプションとして、プリプロセッサを −p preproc で指定可能であり、ここを pathname がパイプされます。有用なプリプロセッサには cpp(1)m4(1) があ ります。 preproc の最初の文字がスラッシュ (‘/’) で開始しない場合、通常の PATH の名前検索が実行されます。 ip6fw 実行時には (まだ) 全ファイルシステ ムがマウントされていない環境においては、注意が必要です (例えば NFS 経由で マウントする場合)。一度 −p が指定されると、オプションの −D−U の指定を 続けることが可能であり、これらはプリプロセッサに渡されます。これにより、 設定ファイル (ローカルホスト名による条件等) が柔軟になり、 IP アドレス等 の頻繁に必要となる引数を集中管理可能となります。

ip6fw コードは、各パケットに対してマッチするものが見つかるまでルールリス トを走査することによって動作します。ルールにはすべて 2 つの関連のあるカウ ンタがあります。パケットカウンタとバイトカウンタです。これらのカウンタは パケットがルールにマッチするときに更新されます。

ルールは、 1 から 65534 までの ‘‘行番号’’ で序列がつけられており、ルール を決めたり削除したりするのに使用されます。ルールは昇順で試され、パケット に最初にマッチしたルールが適用されます。複数のルールが同じ行番号を共有で きます。この場合、追加した順番でルールが適用されます。

番号をつけずにルールを足した場合、その直前のルールよりも 100 大きい番号が つけられます。定義されたルール番号の最大値が 65434 よりも大きい場合、新し く定義されるルールは、ルールの最後に追加されます。

delete 操作では、それが存在する場合には、 number を行番号にもつ最初のルー ルが削除されます。

list コマンドは、現在のルールセットを出力します。

show コマンドは ‘ip6fw -a list’ と等価です。

zero 操作は、ルール番号 number に関連づけられたカウンタを 0 にします。

flush 操作は、すべてのルールを削除します。

‘#’ で始まるコマンドおよび空白だけのコマンドはみな無視されます。

次のルールは必ず存在します:

                  65535 deny all from any to any

このルールはデフォルトのポリシです。すなわち、何も許さないということで す。ルールを設定する際にあなたがすべき仕事は、このポリシを必要に合わせて 変更するということです。

次のオプションが使用できます:

       −a

リスト中に、カウンタ値を表示します。 ‘‘show’’ コマンドを参照してく ださい。

−f
間違って使用すると問題をひき起こす可能性のあるコマンド (つま り、flush) の確認をとりません。 注意、プロセスに端末が割り当てられ ていない場合は、暗黙のうちにこのオプションが指定されています。

−n
コマンド文字列の文法をチェックするだけで、文字列を実際にカーネルに 渡すことはありません。

−q
add 操作や zero 操作、flush 操作を行っている最中に、そのアクション に対して何も表示しません (暗黙のうちに ’-f’ が指定されています)。こ れは、リモートログイン時のセッションでスクリプト内で複数の ip6fw コ マンドを実行したり (例えば、sh /etc/rc.firewall のように)、たくさん の ip6fw ルールファイルを処理したりすることでルールを調節するときに 便利です。通常モード (冗長) で flush 操作を行うと、メッセージが出力 されます。ルールがすべて flush されるので、ログインセッションにメッ セージを送ることができず、ログインセッションも閉じてしまいます。そ のため、残りのルールセットは処理されなくなってしまいます。復旧に は、コンソールへのアクセスが必要になります。

−t
list している最中に、最後にマッチしたときのタイムスタンプを表示しま す。

−N
出力で、アドレスおよびサービス名を解決しようとします。

アクションは次の通りです。

allow ルールにマッチしたパケットを許可します。そして探索 を終了します。別名は pass, permit, accept です。

deny ルールにマッチしたパケットを捨てます。そして探索を 終了します。 dropdeny の別名です。

reject (非推奨です。) ルールにマッチしたパケットを捨てて、 ICMPv6 の host unreachable notice メッセージを送ろ うとします。そして探索を終了します。

unreach code ルールにマッチしたパケットを捨てて、 ICMPv6 の unreachable notice メッセージをコード code で送ろう とします。ここで、 code は 0 から 255 までの番号も しくは次の別名のうちのいずれかです: noroute, admin, notneighbor, addr, noport 。そして探索を終了しま す。

reset TCP パケットのみです。ルールにマッチしたパケットを 捨てて、 TCP reset (RST) notice メッセージを送ろう とします。そして探索を終了します。

count ルールにマッチしたすべてのパケットに対するカウンタ を更新します。探索は、次のルールへと継続します。

skipto number number よりも小さい番号のついたルールをスキップしま す。探索は number 以上の番号のついたルールへと継続 します。

カーネルを IPV6FIREWALL_VERBOSE つきでコンパイルした場合、パケットが ‘‘log’’ キーワードつきのルールにマッチしたときまたは clear/resetlog が実 行されたときには、メッセージが syslogd(8) に記録されるか、これが失敗した ときにはコンソールにメッセージが表示されます。カーネルを IPV6FIREWALL_VERBOSE_LIMIT オプションつきでコンパイルした場合、特定の チェーンエントリに対してこのオプションで指定した数だけパケットを受け取っ た後はログを記録しません。この制限に到達した場合、制限とルール番号が記録 されます。このエントリに対するカウンタをクリアすることでログの記録を再開 できます。

syslogd(8) ログおよびデフォルトのログの制限を、 sysctl(8) インタフェース を介して動的に調整できます。

proto は次の通りです。

ipv6 すべてのパケットがマッチします。別名 all は同じ効果 を持ちます。

tcp TCP パケットだけがマッチします。

udp UDP パケットだけがマッチします。

ipv6-icmp ICMPv6 パケットだけがマッチします。

<number|name> 指定したプロトコルだけがマッチします (完全なリスト は /etc/protocols を参照してください)。

src および dst は次の通りです。

<address/prefixlen> [ports]

<address/prefixlen> は次のように指定できます:

ipv6no fec0::1:2:3:4 という形式の IPv6 ナンバ。

ipv6no/prefixlenfec0::1:2:3:4/112 のような形式のプレフィックス長を もった IPv6 ナンバ。

‘‘not’’ 修飾子をアドレスの前につけることで、マッチの意味を反転させること ができます。これによって、他のすべてのアドレスが代わりにマッチするように なります。これは、ポート番号の選択には影響ありません。

TCP および UDP プロトコルでは、オプションで ports が次のように指定できま す:

{port|port-port}[,port[,...]]

(/etc/services より) サービス名を、数値によるポート番号の代わりに使用でき ます。範囲は最初の値としてのみ指定でき、ポートリスト長は IPV6_FW_MAX_PORTS (<netinet6/ip6_fw.h> で指定) 個のポートまでに制限されて います。

0 ではないオフセットを持つ (すなわち、最初のフラグメントではない) フラグ メントパケットは、1 つ以上のポートが列挙されたルールには絶対にマッチしま せん。フラグメントパケットのマッチについての詳細は frag オプションを参照 してください。

ルールは、パケットが入力されるとき、および出力されるとき、あるいはその両 方ともであるときに適用されます。 in キーワードは、入力パケットにのみルー ルがマッチしなくてはならないことを示すものです。 out キーワードは、出力パ ケットにのみルールがマッチしなくてはならないことを示すものです。

あるインタフェースを通るパケットにマッチするためには、 via を使用して次の ようにインタフェースを指定してください。

via ifX パケットは、インタフェース ifX を通らなくてはなりま せん。

via if* パケットは、インタフェース ifX を通らなくてはなりま せん。ここで、X は任意のユニット番号です。

via any パケットは、 なんらかのインタフェースを通らなくては なりません。

via ipv6no パケットは、IPv6 アドレス ipv6no を持ったインタ フェースを通らなくてはなりません。

via キーワードを使用すると、該当インタフェースは常にチェックされるように なります。 via の代わりに recv あるいは xmit を使用すると、 (それぞれ) 受 信インタフェースまたは送信インタフェースだけがチェックされます。両方を指 定することで、受信インタフェース、送信インタフェースの両方ともにパケット をマッチさせることができます。例えば、次のようにします。

ip6fw add 100 deny ip from any to any out recv ed0 xmit ed1

recv インタフェースは、入力パケットあるいは出力パケットのどちらかでテスト されます。これに対して、 xmit インタフェースは、出力パケットでしかテスト されません。そのため、 xmit を使用する場合はいつでも out が必要です (そし て、 in は不正です)。 xmit あるいは recv と一緒に via を指定するのは不正 です。

パケットには、受信インタフェースあるいは送信インタフェースがないかもしれ ません。ローカルホストから送信されたパケットには受信インタフェースがあり ません。そして、ローカルホストへ向けて送信されたパケットには送信インタ フェースがありません。

追加の options は次の通りです。

frag パケットがフラグメントであり、しかもデータグラムの 最初のフラグメントでなければマッチします。 frag は、 tcpflags あるいは TCP/UDP ポートの指定と一緒に は使うことができません。

in パケットが入ってこようとしている場合にマッチしま す。

out パケットが出ていこうとしている場合にマッチします。

ipv6options specIPv6 ヘッダに、 spec で指定されたコンマ区切りのオプ ションリストの要素が含まれていればマッチします。サ ポートしている IPv6 オプションは次の通りです。 hopopt (hop-by-hop オプションヘッダ)、 route (ルー ティングヘッダ)、 frag (フラグメントヘッダ)、 esp ( 暗号ペイロード)、 ah (認証ヘッダ)、 nonxt (次ヘッダ なし)、そして opts (デスティネーションオプション ヘッダ) です。特定のオプションがないことは、 ‘‘!’’ で表します (まだ動作していません) 。

established RST あるいは ACK ビットがセットされているパケットに マッチします。

setup SYN ビットはセットされているが ACK ビットがセットさ れていないパケットにマッチします。

tcpflags spec TCP ヘッダに、 spec で指定されたコンマ区切りのフラ グリストの要素が含まれていればマッチします。サポー トしている TCP フラグは以下の通りです。 fin, syn, rst, psh, ack, そして urg です。特定のフラグがない ことは ‘‘!’’ を使って表します。 tcpflags 指定を含ん だルールは、 0 でないオフセットを持ったフラグメント パケットには絶対にマッチしません。フラグメントパ ケットへのマッチに関する詳細は frag オプションを参 照してください。

icmptypes types ICMPv6 のタイプが types リスト中にあればマッチしま す。リストには、範囲と、個々のタイプをコンマで区 切ったものを、任意に組み合わせて指定できます

チェックリスト

ここには、あなたがルールをデザインする際に考慮すべき重要なポイントをいく つか述べてあります。

 入力および出力パケットの両方をフィルタするのだということを忘れないでください。ほとんどの接続には両方向のパケットが必要です。

とても注意深くテストするのを忘れないでください。テストする際には コンソールの近くで行うというのが良いアイデアです。

ループバックインタフェースを忘れないでください。

微調整

ファイアウォールが常に破棄するパケットが 1 種類あります。それは、フラグメ ントオフセット 1 を持った IPv6 フラグメントです。これは正しいパケットです が、使用方法は 1 つだけです。それは、ファイアウォールの抜け道を探そうとす ることです。

ネットワーク越しにログインしている場合は、 ip6fw の KLD バージョンをロー ドするのは、おそらくあなたが思っているほどには簡単ではないでしょう (サ ポートされていません ) 。次のようなコマンド行を推奨します。

                  kldload ip6fw && \
                  ip6fw add 32000 allow all from any to any

同様の状況で、同じ行で

                  ip6fw flush

を行うことも良くないアイデアです。

パケット変換

サポートされていません。

使用例

このコマンドは、 hacker.evil.org から wolf.tambov.su の telnet ポートへの TCP パケットすべてを、このホストでフォワードしないようにします。

ip6fw add deny tcp from hacker.evil.org to wolf.tambov.su 23

次のコマンドは、hackers ネットワーク全体から自ホストへの接続を何であれ禁 止します。

ip6fw add deny all from fec0::123:45:67:0/112 to my.host.org

これは、カウント値の記録とタイムスタンプ情報を表示するためのリストコマン ドの良い使用例です。

ip6fw -at l

あるいは、タイムスタンプなしの、短い形式のものは

ip6fw -a l

です。

関連項目

ip(4), ipfirewall(4), protocols(5), services(5), reboot(8), sysctl(8), syslogd(8)

バグ

注意 !! 注意 !! 注意 !! 注意 !!

このプログラムは、あなたのコンピュータをかなり使えない状態にしてしまう可 能性があります。初めて使用する際には、コンピュータのコンソールで作業して ください。また、理解していないことは何も しないでください。

チェーンエントリを操作 / 追加する際には、サービス名およびプロトコル名は受 け付けられません。

作者

Ugen J. S. Antsilevich,
Poul-Henning Kamp,
Alex Nash,
Archie Cobbs です。

API は、BSDI 用に Daniel Boulet が書いたコードに基いています。

歴史

ip6fw ユーティリティは最初に FreeBSD 4.0 で登場しました。

FreeBSD 10.0 March 13, 2000 FreeBSD 10.0

スポンサーリンク