IPFW
ソフトウェアの設定は ipfw(8)
ユーティリティを
通じておこないます. このコマンドの構文は非常に複雑に見えますが,
一旦その構造を理解すれば比較的単純です.
このユーティリティでは今のところ四つの異なるコマンドカテゴリが 使用されています: それは追加 / 削除, 表示, フラッシュ, およびクリアです. 追加 / 削除はパケットの受け入れ, 拒絶, ログ取りをどのようにおこなうか というルールを構築するのに使用します. 表示はルールリスト (またはチェーン) と (アカウンティング用) パケットカウンタの 内容を調べるのに使用します. フラッシュはチェーンからすべてのエントリを取り除くのに使用します. クリアは一つまたはそれ以上のアカウンティングエントリをゼロにするのに 使用します.
この形式での使用法は:
ipfw [-N] コマンド [index]
アクション [log] プロトコル アドレス
[ オプション ]
この形式で使用する際に有効なフラグは一つだけです:
アドレスやサービス名を文字列に変換して表示します.
コマンド は一意である限り短縮可能です. 有効な コマンド は:
ファイアウォール / アカウンティングルールリストに エントリを追加します.
ファイアウォール / アカウンティングルールリストから エントリを削除します.
以前のバージョンの IPFW
では, ファイアウォールエントリと
パケットアカウンティングエントリが別々に利用されていました.
現在のバージョンでは, それぞれのファイアウォールエントリ毎に
パケットアカウンティングエントリが備えられています.
index
が指定されていると, エントリはチェーン中の
index
で示される位置に置かれます. index
が指定されて
いなければ, エントリは (65535 番のデフォルトルールである
パケット拒絶を別にして) 最後のチェーンエントリの index に 100 を足した
位置 (チェーンの最後) に置かれます.
カーネルが IPFIREWALL_VERBOSE つきでコンパイルされている場合, log オプションはマッチしたルールをシステムコンソールに出力させます.
有効な アクション は:
パケットを捨てます, ICMP ホスト / ポート到達不能パケットを (適切な方を) 発信元へ送ります.
通常通りパケットを通過させます. (別名: pass および accept)
パケットを捨てます. 発信元は ICMP メッセージによる 通知を受けません (そのためパケットが宛先に到達しなかったように見えます).
このルールはパケットカウンタを更新するだけで, パケットを 通過させたり拒絶したりしません. 検索は次のチェーンエントリから続けられます.
それぞれの アクション は一意な先頭部分だけでも認識されます.
指定可能な プロトコル は以下の通り:
任意の IP パケットにマッチします.
ICMP パケットにマッチします.
TCP パケットにマッチします.
UDP パケットにマッチします.
アドレス の指定は:
from <address/mask>[port] to
<address/mask>[port] [via <interface>]
port はポートをサポートする プロトコル (UDP と TCP) の 場合にだけ指定可能です.
via は必須ではなく, 特定のインターフェースを通ってきたパケット
だけにマッチするように, IP アドレスまたはローカル IP インターフェースの
ドメイン名, またはインターフェース名 (例えば ed0
) を
指定することができます.
インターフェースユニット番号はオプションで, ワイルドカードで指定することが
できます. 例えば, ppp*
はすべてのカーネル PPP インターフェースに
マッチします.
<address/mask>
の指定は:
<address>
または
<address>/mask-bits
または
<address>:mask-pattern
IP アドレスのかわりに有効なホスト名を指定することも可能です.
mask-bits
はアドレスマスクで上位何ビットを1にするべきかを
示す十進数値です. 例えば次の指定,
192.216.222.1/24
はクラス C のサブネット (この場合 192.216.222) の任意のアドレスにマッチする
マスクを作成します. mask-pattern
は与えられたアドレスと
論理 AND される IP アドレスです.
キーワード any
は「任意の IP アドレス」を指定するために
使用することができます.
ブロックするポート番号は以下のように指定します:
port[,port[,port[...]]]
のように単独のポートまたはポートのリストを指定します. または
port-port
のようにポートの範囲を指定します. 単独のポートとポートのリストを
組み合わせて指定することも可能ですが, その場合は常に範囲の方を
最初に指定しなければなりません.
使用可能な オプション は:
データグラムの最初のフラグメントでなければマッチします.
入力途中のパケットであればマッチします.
出力途中のパケットであればマッチします.
IP ヘッダが spec に指定された カンマで区切られたオプションのリストを含んでいればマッチします. サポートされている IP オプションのリストは: ssrr (ストリクトソースルート), lsrr (ルーズソースルート), rr (レコードパケットルート), そして ts (タイムスタンプ) です. 特定のオプションを含まないことを指定するには '!' を先頭につけます.
パケットが既に確立されている TCP コネクションの一部であれば (つまり RST または ACK ビットがセットされていれば) マッチします. established ルールをチェーンの最初の方に置くことで, ファイアウォールのパフォーマンスを向上させることができます.
パケットが TCP コネクションを確立しようとするものであれば (SYN ビットがセットされ ACK ビットはセットされていなければ) マッチします.
TCP ヘッダが flags に指定された カンマで区切られたフラグのリストを含んでいればマッチします. サポートされているフラグは, fin, syn, rst, psh, ack と urg です. 特定のフラグを含まないことを指定するには '!' を先頭につけます.
ICMP タイプが types リストに
存在していればマッチします. リストはタイプの範囲または個々のタイプを
カンマで区切った任意の組合せで指定できます.
一般的に使用されている ICMP タイプは:
0 エコーリプライ (ping リプライ),
5 リダイレクト, 8 エコーリクエスト (ping リクエスト),
そして 11 時間超過 (traceroute(8)
で使用されているように,
TTL 満了を示すのに使用されます) です.
この形式での使用法は:
ipfw [-atN] l
この形式で使用する際に有効なフラグは三つあります:
リスト表示の際にカウンタの値も表示します. このオプションは アカウンティングカウンタの内容を見る唯一の手段です.
各チェーンエントリが最後にマッチした時刻を表示します.
この時刻表示は ipfw(8)
ユーティリティで使用される入力形式と
互換性がありません.
(可能であれば) アドレスやサービス名を文字列に変換して表示します.
チェーンをフラッシュするには:
ipfw flush
カーネルに固定されているデフォルトルール (インデックス 65535 番) 以外の, ファイアウォールチェーンの中のすべてのエントリを削除します. デフォルトではすべてのパケットが拒絶されるので, 一旦これを実行すると, パケットを許可するエントリがチェーンに追加されるまで, あなたのシステムがネットワークから切り放されてしまいます. そのため, ルールのフラッシュをおこなうときは注意が必要です.
一つまたはそれ以上のパケットカウンタをクリアするためには:
ipfw zero [index]
index が指定されていなければ, すべてのパケットカウンタが クリアされます. index が指定されていれば, 特定のチェーンエントリだけが クリアされます.