日本語 man コマンド類 (ja-man-1.1h) と日本語 man ドキュメント (ja-man-doc-2.2 (2.2.X 用) または ja-man-doc-3.4 (3.4-RELEASE 用)) をインストールすると、以下のような manコマンド閲覧、キーワード検索がコンソールからできるようになります。
試験的に 3.1-RELEASE のみ man3 を検索できるようにしました
IPFW(8) FreeBSD System Manager's Manual IPFW(8)
名称
ipfw - IP ファイアウォール制御ユーティリィティ
書式
ipfw [-q] file
ipfw [-f | -q] flush
ipfw [-q] zero [number ...]
ipfw delete number ...
ipfw [-aftN] list [number ...]
ipfw [-ftN] show [number ...]
ipfw [-q] add [number] action [log] proto from src to dst [via name |
ipno] [options]
解説
書式の 1 行目のようにファイル名を指定した場合は、 file を 1 行ずつ、引数
として読み込みます。
ipfw はパケットごとに、マッチするルールが見つかるまでルールリストを調べま
す。各ルールにはパケット数とパケットサイズの 2 つのカウンタが用意されてい
て、パケットがマッチするとカウンタ値は更新されます。
全ルールは 1 から 65534 の範囲の行番号で順序付けられます。この番号によっ
てルールの並べ変えと削除を行ないます。ルールのマッチングは昇順で行なわ
れ、最初にマッチしたものが適用されます。複数のルールが同じ番号を共有する
ことも可能です。この場合はルールが追加された順序でマッチングが行なわれま
す。
番号を指定せずにルールを追加した場合は、直前のルールの番号に 100 を加えた
ものとなります。ルールの番号が 65434 より大きい場合は、新しいルールは最後
のルールに追加されます。
delete 操作は number で指定された番号を持つ最初のルールを、もし有れば、削
除します。
list 操作は現在のルール一覧を出力します。
show 操作は `ipfw -a list' と同じ結果を出力します。
zero 操作は number で指定された番号を持つルールのカウンタをクリアします。
flush 操作は全ルールを削除します。
記号 `#' で始まる行および空行は無視されます。
どんな場合でも次のルールは存在します:
65535 deny all from any to any
全パケットを拒否するのがデフォルトのポリシーです。これを修正し、必要なル
ールを設定して下さい。
オプションは以下のものが利用可能です。
-a list 操作の時、カウンタの値を表示します。show の項を参照のこと。
-f 操作を実行する際に確認メッセージを表示しません。flush 操作も無条件
に実行されます。 (注意)プロセスに tty が関連付けられていない場合
には、このオプションが指定されているものとして実行されます。
-q ルールを add, zero, flush する際に、メッセージの出力を抑制します (
-f も含まれます)。このオプションは、リモートログインセッションでル
ールを調整する際に、(例えば sh /etc/rc.firewall のようにして) スク
リプトの中から複数の ipfw コマンドを実行する場合や、多数の ipfw ル
ールを記述したファイルを用いる場合に便利です。flush 操作が通常の
(冗舌な) 状態で実行されると、メッセージが出力されます。ここで、すべ
てのルールは削除されるので、メッセージをログインセッションに送るこ
とができず、ログインセッションがクローズされてしまうので、残りのル
ールセットは実行されません。この状態を修復するにはコンソールへのア
クセスが必要となります。
-t list 操作の時に、最後にマッチしたパケットのタイムスタンプを表示しま
す。
-N IP アドレスとサービス名をリゾルブしてホスト名で表示します。
action:
allow マッチするパケットを通過させ、マッチングを終了しま
す。 pass, permit, accept と同じです。
deny マッチするパケットを破棄し、マッチングを終了しま
す。 drop は deny と同じです。
reject (パケットを送らないよう嘆願) マッチするパケットを破
棄し、ICMP の host unreachable を送信して、終了しま
す。
unreach code パケットを破棄し、ICMP の unreachable に code を付
けて送信します。 code は、0 から 256 までの数字、も
しくは、以下に列挙する別名のいずれかです: net,
host, protocol, port, needfrag, srcfail, net-
unknown, host-unknown, isolated, net-prohib, host-
prohib, tosnet, toshost, filter-prohib, host-
precedence, precedence-cutoff。送信後、終了します。
reset TCP パケットのみに対応。パケットを破棄し、TCP の
(RST) を送信し、終了します。
count マッチするパケットのカウンタを更新し、引続きマッチ
ングを行ないます。
divert port マッチするパケットを port で指定されたポートにバイ
ンドされている divert(4) ソケットに送り、マッチング
を終了します。
tee port マッチするパケットのコピーを port で指定されたポー
トにバインドされている divert(4) ソケットに送り、引
続きマッチングを行ないます。
skipto number number より小さな番号のルールを飛び越して、 number
以上の番号のルールで最初に存在するものから、マッチ
ングを継続します。
パケットが divert や tee のどちらかひとつ以上、もしくは両方の組合せの、複
数のルールにマッチした場合、最後のものを除き、無視します。
カーネルが IPFIREWALL_VERBOSE オプション付きでコンパイルされている場合
に、``log'' が指定されているルールとマッチした時は、メッセージをコンソー
ルに表示します。もし、 IPFIREWALL_VERBOSE_LIMIT オプション付きでコンパイ
ルされている場合、一連のルールに対し指定されたパケット数を受信した後、
メッセージの表示を中止します。パケットのカウンタをクリアすれば再びメッセ
ージを出力します。
コンソールへの表示とその制限数は、 sysctl(8) を通し、直接設定できます。
proto:
ip 全パケットがマッチします。別名 all も使えます。
tcp TCP パケットのみマッチします。
udp UDP パケットのみマッチします。
icmp ICMP パケットのみマッチします。
<number|name> 指定されたプロトコルのパケットのみマッチします (
/etc/protocols のリストを参照の事)
src と dst:
<address/mask> [ports]
<address/mask> は以下のように指定できます。
ipno IP 番号を 1.2.3.4 の形式で指定します。指定されたア
ドレスのみがマッチします。
ipno/bits IP 番号とネットマスクの幅を 1.2.3.4/24 の形式で指定
します。この場合は 1.2.3.0 から 1.2.3.255 のアドレ
スがマッチします。
ipno:mask IP 番号とネットマスクの幅を 1.2.3.4:255.255.240.0
の形式で指定します。この場合は 1.2.0.0 から
1.2.15.255 のアドレスがマッチします。
アドレスの前に ``not'' を付けることによって、マッチの意味を反転させること
ができます (指定されたアドレス以外の総てのアドレスがマッチします)。これは
ポート番号には影響しません。
TCP と UDP ではさらに、 ports を以下のように指定できます。
{port|port-port}[,port[,...]]
ポート番号の代わりに (ファイル /etc/services から取った) サービス名を使用
できます。port-port の書式で、最初の値に限り範囲指定できます。列挙出来る
ポート数は /usr/src/sys/netinet/ip_fw.h で IP_FW_MAX_PORTS として定義され
ています。
断片化されたパケットでオフセットが非 0 のもの (すなわち、最初の断片ではな
いもの) は、一つ以上のポート仕様を持つルールにはマッチしません。?断片化
されたパケットへのマッチングに関する詳細は frag オプションを参照してくだ
さい。
マッチングのルールは、入ってくるパケットか、出ていくパケット、もしくはそ
の両方に対し適応されます。 in を指定すれば、入ってくるパケットのみにルー
ルを適応します。 out を指定すれば、出ていくパケットのみに適応します。
特定のインタフェースを通過するパケットには、 via を用いてインタフェースを
指定します:
via ifX ifX を通過するパケットを指定します。
via if* ifX を通過するパケットを指定します。X はいずれかの
ユニットの番号です。
via any いずれかのインタフェースを通過するパケットを指定し
ます。
via ipno IP アドレスが ipno のインタフェースを通過するパケッ
トを指定します。
via を用いると、常時指定されたインタフェースがチェックされます。 recv や
xmit を、 via の代わりに指定すると、受信、もしくは送信インタフェースのみ
が (各々に) チェックされます。両方を指定すれば、受信と送信の両方のインタ
フェースを通るパケットを指定できます。例:
ipfw add 100 deny ip from any to any out recv ed0 xmit ed1
recv で指定したインタフェースでは、受信と送信、両方のパケットをチェックで
きます。それに対し、 xmit で指定したインタフェースでは、送信パケットのみ
となります。それゆえに、 xmit を指定すると out が、必須です ( in は不
可)。 via と共に xmit もしくは、 recv を指定する事はできません。
個々のパケットは、受信用ないし送信用インタフェースを持たないかもしれませ
ん。ローカルホストで発生したパケットには受信用のインタフェースはないし、
ローカルホスト内宛のパケットは、送信用インタフェースが有りません。
追加用 options:
frag パケットが断片 (フラグメント) 化されたデータグラム
の一部で、かつデータグラムの先頭の断片でない場合に
マッチします。 frag を、 tcpflags や TCP/UDP ポート
仕様と共に使用することはできません。
in ネットワークから受信したパケットのみマッチします。
out ネットワークへ送信するパケットのみマッチします。
ipoptions spec IP ヘッダが、 spec に指定されたコンマで区切られたオ
プションのリストを含む場合にのみマッチします。サポ
ートされている IP オプションは ssrr (strict source
route), lsrr (loose source route), rr (record pack-
et route), ts (timestamp) です。``!'' によって、特
定のオプションを含めないよう指定できます。
established RST または ACK ビットがセットされているパケットのみ
マッチします。このビットがセットされることがあるの
は TCP のパケットのみです。
setup SYN ビットがセットされ ACK がセットされていないパ
ケットのみマッチします。このビットがセットされるこ
とがあるのは TCP のパケットのみです。
tcpflags spec TCP ヘッダが spec に指定されたコンマで区切られたフ
ラグのリストを含む場合にのみマッチします。サポート
されているフラグは、 fin, syn, rst, psh, ack, urg
です。``!'' によって、特定のフラグを含めないよう指
定できます。 tcpflags 仕様を含むルールは非 0 のオフ
セットを持つ断片化されたパケットにマッチすることは
ありません。断片化されたパケットに関するマッチにつ
いての詳細は frag オプションを参照してください。
icmptypes types ICMP タイプが types で指定されたリスト中に存在する
場合にのみ適用されるルールとなります。リストはレン
ジの組み合わせでも、各タイプをコンマで区切ったもの
でもどちらでもかまいません。
チェックリスト
ルールを構成する際に考慮すべき重要な点を述べます。
+o かならず送信パケットと受信パケットの両方のパケットをフィルタリン
グします。ほとんどのネットワークコネクションではパケットが双方向
に流れることが必要です。
+o テストは細心の注意を払って行ないます。テストの際にはコンソールの
近くにいるのがよいでしょう。
+o ループバックインタフェースのことを忘れてはなりません。
長所
ファイアウォールが常に破棄するパケットが 1 種類あります。フラグメントオフ
セットが 1 のフラグメントパケットです。これはパケットとしては有効なもので
すが、利用目的はファイアウォールをかいくぐることしかありません。
ネットワーク越しにログインしている場合、LKM 版の ipfw をロードすることは
それほど単純なことではありません。以下のコマンドを奨めます。
modload /lkm/ipfw_mod.o && \
ipfw add 32000 allow all from any to any
これに引続き、同じような状況で
ipfw flush
とするのは良くありません。
パケットの行き先変更
指定されたポートを見ているソケットは、そのポートへ行き先変更されたパケッ
トを、全部受けとります。 divert(4) を参照して下さい。ポートを見ているソ
ケットがない場合やカーネルがパケットの行き先変更をサポートするようにはコ
ンパイルされていない場合、パケットは破棄されます。
使用例
次のコマンドは hacker.evil.org から wolf.tambov.su の telnet ポートへ送ら
れる全ての TCP パケットを拒否するルールを追加します。
ipfw add deny tcp from hacker.evil.org to wolf.tambov.su 23
次のコマンドはネットワーク hackers からホスト my への全てのコネクションを
拒否します。
ipfw add deny all from 123.45.67.0/24 to my.host.org
次はカウントされている情報とタイムスタンプを見る例です
ipfw -at l
これはタイムスタンプを省略して次のように指定できます。
ipfw -a l
次のルールは 192.168.2.0/24 からの全ての受信パケットを、5000 番のポートに
行き先変更するものです。
ipfw divert 5000 all from 192.168.2.0/24 to any in
関連項目
ip(4), ipfirewall(4), divert(4), protocols(5), services(5),
reboot(8), syslogd(8), sysctl(8)
バグ
WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!WARNING!!
このプログラムはコンピュータをかなり使いにくい状態にしてしまう可能性があ
ります。はじめて使用する時はコンソール上で実行し、理解していない操作は 絶
対に実行しないようにして下さい。
連続したエントリの操作もしくは追加に際し、サービス名やプロトコル名は使用
できません。
入ってきたパケットの断片 (フラグメント) が divert によって行き先を変更さ
れると、ソケットに配送される前に、組み立て直しをします。それに対し、 tee
を経由した断片 (フラグメント) は、組み立て直しされません。
ポートの別名でダッシュ (-) を含むものは、リストの最初には書けません。
作者
Ugen J. S. Antsilevich,
Poul-Henning Kamp,
Alex Nash,
Archie Cobbs. API は
Daniel Boulet が BSDI 向けに記述したコードに基づいています。
歴史
ipfw は、FreeBSD 2.0 で最初に現れました。
FreeBSD July 20, 1996 6