IP6FW(8)

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

書式
ip6fw [-q] [ -p preproc [-D macro[=value]] [-U macro]] pathname ip6fw [-f | -q] flush ip6fw [-q] zero [number ...] ip6fw delete number ... ip6fw [-aftN] list [number ...] ip6fw [-ftN] show [number ...] ip6fw [-q] 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) の確認をとりません。 注意、 プロセスに端末が割り当てられていない場合は、暗黙のうちに このオプションが指定されています。

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

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

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

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

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

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

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 以上の番号のついたルールへと継続します。

カーネルを IP6FIREWALL_VERBOSE つきでコンパイルした場合、パケットが “log” キーワードつきのルールにマッチしたとき または clear/resetlog が実行されたときには、 メッセージが syslogd(8) に記録されるか、これが失敗したときにはコンソールにメッセージが表示されます。 カーネルを IP6FIREWALL_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/prefixlen
    fec0::1:2:3:4/112 のような形式のプレフィックス長をもった IPv6 ナンバ。

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

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

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

( /etc/services より) サービス名を、 数値によるポート番号の代わりに使用できます。 範囲は最初の値としてのみ指定でき、ポートリスト長は IP6_FW_MAX_PORTS ( /usr/src/sys/netinet/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 spec
    IPv6 ヘッダに、 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 /modules/ip6fw_mod.o && \
    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 です。

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

歴史
ip6fw は最初に FreeBSD 4.0 で登場しました。