diff --git a/ja_JP.eucJP/man/man8/ipfw.8 b/ja_JP.eucJP/man/man8/ipfw.8 index c1087f64fb..96bb4b2385 100644 --- a/ja_JP.eucJP/man/man8/ipfw.8 +++ b/ja_JP.eucJP/man/man8/ipfw.8 @@ -1,1306 +1,1306 @@ .\" .\" %FreeBSD: src/sbin/ipfw/ipfw.8,v 1.63.2.22 2002/02/19 22:24:35 julian Exp % .\" .\" $FreeBSD$ .\" .Dd May 31, 2001 .Dt IPFW 8 .Os .Sh 名称 .Nm ipfw .Nd IP ファイアウォールとトラフィックシェイパの制御プログラム .Sh 書式 .Nm .Op Fl q .Oo .Fl p Ar preproc .Oo Fl D .Ar macro Ns Op = Ns Ar value .Oc .Op Fl U Ar macro .Oc .Ar pathname .Nm .Op Fl f | q .Cm flush .Nm .Op Fl q .Brq Cm zero | resetlog | delete .Op Ar number ... .Nm .Op Fl s Op Ar field .Op Fl adeftN .Brq Cm list | show .Op Ar number ... .Nm .Op Fl q .Cm add .Op Ar number .Ar rule-body .Nm .Cm pipe .Ar number .Cm config .Ar pipe-config-options .Nm .Cm pipe .Brq Cm delete | list | show .Op Ar number ... .Nm .Cm queue .Ar number .Cm config .Ar queue-config-options .Nm .Cm queue .Brq Cm delete | list | show .Op Ar number ... .Sh 解説 .Nm は、 .Fx の .Xr ipfirewall 4 と .Xr dummynet 4 トラフィックシェイパを制御するユーザインタフェースです。 .Pp ファイアウォール設定は、番号付けされたルールのリストからなります。 あるルールにマッチしそれに関連する動作が実行されるまで、 各入出力 IP パケットはルールのリストに対し照合されます。 動作とシステムの設定によっては、マッチしたルールの直後で、 パケットがファイアウォールに再注入され、 更に処理が継続することもあります。 全てのルールが全てのインタフェースに適用されますので、 チェックの回数が最小となるようなルール集合を書くのは システム管理者の責任です。 .Pp どの設定も常に、 .Em DEFAULT ルール (番号 65535) を含みます。このルールは変更できず、 全パケットにマッチします。 デフォルトルールに関連付けるルールは .Cm deny か .Cm allow のどちらかになりますが、 これはどのようにカーネルを設定したかに依存します。 .Pp ルール集合が .Cm keep-state または .Cm limit のオプション付きのルールを含む場合、 .Nm は .Em ステートフル (状態依存型) で動作します。すなわち、あるマッチの結果、 マッチしたパケットのパラメータにちょうど一致するルールが 動的に生成されます。 .Pp これらの動的ルールの寿命は有限で、 .Cm check-state または .Cm keep-state ルールが最初に生じた場所でチェックされます。 動的ルールは、合法的なトラフィックをオンデマンドで ファイアウォールを通過させるために用いることが普通です。 .Nm のステートフルな動作について更に情報が必要ならば、 以下の .Sx ルール書式 または .Sx 使用例 セクションを参照して下さい。 .Pp 動的ルールも含めすべてのルールは、 それに関連するカウンタをいくつか持っています。 それは、パケットカウント、バイトカウント、ログカウント、 最後にマッチした時刻を示すタイムスタンプです。 カウンタは、 .Nm コマンドによって、表示およびリセット可能です。 .Pp ルールの追加は .Cm add コマンドにて可能です。 個々のルールの削除は .Cm delete コマンドにて可能であり、すべてのルールの削除は .Cm flush コマンドにて可能です。 ルールの表示は、 .Cm show コマンドおよび -.Ar list +.Cm list コマンドにて可能です。 これらにより、オプションでカウンタ内容も含めて表示させることができます。 最後に、カウンタのリセットは .Cm zero コマンドおよび .Cm resetlog コマンドにて可能です。 .Pp 次のオプションが利用可能です: .Bl -tag -width indent .It Fl a リスト中にカウンタ値を示します。 .Cm show コマンドは、このオプションを暗黙的に指定しただけのものです。 .It Fl d リスト中に、静的ルールに加えて動的ルールも表示します。 .It Fl e .Fl d オプションも指定された場合、 リスト中に、期限切れの動的ルールも表示します。 .It Fl f 誤って使用すると問題を起す可能性のあるコマンド、 .No すなわち Cm flush に対して、実行の確認を行いません。 .Em 注 : プロセスに関連付けられた tty が無い場合、このオプションが 暗黙のうちに指定されたとして処理されます。 .It Fl q .Cm add , .Cm zero , .Cm resetlog , .Cm flush 実行中、動作について報告しません (暗黙のうちに .Fl f が指定されます)。 スクリプト (例えば .Sq sh /etc/rc.firewall ) の中で複数の .Nm コマンドを実行してルールを変更する場合や、 リモートログインセッション経由で多数の .Nm ルールを含むファイルを処理することによりルールを変更する場合に 有用です。 通常 (冗長) モードで (デフォルトカーネル設定で) flush を行った場合、 メッセージを表示します。 すべてのルールが捨てられますので、 メッセージはログインセッションへ渡せません。 つまり、リモートログインセッション経由の場合、セッションはクローズされ、 残りのルールセットは処理されません。 この状態から回復するためにはコンソールへのアクセスが必要になります。 .It Fl t リスト作成時に、最後にマッチしたタイムスタンプを表示します。 .It Fl N 出力中のアドレスとサービス名を解決しようとします。 .It Fl s Op Ar field パイプ経由でリスト出力している際に、4つのカウンタの1つについて 整列させます (現在のパケット数)。 .El .Pp 設定を簡単にするために、ルールをファイルに記述して、 これを .Nm の最初の書式行を使って処理します。 .Ar pathname には絶対パス名を使用する必要があります。 このファイルからは 1 行ずつ読み込まれ、 .Nm ユーティリティへの引数となります。 .Pp .Fl p Ar preproc を使用して、 .Ar pathname がパイプされるプリプロセッサを指定することもできます。 有用なプリプロセッサには、 .Xr cpp 1 と .Xr m4 1 があります。 .Ar preproc の最初の文字がスラッシュ .Pq Ql / から始まらない場合、 .Ev PATH を使用した通常の名前検索が行われます。 .Nm が実行されるときまでに全ファイルシステムが (まだ) マウントされないような環境 (例えば NFS 経由でマウントされる場合) では、このことに注意してください。 ひとたび .Fl p が指定されると、オプションとして .Fl D と .Fl U の指定を続けることが可能となり、これらがプリプロセッサに渡されます。 これにより、(ローカルホスト名により条件付けするなど) 柔軟性のある設定ファイルを作成可能となり、IP アドレスのように 頻繁に必要となる引数を集中管理するためのマクロを使用可能となります。 .Pp 後述の .Sx トラフィックシェイパ設定 の節で示すように、 .Nm .Cm pipe コマンドを使用して、トラフィックシェイパを構築可能です。 .Sh ルール書式 .Nm ルールフォーマットは次の通りです。 .Bd -ragged .Op Cm prob Ar match_probability .Ar action .Op Cm log Op Cm logamount Ar number .Ar proto .Cm from Ar src .Cm to Ar dst .Op Ar interface-spec .Op Ar options .Ed .Pp 各パケットをフィルタする際には、以下の情報に基づくことができます。 .Pp .Bl -tag -width "送信元および宛先 IP アドレス" -offset indent -compact .It 送受信インタフェース (名前またはアドレス) .It 方向 (入力または出力) .It 送信元および宛先 IP アドレス (マスク使用可) .It プロトコル (TCP, UDP, ICMP 等) .It 送信元および宛先ポート (リスト、範囲、マスクのいずれか) .It TCP フラグ .It IP フラグメントフラグ .It IP オプション .It ICMP タイプ .It パケットに関連付けられたソケットのユーザ ID とグループ ID .El .Pp 送信元 IP アドレスや宛先 TCP/UDP ポートによるフィルタは 危険があることに注意してください。 なぜなら、これらの詐称は簡単だからです。 .Bl -tag -width indent .It Cm prob Ar match_probability 指定した確率 (0 から 1 までの浮動小数点数です) でのみマッチが宣言されます。 ランダムにパケットを落とす応用として用いる場合や、( .Xr dummynet 4 と共に使用して) パケット到達順序の乱れを引き起こす複数経路の効果をシミュレートする際に 有用です。 .It Ar action : .Bl -tag -width indent .It Cm allow マッチするパケットを通過させ、マッチングを終了します。 .Cm pass , .Cm permit , .Cm accept はこれの別名です。 .It Cm deny マッチするパケットを破棄し、マッチングを終了します。 .Cm drop は .Cm deny の別名です。 .It Cm reject (この使用は推奨されません) マッチするパケットを破棄し、 ICMP の host unreachable を送信し、 マッチングを終了します。 .It Cm unreach Ar code マッチするパケットを破棄し、 ICMP の unreachable に .Ar code を付けて送信します。ここで、 .Ar code は、0 から 256 までの数字、もしくは、以下に列挙する別名のいずれかです: .Cm net , host , protocol , port , .Cm needfrag , srcfail , net-unknown , host-unknown , .Cm isolated , net-prohib , host-prohib , tosnet , .Cm toshost , filter-prohib , host-precedence , .Cm precedence-cutoff 。マッチングは終了します。 .It Cm reset TCP パケットのみ対象。 パケットを破棄し、TCP の reset (RST) を送信し、 マッチングを終了します。 .It Cm count ルールにマッチするパケットすべてのカウンタを更新し、 引続きマッチングを行ないます。 .It Cm check-state 動的ルール集合に対してパケットのチェックを行ないます。 マッチした場合、マッチングは終了します。 マッチしなかった場合、次のルールに移ります。 .Cm check-state ルールが見つからないときは、動的ルール集合は最初の .Cm keep-state ルールの場所でチェックされます。 .It Cm divert Ar port マッチするパケットを .Ar port で指定されたポートにバインドされている .Xr divert 4 ソケットに送り、マッチングを終了します。 .It Cm tee Ar port マッチするパケットのコピーを .Ar port で指定されたポートにバインドされている .Xr divert 4 ソケットに送ります。 検索を終了し、元のパケットは受理されます (ただし後述の .Sx バグ を参照してください)。 .It Cm fwd Ar ipaddr Ns Op , Ns Ar port マッチしたパケットの次のホップを .Ar ipaddr に変更します。これはドット付き 4 つ組の IP アドレスでもホスト名でもよいです。 .Ar ipaddr が直接到達可能なアドレスではない場合、その IP に対して ローカルルーティングテーブルでみつかった経路を使用します。 .Ar ipaddr がローカルアドレスの場合、 .Cm fwd ルールにパケットがマッチすると、そのパケットをローカルマシンの .Ar port に転換します。 その際、 ソケットのローカルアドレスは、 パケットの元々の宛先の IP アドレスのままとします。 .Xr netstat 1 エントリが奇妙に見えるようになりますが、 これは透過的プロキシサーバのためにあります。 IP が ローカルアドレスではない場合、ポート番号は (指定されていても) 無視されます。 パケットがローカルに生成されたときにも、アドレスをマップします。 検索はこのルールがマッチしたときに終了します。 ポート番号が与えられなかった場合、 外部マシンのポート Y へのパケットは ローカルポート Y へ転送されるように、 パケット中のポート番号が使用されます。 カーネルは、 オプション IPFIREWALL_FORWARD 付きでコンパイルされている必要があります。 ブリッジ機能は、転送が実装されている部分で .Fn ip_input と .Fn ip_output をバイパスすることで、ローカルシステム宛ではないパケットを転送します。 .Cm fwd 動作はパケットの内容をまったく変更しないため、 転送先システムがそのようなパケットを取り込むルールを持たない限り、 当該パケットは通常そのシステムが拒否します。 .It Cm pipe Ar pipe_nr パケットを .Xr dummynet 4 .Dq パイプ へ渡します (バンド幅制限、遅延等のため)。 更なる情報については .Sx トラフィックシェイパ設定 の節を参照してください。 検索は終了します。 しかし、パイプから抜けたときに .Xr sysctl 8 変数 .Em net.inet.ip.fw.one_pass がセットされていない場合、 パケットはファイアウォールコードへ再度渡されて次のルールから開始します。 .It Cm queue Ar queue_nr パケットを .Xr dummynet 4 .Dq queue へ渡します (WF2Q を使ったバンド幅制限用)。 .It Cm skipto Ar number .Ar number より小さな番号のルールを飛び越して、 .Ar number 以上の番号のルールで最初に存在するものから、マッチングを継続します。 .El .It Cm log Op Cm logamount Ar number カーネルが .Dv IPFIREWALL_VERBOSE オプション付きでコンパイルされている場合に、 .Cm log キーワードが指定されているルールとマッチした時、 メッセージを .Dv LOG_SECURITY ファシリティで .Xr syslogd 8 でログします。 .Em 注 : デフォルトでは、ログは .Pa /var/log/security ファイルに追加されます ( .Xr syslog.conf 5 を参照してください)。 カーネルが、 .Dv IPFIREWALL_VERBOSE_LIMIT オプション付きでコンパイルされている場合、 デフォルトでは、 一連のルールに対し指定されたパケット 数を受信した後、メッセージの表示を中止し、 .Em net.inet.ip.fw.verbose_limit がその数に設定されます。 しかし .Cm logamount Ar number が使用された場合、 .Em net.inet.ip.fw.verbose_limit の代りにこの .Ar number がデフォルトのログ制限になり、値 .Dq 0 を指定すると、ロギングの制限は取り除かれます。 このエントリに対するロギングカウンタまたはパケットカウンタを クリアすれば、ロギングは再び有効になります。 .Pp コンソールログとデフォルトログ制限数は、 .Xr sysctl 8 を通じて MIB ベース .Dv net.inet.ip.fw にて動的に設定できます。 .It Ar proto 名前または数値で指定する IP プロトコル (詳細は .Pa /etc/protocols のリストを参照のこと)。 .Cm ip または .Cm all のキーワードを使用すると、すべてのプロトコルがマッチします。 .It Ar src No と Ar dst : .Cm any | me | Op Cm not .Aq Ar address Ns / Ns Ar mask .Op Ar ports .Pp .Cm any を指定すると、ルールはすべての IP 番号とマッチします。 .Pp .Cm me を指定すると、ルールはシステム上で構成されたすべての IP 番号とマッチします。 .Pp .Aq Ar address Ns / Ns Ar mask は以下のように指定できます。 .Bl -tag -width "ipno/bits" .It Ar ipno IP 番号を 1.2.3.4 の形式で指定します。 この IP 番号にのみマッチします。 .It Ar ipno Ns / Ns Ar bits IP 番号とネットマスクの幅を 1.2.3.4/24 の形式で指定します。 この例の場合は 1.2.3.0 から 1.2.3.255 のアドレスがマッチします。 .It Ar ipno Ns : Ns Ar mask IP 番号とネットマスクを 1.2.3.4:255.255.240.0 の形式で指定します。 この場合は 1.2.0.0 から 1.2.15.255 のアドレスがマッチします。 .El .Pp アドレスの前に .Cm not を付けることによって、マッチの意味を反転させる ことができます (指定されたアドレス以外のすべてのアドレスがマッチします)。 これはポート番号の選択には影響しません。 .Pp TCP と UDP ではさらに、 .Em ports を以下のように指定できます。 .Bd -ragged -offset indent .Sm off .Brq Ar port | port No \&- Ar port | port : mask .Op , Ar port Op , Ar ... .Sm on .Ed .Pp 記号 .Ql \&- による表現は、ポート範囲 (両端含む) を指定します。 .Pp 記号 .Ql \&: による表現は、ポートとマスクを指定します。 マッチが宣言されるのは、 パケット中のポート番号がルール中のポート番号にマッチするときですが、 マッチ対象のビットはマスク中で指定されたものに限定されます。 .Pp ポート番号の代わりに (ファイル .Pa /etc/services から取った) サービス名を使用できます。 ポート範囲指定の書式は、最初の値としてのみ指定できます。 列挙出来るポート数は .Pa /usr/src/sys/netinet/ip_fw.h で .Dv IP_FW_MAX_PORTS として定義されています。 バックスラッシュ .Pq Ql \e を使用することにより、サービス名中の .Pq Ql - 文字をエスケープ可能です: .Pp .Dl ipfw add count tcp from any ftp\e\e-data-ftp to any .Pp 断片化されたパケットでオフセットが非 0 のもの (すなわち、最初の断片ではないもの) は、 1 つ以上のポート指定を持つルールにはマッチしません。 断片化されたパケットへのマッチングに関する詳細は .Cm frag オプションを参照してください。 .It Ar interface-spec 次の指定子の組み合わせを使用可能です: .Bl -tag -width "via ipno" .It Cm in 入力パケットにのみマッチします。 .It Cm out 出力パケットにのみマッチします。 .It Cm via Ar ifX パケットはインタフェース .Ar ifX を通過せねばなりません。 .It Cm via Ar if Ns Cm * パケットはインタフェース .Ar ifX を通過せねばなりません。この .Ar X はどんなユニット番号でもかまいません。 .It Cm via any パケットは .Em いずれか のインタフェースを通過せねばなりません。 .It Cm via Ar ipno パケットは、 IP アドレス .Ar ipno を持つインタフェースを通過せねばなりません。 .El .Pp .Cm via を用いると、常時指定されたインタフェースがチェックされます。 .Cm recv や .Cm xmit を、 .Cm via の代わりに指定すると、 受信、もしくは送信インタフェースのみが (おのおの) チェックされます。 両方を指定すれば、 受信インタフェースと送信インタフェースの両方に基づきパケットを マッチさせることが可能になります。 例 : .Pp .Dl "ipfw add 100 deny ip from any to any out recv ed0 xmit ed1" .Pp .Cm recv で指定したインタフェースでは、受信と送信、両方のパケットをチェックできます。 それに対し、 .Cm xmit で指定したインタフェースでは、送信パケットのみとなります。 それゆえに、 .Cm xmit を指定すると .Cm out が、必須です ( .Cm in は不可)。 .Cm via と共に .Cm xmit もしくは、 .Cm recv を指定する事はできません。 .Pp パケットは、受信用ないし送信用インタフェースを持たない場合があります。 ローカルホストで発生したパケットには受信用のインタフェースはありませんし、 ローカルホスト内宛のパケットには送信用インタフェースはありません。 .It Ar options : .Bl -tag -width indent .It Cm keep-state Op Ar method マッチの際に、ファイアウォールが動的ルールを生成します。このルールの デフォルトの動作は、同一プロトコルを用いる発信元と宛先の IP/port 間で双方向に通過するパケットへのマッチです。 このルールの生存期間は有限です ( .Xr sysctl 8 変数の集合により制御されます)。この生存期間は、パケットのマッチが 生じるたびに更新されます。 .It Cm limit Bro Cm src-addr | src-port | dst-addr | dst-port Brc Ar N ファイアウォールは、 ルールで指定されるパラメータにおいては、 .Ar N 個の接続だけを許可します。 始点および終点のアドレスやポートは、1 個以上指定可能です。 .It Cm bridged ブリッジされるパケットにのみマッチします。 これはマルチキャストやブロードキャストのパケットを扱う際に有用です。 これ以外の方法では、パケットは、ブリッジの際に一度、 ローカルスタックに渡される際にもう一度と、 ファイアウォールを 2 度通過してしまいます。 .Pp パフォーマンス上のわずかな損失はともかく、 .Em pipe を用いる際にも問題になります。これは、バンド幅、キュー占有度などの カウンタに関して、同じパケットが 2 度カウントされてしまうためです。 .It Cm frag パケットが断片 (フラグメント) 化されたデータグラムの一部で、 かつデータグラムの先頭の断片でない場合にマッチします。 .Cm frag を、 .Cm tcpflags や TCP/UDP ポート指定と共に使用することはできません。 .It Cm ipoptions Ar spec IP ヘッダが、 .Ar spec に指定されたコンマで区切られたオプションのリストを含む場合にのみマッチします。 サポートされている IP オプションは .Pp .Cm ssrr (strict source route), .Cm lsrr (loose source route), .Cm rr (record packet route), .Cm ts (timestamp) です。 .Ql \&! によって、特定のオプションを含まない指定が記述できます。 .It Cm tcpoptions Ar spec TCP ヘッダが、 .Ar spec に指定されたコンマで区切られたオプションのリストを含む場合にのみマッチします。 サポートされている TCP オプションは .Pp .Cm mss (maximum segment size), .Cm window (tcp window advertisement), .Cm sack (selective ack), .Cm ts (rfc1323 timestamp), .Cm cc (rfc1644 t/tcp connection count) です。 .Ql \&! によって、特定のオプションを含まない指定が記述できます。 .It Cm established TCP パケットのみに適用されます。 RST または ACK ビットがセットされているパケットのみマッチします。 .It Cm setup TCP パケットのみに適用されます。 SYN ビットがセットされ ACK がセットされていないパケットのみマッチします。 .It Cm tcpflags Ar spec TCP パケットのみに適用されます。 TCP ヘッダが .Ar spec に指定されたコンマで区切られたフラグのリストを含む場合にのみマッチします。 サポートされているフラグは、 .Pp .Cm fin , .Cm syn , .Cm rst , .Cm psh , .Cm ack , .Cm urg です。 .Ql \&! によって、特定のフラグを含まない指定を記述できます。 .Cm tcpflags 指定を含むルールは、非 0 のオフセットを持つ断片化されたパケットに マッチすることはありません。 断片化されたパケットに関するマッチについての詳細は .Cm frag オプションを参照してください。 .It Cm icmptypes Ar types ICMP パケットのみに適用されます。 ICMP タイプが .Ar types で指定されたリスト中に存在する場合にのみマッチします。 リストは範囲指定でも、タイプおのおのをコンマで区切ったものでも どちらの組み合わせでもかまいません。 サポートされている ICMP タイプは次の通りです: .Pp エコー返答 .Pq Cm 0 , 終点不到達 .Pq Cm 3 , 発信抑制 .Pq Cm 4 , リダイレクト .Pq Cm 5 , エコー要求 .Pq Cm 8 , ルータ広告 .Pq Cm 9 , ルータ要請 .Pq Cm 10 , 時間超過 .Pq Cm 11 , IP ヘッダ異常 .Pq Cm 12 , タイムスタンプ要求 .Pq Cm 13 , タイムスタンプ応答 .Pq Cm 14 , 情報要求 .Pq Cm 15 , 情報返答 .Pq Cm 16 , アドレスマスク要求 .Pq Cm 17 , アドレスマスク応答 .Pq Cm 18 .It Cm uid Ar user .Ar user が送信したまたは受信する、 すべての TCP パケットと UDP パケットにマッチします。 .Ar user は、名前でも ID 番号でもマッチします。 .It Cm gid Ar group .Ar group が送信したまたは受信する、 すべての TCP パケットと UDP パケットにマッチします。 .Ar group は、名前でも ID 番号でもマッチします。 .El .El .Sh トラフィックシェイパ設定 .Nm ユーティリティは、 .Xr dummynet 4 トラフィックシェイパへのユーザインタフェースも提供します。 シェイパは、ユーザが指定したマスクを IP ヘッダの異なったフィールドに 適用することにより、パケットを .Em フロー (flow) に分割します。 同じフローに属するパケットは 2 つの異なったオブジェクトへ渡されます。 それは .Em パイプ (pipe) または .Em キュー (queue) と呼ばれるものです。 .Em パイプ は、与えられたバンド幅、遅延時間、キューの長さ、パケット喪失率を もつリンクをエミュレートします。 このパラメータに従い、パケットはパイプ中を遷移します。 .Pp .Em キュー は、WF2Q+ ポリシを実装するために使用する抽象化です。 キューは、各フローに対し、重みと参照パイプを関連付けます。 それから、同じパイプに結び付けられたすべてのフローは、 WF2Q+ ポリシに従い、 パイプによって固定されたレートでスケジュールされます。 .Pp .Nm パイプ設定書式は次の通りです。 .Bd -ragged .Cm pipe Ar number Cm config .Op Cm bw Ar bandwidth | device .Op Cm delay Ar ms-delay .Oo .Cm queue .Brq Ar slots | size .Oc .Op Cm plr Ar loss-probability .Op Cm mask Ar mask-specifier .Op Cm buckets Ar hash-table-size .Oo .Cm red | gred .Sm off .Ar w_q No / Ar min_th No / Ar max_th No / Ar max_p .Sm on .Oc .Ed .Pp .Nm キュー設定書式は次の通りです。 .Bd -ragged .Cm queue Ar number Cm config .Op Cm pipe Ar pipe_nr .Op Cm weight Ar weight .Oo .Cm queue .Brq Ar slots | size .Oc .Op Cm plr Ar loss-probability .Op Cm mask Ar mask-specifier .Op Cm buckets Ar hash-table-size .Oo .Cm red | gred .Sm off .Ar w_q No / Ar min_th No / Ar max_th No / Ar max_p .Sm on .Oc .Pp 次のパラメータをパイプに対して設定可能です: .Bl -tag -width indent .It Cm bw Ar bandwidth | device バンド幅であり、単位は .Sm off .Op Cm K | M .Brq Cm bit/s | Byte/s . .Sm on で測定します。 .Pp 値 0 (デフォルト) は無限のバンド幅を意味します。 単位は数値の直後に続けて書く必要があり、次のようにします。 .Pp .Dl "ipfw pipe 1 config bw 300Kbit/s queue 50KBytes" .Pp 数値の代りにデバイス名が指定された場合、 送信クロックは指定したデバイスから与えられます。 現在のところ、 .Xr tun 4 デバイスのみが .Xr ppp 8 と組み合わせて使用するために、この機能を提供しています。 .It Cm delay Ar ms-delay 遅延時間であり、ミリ秒単位で指定します。 値は、クロックティックの倍数 (典型的には 10ms ですが、 カーネルを "options HZ=1000" で動作させて精度を 1ms 以下にすると良い ことが経験的に知られています) に丸められます。 デフォルト値は 0 であり、遅延無しを意味します。 .It Cm queue Brq Ar slots | size Ns Cm Kbytes キューの大きさであり、スロット数か KBytes です。 デフォルト値は 50 スロットであり、 イーサネットデバイスの典型的なキューの大きさです。 低速リンクではキューの大きさを短くすべきことに注意してください。 さもないと、トラフィックは甚大なキュー遅延による影響を受けてしまいます。 例えば、 50 個の最大イーサネットパケット (1500 バイト) は 600Kbit であり、 30Kbit/s のパイプでは 20 秒のキューを意味します。 より大きな MTU のインタフェースからパケットを受け取るときには、 より悪い結果となります。 例えば、ループバックインタフェースにおいて 16KB パケットを受け取るときです。 .It Cm plr Ar packet-loss-rate パケット喪失率です。 引数 .Ar packet-loss-rate は 0 と 1 の間の浮動小数点数であり、 0 は喪失無しを意味し、1 は 100% の喪失を意味します。 喪失率は内部的には 31 ビットで表現されます。 .It Cm mask Ar mask-specifier .Xr dummynet 4 では、フローごとのキューを生成可能です。 フロー識別子は、パイプ設定において指定される IP アドレス、ポート、プロトコルタイプでマスクすることで構築されます。 マスク後に同じ識別子を持つパケットは、同じキューに落ちます。 使用可能なマスク指定子は、次を組み合わせたものです: .Cm dst-ip Ar mask , .Cm src-ip Ar mask , .Cm dst-port Ar mask , .Cm src-port Ar mask , .Cm proto Ar mask , .Cm all 。 最後の指定子は、 すべてのフィールドのすべてのビットが重要であることを意味しています。 .Ar pipe 設定中で使用される場合、 各フローにはパイプのレートに等しいレートが割り当てられます。 .Ar queue 設定中で使用される場合、 各フローにはキューの重みに等しい重みが割り当てられ、 同じパイプを構成するキューは重みに比例してバンド幅を共有します。 .It Cm buckets Ar hash-table-size 様々なキューを格納するために使用するハッシュ表の大きさを指定します。 デフォルト値は 64 であり、 .Xr sysctl 8 変数 .Em net.inet.ip.dummynet.hash_size で制御され、使用可能な範囲は 16 から 1024 です。 .It Cm pipe Ar pipe_nr キューを指定したパイプに接続します。 複数のキュー (通常は異なった重み) を同一のパイプに接続可能です。 この場合、このキュー集合に対する集約レートを、このパイプが指定します。 .It Cm weight Ar weight このキューに適合するフローに使用する重みを指定します。 重みは 1..100 の範囲であることが必要であり、デフォルトは 1 です。 .It Cm red | gred Ar w_q Ns / Ns Ar min_th Ns / Ns Ar max_th Ns / Ns Ar max_p RED キュー管理アルゴリズムを使用します。 .Ar w_q と .Ar max_p は 0 から 1 (0 を含みません) の範囲の浮動小数点数であり、 .Ar min_th と .Ar max_th はキュー管理用の閾値を指定する整数です (キューがバイト数で指定された場合は閾値はバイトで計算され、 そうでない場合はスロット数で計算されます)。 .Xr dummynet 4 は、gentle RED という変型 (gred) もサポートします。 RED の動作を制御するために、3 個の .Xr sysctl 8 変数を使用可能です: .Bl -tag -width indent .It Em net.inet.ip.dummynet.red_lookup_depth リンクがアイドルの時の、平均キューの計算精度を指定します (デフォルトは 256 であり、0 より大きい必要があります) .It Em net.inet.ip.dummynet.red_avg_pkt_size パケットサイズの平均の期待値を指定します (デフォルトは 512 であり、0 より大きい必要があります) .It Em net.inet.ip.dummynet.red_max_pkt_size パケットサイズの最大値の期待値を指定します。 キューの閾値がバイトの場合のみ使用されます (デフォルトは 1500 であり、0 より大きい必要があります) .El .El .Sh チェックリスト ルールを構成する際に考慮すべき重要な点を述べます。 .Bl -bullet .It かならず送信パケットと受信パケットの両方のパケットをフィルタリングします。 ほとんどのネットワークコネクションではパケットが双方向に流れることが必要です。 .It テストは細心の注意を払って行ないます。テストの際にはコンソールの近くにいる のがよいでしょう。 コンソールに近寄れない場合、 .Pa /usr/share/examples/ipfw/change_rules.sh にあるような自動回復スクリプトを使用してください。 .It ループバックインタフェースのことを忘れてはなりません。 .El .Sh 細かい事柄 .Bl -bullet .It ファイアウォールが常に破棄するパケットが 1 種類あります。 フラグメントオフセットが 1 の TCP パケットフラグメントです。 これはパケットとしては有効なものですが、利用目的はファイアウォールを かいくぐることしかありません。 ログが有効な場合、 これらのパケットはルール -1 により破棄されたと報告されます。 .It ネットワーク越しにログインしている場合、 .Xr kld 4 バージョンの .Nm をロードすることはそれほど単純なことではありません。 以下のコマンドを奨めます。 .Bd -literal -offset indent kldload /modules/ipfw.ko && \e ipfw add 32000 allow ip from any to any .Ed .Pp これに引続き、同じような状況で .Bd -literal -offset indent ipfw flush .Ed .Pp とするのは良くありません。 .It システムセキュリティレベルが 3 以上に設定されている場合、 IP フィルタリストを変更できません (システムセキュリティレベルについては .Xr init 8 を参照してください)。 .El .Sh パケットの行き先変更 指定されたポートにバインドされた .Xr divert 4 ソケットは、 そのポートへ行き先変更されたパケットを、 全部受けとります。 宛先ポートにバインドされたソケットがない場合や、 カーネルがパケットの行き先変更ソケットをサポートするようには コンパイルされていない場合、 パケットは破棄されます。 .Sh SYSCTL 変数 ファイアウォールの動作を制御する .Xr sysctl 8 変数の集合があります。 デフォルト値 (どの値が実際に使用されるかは .Nm sysctl で確認してください) と意味と共に、これらを以下に列挙します。 .Bl -tag -width indent .It Em net.inet.ip.fw.debug : No 1 .Nm が生成するデバッグメッセージを制御します。 .It Em net.inet.ip.fw.one_pass : No 1 セットされると、 .Xr dummynet 4 パイプから出て来たパケットは、ふたたびファイアウォールを通さないようにします。 セットされない場合、pipe 処理のあと、 パケットは再びファイアウォールに挿入され、次のルールから再開されます。 .It Em net.inet.ip.fw.verbose : No 1 冗長なメッセージを出力するようにします。 .It Em net.inet.ip.fw.enable : No 1 ファイアウォールを動作可能にします。 この変数を 0 に設定すると、ファイアウォールをコンパイルして 仕込んでいてもファイアウォールなしで動作します。 .It Em net.inet.ip.fw.verbose_limit : No 0 冗長なファイアウォールが生成するメッセージの数を制限します。 .It Em net.inet.ip.fw.dyn_buckets : No 256 .It Em net.inet.ip.fw.curr_dyn_buckets : No 256 動的ルールを保持するために使用するハッシュ表の設定サイズと 現在のサイズです。この値は 2 のべき乗にする必要があります。 ハッシュ表のサイズの変更は、表が空の場合のみ行なわれます。 したがって、実行中に表のサイズを変更するためには、 .Cm flush してルール集合を再ロードする必要があるでしょう。 .It Em net.inet.ip.fw.dyn_count : No 3 現在の動的ルールの数です (読み込み専用)。 .It Em net.inet.ip.fw.dyn_max : No 1000 動的ルールの最大値です。この限界にいきつくと、 古いルールが無効になるまでは、それ以上、動的ルールを 組み込むことはできません。 .It Em net.inet.ip.fw.dyn_ack_lifetime : No 300 .It Em net.inet.ip.fw.dyn_syn_lifetime : No 20 .It Em net.inet.ip.fw.dyn_fin_lifetime : No 1 .It Em net.inet.ip.fw.dyn_rst_lifetime : No 1 .It Em net.inet.ip.fw.dyn_udp_lifetime : No 5 .It Em net.inet.ip.fw.dyn_short_lifetime : No 30 これらの値は、動的ルールの生存期間を秒単位でコントロールします。 最初の SYN 交換の際に、生存期間が short になり、 SYN を両方とも見た後に増やされ、最後の FIN 交換の間、 または RST が生じる際に再び減らされます。 .El .Sh 使用例 次のコマンドは .Em cracker.evil.org から .Em wolf.tambov.su の telnet ポートへ送られるすべての TCP パケットを拒否するルールを追加します。 .Pp .Dl "ipfw add deny tcp from cracker.evil.org to wolf.tambov.su telnet" .Pp 次のコマンドはクラッカーのネットワーク全体からホスト my への すべてのコネクションを拒否します。 .Pp .Dl "ipfw add deny ip from 123.45.67.0/24 to my.host.org" .Pp 最初に効率良く (動的ルールを用いずに) アクセスを制限する方法は、 次のルールを用いることです。 .Pp .Dl "ipfw add allow tcp from any to any established" .Dl "ipfw add allow tcp from net1 portlist1 to net2 portlist2 setup" .Dl "ipfw add allow tcp from net3 portlist3 to net3 portlist3 setup" .Dl "..." .Dl "ipfw add deny tcp from any to any" .Pp 最初のルールは通常の TCP パケットにすぐにマッチしますが、 最初の SYN パケットにはマッチしません。 指定した発信元/宛先の組の SYN パケットのみ、次の .Cm setup ルールにマッチします。これら以外の SYN パケットは、最後の .Cm deny ルールにより却下されます。 .Pp にせの TCP パケットを含む怒涛の攻撃 (flood attack) から サイトを保護するためには、次の動的ルールを用いた方が安全です。 .Pp .Dl "ipfw add check-state" .Dl "ipfw add deny tcp from any to any established" .Dl "ipfw add allow tcp from my-net to any setup keep-state" .Pp これらのルールにより、ファイアウォールは、自分たちのネットワークの 内側から到着する通常の SYN パケットで始まるコネクションに対して のみ動的ルールを組み込みます。動的ルールは、最初の .Cm check-state ルール、または、 .Cm keep-state ルールに遭遇した時点でチェックされます。 ルール集合のスキャン量を最小にするために、 .Cm check-state ルールは、ルール集合の最初のほうに置くことになるのが普通です。 実際の燃費は変動します。 .Pp ユーザが開ける接続数を制限するには、次のタイプのルールを使用可能です: .Pp .Dl "ipfw add allow tcp from my-net/24 to any setup limit src-addr 10" .Dl "ipfw add allow tcp from any to me setup limit src-addr 4" .Pp 前者 (ゲートウェイ上で動作することを仮定) は、/24 ネット上の各ホストが 最大 10 個の TCP 接続を開くことを許します。 後者は、サーバ上に設定可能であり、 単一のクライアントが同時に 4 個を越える接続を使用できないようにします。 .Pp .Em 注意 : ステートフルなルールは、怒涛の SYN 攻撃により極めて大量の動的ルールを 作ってしまい、サービス不能攻撃を受けることになる可能性があります。 ファイアウォールの動作をコントロールする .Xr sysctl 8 変数に従いファイアウォールが動作することによって、 このような攻撃の影響を部分的にでも制限することはできます。 .Pp 次はカウントされている情報とタイムスタンプ情報を見る .Cm list コマンドのよい例です。 .Pp .Dl ipfw -at list .Pp これはタイムスタンプを省略して次のように指定できます。 .Pp .Dl ipfw -a list .Pp これは次の指定と等価です。 .Pp .Dl ipfw show .Pp 次のルールは 192.168.2.0/24 からのすべての受信パケットを、5000 番のポートに 行き先変更するものです。 .Pp .Dl ipfw divert 5000 ip from 192.168.2.0/24 to any in .Pp 次のルールは、 .Nm と .Xr dummynet 4 をシミュレーションなどで使う際の使用方法を示しています。 .Pp このルールは 5% の確率でランダムにパケットを落します。 .Pp .Dl "ipfw add prob 0.05 deny ip from any to any in" .Pp 同様の効果は dummynet パイプで実現可能です: .Pp .Dl "ipfw add pipe 10 ip from any to any" .Dl "ipfw pipe 10 config plr 0.05" .Pp 人工的にバンド幅を制限するためにパイプを使用可能です。 例えばルータとして動作するマシン上で、 192.168.2.0/24 上のローカルクライアントからのトラフィックを制限したい場合、 次のようにします: .Pp .Dl "ipfw add pipe 1 ip from 192.168.2.0/24 to any out" .Dl "ipfw pipe 1 config bw 300Kbit/s queue 50KBytes" .Pp .Cm out 指示子を使用しているので、ルールが 2 度使われないことに注意してください。 .Nm ルールは、実際には、 入力パケットと出力パケットの両方に適用されることを覚えておいてください。 .Pp バンド幅に制限がある双方向リンクをシミュレートする場合、 正しい方法は次の通りです: .Pp .Dl "ipfw add pipe 1 ip from any to any out" .Dl "ipfw add pipe 2 ip from any to any in" .Dl "ipfw pipe 1 config bw 64Kbit/s queue 10Kbytes" .Dl "ipfw pipe 2 config bw 64Kbit/s queue 10Kbytes" .Pp 上述の方法は非常に有用な場合があり、 例えばあなたの装飾的なウェブページが 低速リンクのみで接続されている在宅ユーザにどう見えているか 知りたい場合に有用です。 半二重メディア (例えば appletalk, Ethernet, IRDA) をシミュレートしたい 場合を除き、単一のパイプを両方の方向に使用すべきではありません。 両方のパイプが同じ設定である必要はないので、 非対称リンクをシミュレート可能です。 .Pp RED キュー管理アルゴリズムを使用してネットワーク性能を検証するには、 次のようにします: .Pp .Dl "ipfw add pipe 1 ip from any to any" .Dl "ipfw pipe 1 config bw 500Kbit/s queue 100 red 0.002/30/80/0.1" .Pp トラフィックシェイパの他の典型的な応用は、 いくばくかの通信遅延を導入することです。 これは、遠隔手続き呼び出しを多用するアプリケーションで、 バンド幅よりも接続のラウンドトリップ時間がしばしば制約条件となる アプリケーションに、大きな影響を与えます: .Pp .Dl "ipfw add pipe 1 ip from any to any out" .Dl "ipfw add pipe 2 ip from any to any in" .Dl "ipfw pipe 1 config delay 250ms bw 1Mbit/s" .Dl "ipfw pipe 2 config delay 250ms bw 1Mbit/s" .Pp フローごとのキューはさまざまな用途に有用です。 非常に単純な用途は、トラフィックの計数です: .Pp .Dl "ipfw add pipe 1 tcp from any to any" .Dl "ipfw add pipe 1 udp from any to any" .Dl "ipfw add pipe 1 ip from any to any" .Dl "ipfw pipe 1 config mask all" .Pp 上述のルールセットは、 すべてのトラフィックに対するキューを生成 (して統計情報を収集) します。 パイプには制限をつけていないので、統計情報を集める効果しかありません。 最後のルールだけでなく 3 個のルールが必要なことに注意してください。 .Nm が IP パケットのマッチを試みるときにポートを考慮しないため、 別々のポート上の接続は我々には同じものに見えます。 .Pp より洗練された例は、 ネットワークの出力トラフィックを、 ネットワーク毎に制約するのではなく、ホスト毎に制約するものです: .Pp .Dl "ipfw add pipe 1 ip from 192.168.2.0/24 to any out" .Dl "ipfw add pipe 2 ip from any to 192.168.2.0/24 in" .Dl "ipfw pipe 1 config mask src-ip 0x000000ff bw 200Kbit/s queue 20Kbytes" .Dl "ipfw pipe 2 config mask dst-ip 0x000000ff bw 200Kbit/s queue 20Kbytes" .Sh 実装に関する注 パケットが .Nm に処理される回数は様々です。 基本的には、カーネル関数 .Fn ip_input , .Fn ip_output , .Fn bdg_forward が起動される度に .Nm が起動されます。 つまり、 終点の 1 個がローカルホストにある接続では、パケットは 1 回処理されます。 終点の 2 個両方がローカルホストにある接続または このホストがルーティングするパケットに対しては、2 回処理されます (ゲートウェイとしての動作)。 このホストがブリッジするパケットに対しては、1 回処理されます (ブリッジとしての動作)。 .Pp .Sh 関連項目 .Xr cpp 1 , .Xr m4 1 , .Xr bridge 4 , .Xr divert 4 , .Xr dummynet 4 , .Xr ip 4 , .Xr ipfirewall 4 , .Xr protocols 5 , .Xr services 5 , .Xr init 8 , .Xr kldload 8 , .Xr reboot 8 , .Xr sysctl 8 , .Xr syslogd 8 .Sh バグ この数年で文法が大きくなってしまい、 非常にすっきりしているとは言い難いです。 .Pp .Em WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!! .Pp このプログラムはコンピュータをかなり使いにくい状態にしてしまう 可能性があります。 はじめて使用する時はコンソール上で実行し、理解していない操作は .Em 絶対に実行しない ようにして下さい。 .Pp 連続したエントリの操作もしくは追加に際し、 サービス名やプロトコル名は使用できません。 .Pp 入ってきたパケットの断片 (フラグメント) が .Cm divert によって行き先を変更されるか .Cm tee されると、ソケットに配送される前にパケットは再構成されます。 .Pp .Cm tee ルールにマッチするパケットは、 即時に受理されるべきではなく、ルールリストを更に通るべきです。 これは、以降のバージョンで修正されるかもしれません。 .Sh 作者 .An Ugen J. S. Antsilevich , .An Poul-Henning Kamp , .An Alex Nash , .An Archie Cobbs , .An Luigi Rizzo . .Pp .An -nosplit API は .An Daniel Boulet が BSDI 用に記述したコードに基づいています。 .Pp .Xr dummynet 4 トラフィックシェイパは Akamba Corp がサポートしました。 .Sh 歴史 .Nm は、 .Fx 2.0 で最初に現れました。 .Xr dummynet 4 は .Fx 2.2.8 から導入されました。 ステートフル拡張は、 .Fx 4.0 から導入されました。