doc/ja/man/man8/ipfw.8
Jun Kuriyama 8a12b9944b Catching up to 3.2-19990619-STABLE.
Reviewed by:	Japanese Online Manual Project <man-jp@jp.FreeBSD.ORG>
Submitted by:	Kazuo Horikawa <k-horik@yk.rim.or.jp>
1999-06-20 12:44:59 +00:00

612 lines
16 KiB
Groff

.\"
.\" %Id: ipfw.8,v 1.47.2.5 1999/06/17 13:03:37 ru Exp %
.\"
.\" jpman %Id: ipfw.8,v 1.4 1997/05/19 17:19:51 horikawa Stab %
.Dd July 20, 1996
.Dt IPFW 8 SMM
.Os FreeBSD
.Sh 名称
.Nm ipfw
.Nd IPファイアウォール制御ユーティリィティ
.Sh 書式
.Nm ipfw
.Op Fl q
.Oo
.Fl p Ar preproc
.Op Fl D Ar macro Ns Op Ns =value
.Op Fl U Ar macro
.Oc
.Ar file
.Nm ipfw
.Oo
.Fl f
|
.Fl q
.Oc
flush
.Nm ipfw
.Oo
.Fl q
.Oc
zero
.Op Ar number ...
.Nm ipfw
delete
.Ar number ...
.Nm ipfw
.Op Fl aftN
list
.Op Ar number ...
.Nm ipfw
.Oo
.Fl ftN
.Oc
show
.Op Ar number ...
.Nm ipfw
.Oo
.Fl q
.Oc
add
.Op Ar number
.Ar action
.Op log
.Ar proto
from
.Ar src
to
.Ar dst
.Op via Ar name | ipno
.Op Ar options
.Sh 解説
書式の 1 行目のようにファイル名を指定した場合は、
.Ar file
を 1 行ずつ、引数として読み込みます。
.Pp
.Fl p Ar preproc
を使用して、
.Ar file
がパイプされるプリプロセッサを指定することもできます。
有用なプリプロセッサには
.Xr cpp 1
.Xr m4 1
があります。
.Ar preproc
の最初の文字がスラッシュから始まらない場合、
.Ev PATH
を使用した通常の名前検索行われます。
.Nm
が実行されるときまでに全ファイルシステムが (まだ) マウントされないような環境
(例えば NFS 経由でマウントされる場合) では、本件に注意してください。
ひとたび
.Fl p
が指定されると、オプションの
.Fl D
.Fl U
の指定を続けることが可能となり、これらがプリプロセッサに渡されます。
これにより、(ローカルホスト名により条件付けするなど)
柔軟性のある設定ファイルを作成可能となり、IP アドレスのように
頻繁に必要となる引数を集中管理するためのマクロを使用可能となります。
.Pp
.Nm
はパケットごとに、マッチするルールが見つかるまでルールリストを調べます。
各ルールにはパケット数とパケットサイズの 2 つのカウンタが用意されていて、
パケットがマッチするとカウンタ値は更新されます。
.Pp
全ルールは 1 から 65534 の範囲の行番号で順序付けられます。この番号によって
ルールの並べ変えと削除を行ないます。
ルールのマッチングは昇順で行なわれ、最初にマッチしたものが適用されます。
複数のルールが同じ番号を共有することも可能です。この場合はルールが追加された
順序でマッチングが行なわれます。
.Pp
番号を指定せずにルールを追加した場合は、
既に定義されているルールの最大の番号に 100 を加えたものとなります。
ルールの番号が 65435 以上の場合は、新しいルールは同じ番号が与えられます。
.Pp
delete 操作は
.Ar number
で指定された番号を持つ最初のルールを、もし有れば、削除します。
.Pp
list 操作は現在のルール一覧を出力します。
.Pp
show 操作は `ipfw -a list' と同じ結果を出力します。
.Pp
zero 操作は
.Ar number
で指定された番号を持つルールのカウンタをクリアします。
.Pp
flush 操作は全ルールを削除します。
.Pp
記号 `#' で始まる行および空行は無視されます。
.Pp
どんな場合でも次のルールは存在します:
.Bd -literal -offset center
65535 deny all from any to any
.Ed
.Pp
全パケットを拒否するのがデフォルトのポリシです。
これを修正し、必要なルールを設定して下さい。
.Pp
しかしながら、カーネルオプション
.Dq IPFIREWALL_DEFAULT_TO_ACCEPT
が有効な場合、ルールは次のようになります:
.Bd -literal -offset center
65535 allow all from any to any
.Ed
.Pp
このバリエーションではすべてが通過可能です。
このオプションを有効にしてよいのは特定の状況だけであり、
例えば通常は解放しており、
必要に応じてサービス拒否 (denial-of-service) フィルタとなる
ファイアウォールシステムを使用する場合がこれに該当します。
.Pp
オプションは以下のものが利用可能です。
.Bl -tag -width indent
.It Fl a
list 操作の時、カウンタの値を表示します。
show の項を参照のこと。
.It Fl f
操作を実行する際に確認メッセージを表示しません。
flush 操作も無条件に実行されます。
.Ar (注意)
プロセスに tty が関連付けられていない場合には、
このオプションが指定されているものとして実行されます。
.It Fl q
ルールを add, zero, flush する際に、メッセージの出力を抑制します (
.Fl f
も含まれます)。
このオプションは、リモートログインセッションでルールを調整する際に、
(例えば sh /etc/rc.firewall のようにして)
スクリプトの中から複数の ipfw コマンド
実行する場合や、
多数の ipfw ルールを記述したファイルを用いる場合に
便利です。
flush 操作が通常の (冗舌な) 状態 (デフォルトのカーネルの設定)
で実行されると、メッセージが出力されます。
ここで、すべてのルールは削除されるので、メッセージをログインセッションに
送ることができず、ログインセッションがクローズされてしまうので、
残りのルールセットは実行されません。
この状態を修復するにはコンソールへのアクセスが必要となります。
.It Fl t
list 操作の時に、最後にマッチしたパケットのタイムスタンプを表示します。
.It Fl N
IPアドレスとサービス名をリゾルブしてホスト名で表示します。
.El
.Pp
.Ar action :
.Bl -hang -offset flag -width 1234567890123456
.It Ar allow
マッチするパケットを通過させ、マッチングを終了します。
.Ar pass ,
.Ar permit ,
.Ar accept
と同じです。
.It Ar deny
マッチするパケットを破棄し、マッチングを終了します。
.Ar drop
.Ar deny
と同じです。
.It Ar reject
(価値が低下しています。)
マッチするパケットを破棄し、
ICMP の host unreachable を送信して、終了します。
.It Ar unreach code
マッチするパケットを破棄し、
ICMP の unreachable に
.Ar code
を付けて送信します。
.Ar code
は、0 から 256 までの数字、もしくは、以下に列挙する別名のいずれかです:
.Ar net,
.Ar host ,
.Ar protocol ,
.Ar port ,
.Ar needfrag ,
.Ar srcfail ,
.Ar net-unknown ,
.Ar host-unknown ,
.Ar isolated ,
.Ar net-prohib ,
.Ar host-prohib ,
.Ar tosnet ,
.Ar toshost ,
.Ar filter-prohib ,
.Ar host-precedence ,
.Ar precedence-cutoff
。送信後、終了します。
.It Ar reset
TCP パケットのみに対応。
パケットを破棄し、TCP の (RST) を送信し、終了します。
.It Ar count
マッチするパケットのカウンタを更新し、引続きマッチングを行ないます。
.It Ar divert port
マッチするパケットを
.Ar port
で指定されたポートにバインドされている
.Xr divert 4
ソケットに送り、マッチングを終了します。
.It Ar tee port
マッチするパケットのコピーを
.Ar port
で指定されたポートにバインドされている
.Xr divert 4
ソケットに送り、引続きマッチングを行ないます。
この機能は未実装です。
.It Ar fwd ipaddr Op ,port
マッチしたパケットの次のホップを
.Ar ipaddr
に変更します。これはドット付き 4 つ組の IP アドレスでもホスト名でもよいです。
.Ar ipaddr
が直接到達可能なアドレスではない場合、その IP に対して
ローカルルーティングテーブルでみつかる経路を使用します。
.Ar ipaddr
がローカルアドレスの場合、
リモートホストからこのシステムにパケットが到着すると、
そのパケットをローカルマシンの
.Ar port
に転換します。
その際、
ソケットのローカルアドレスは、
パケットの元々の宛先の IP アドレスのままとします。
これは透過的プロキシサーバのためにあります。
IP が ローカルアドレスではない場合、ポート番号は (指定されていても) 無視され、
ルールはシステムから出て行くパケットに対してのみ適用されます。
また、」
パケットローカルに生成された時にもアドレスをローカルポートにマップします。
検索はルールがマッチしたときに終了します。
ポート番号が与えられなかった場合、パケット中のポート番号が使用され、
外部マシンのポート Y へのパケットは ローカルポート Y へ転送されます。
カーネルは、
オプション IPFIREWALL_FORWARD 付きでコンパイルされている必要があります。
.It Ar skipto number
.Ar number
より小さな番号のルールを飛び越して、
.Ar number
以上の番号のルールで最初に存在するものから、マッチングを継続します。
.El
.Pp
パケットが
.Ar divert
.Ar tee
のどちらかひとつ以上、もしくは両方の組み合わせの、複数のルールにマッチした場合、
最後のものを除き、無視します。
.Pp
カーネルが
.Dv IPFIREWALL_VERBOSE
オプション付きでコンパイルされている場合に、``log'' が指定されているルールと
マッチした時は、メッセージをコンソールに表示します。
もし、
.Dv IPFIREWALL_VERBOSE_LIMIT
オプション付きでコンパイルされている場合、一連のルールに対し指定されたパケット
数を受信した後、メッセージの表示を中止します。
パケットのカウンタをクリアすれば再びメッセージを出力します。
.Pp
コンソールへの表示とその制限数は、
.Xr sysctl 8
を通し、直接設定できます。
.Pp
.Ar proto :
.Bl -hang -offset flag -width 1234567890123456
.It Ar ip
全パケットがマッチします。別名
.Ar all
も使えます。
.It Ar tcp
TCP パケットのみマッチします。
.It Ar udp
UDP パケットのみマッチします。
.It Ar icmp
ICMP パケットのみマッチします。
.It Ar <number|name>
指定されたプロトコルのパケットのみマッチします (
.Pa /etc/protocols
のリストを参照の事)
.El
.Pp
.Ar src
.Ar dst :
.Pp
.Bl -hang -offset flag
.It Ar <address/mask>
.Op Ar ports
.El
.Pp
.Em <address/mask>
は以下のように指定できます。
.Bl -hang -offset flag -width 1234567890123456
.It Ar ipno
IP番号を 1.2.3.4 の形式で指定します。指定されたアドレスのみがマッチします。
.It Ar ipno/bits
IP番号とネットマスクの幅を 1.2.3.4/24 の形式で指定します。
この場合は 1.2.3.0 から 1.2.3.255 のアドレスがマッチします。
.It Ar ipno:mask
IP番号とネットマスクの幅を 1.2.3.4:255.255.240.0 の形式で指定します。
この場合は 1.2.0.0 から 1.2.15.255 のアドレスがマッチします。
.El
.Pp
アドレスの前に ``not'' を付けることによって、マッチの意味を反転させる
ことができます (指定されたアドレス以外の総てのアドレスがマッチします)。
これはポート番号には影響しません。
.Pp
TCP と UDP ではさらに、
.Em ports
を以下のように指定できます。
.Pp
.Bl -hang -offset flag
.It Ns {port|port-port} Ns Op ,port Ns Op ,...
.El
.Pp
ポート番号の代わりに (ファイル
.Pa /etc/services
から取った) サービス名を使用できます。
port-port の書式で、最初の値に限り範囲指定できます。
列挙出来るポート数は
.Pa /usr/src/sys/netinet/ip_fw.h
.Dv IP_FW_MAX_PORTS
として定義されています。
.Ql \e
を使用することにより、サービス名中の
.Ql -
文字をエスケープ可能です:
.Pp
.Dl ipfw add count tcp from any ftp\e\e-data-ftp to any
.Pp
断片化されたパケットでオフセットが非 0 のもの
(すなわち、最初の断片ではないもの) は、
1 つ以上のポート仕様を持つルールにはマッチしません。
断片化されたパケットへのマッチングに関する詳細は
.Ar frag
オプションを参照してください。
.Pp
マッチングのルールは、入ってくるパケットか、出ていくパケット、もしくはその両方
に対し適応されます。
.Ar in
を指定すれば、入ってくるパケットのみにルールを適応します。
.Ar out
を指定すれば、出ていくパケットのみに適応します。
.Pp
特定のインタフェースを通過するパケットには、
.Ar via
を用いてインタフェースを指定します:
.Bl -hang -offset flag -width 1234567890123456
.It Ar via ifX
.Ar ifX
を通過するパケットを指定します。
.It Ar via if*
.Ar ifX
を通過するパケットを指定します。X はいずれかのユニットの番号です。
.It Ar via any
.Em いずれか
のインタフェースを通過するパケットを指定します。
.It Ar via ipno
IP アドレスが
.Ar ipno
のインタフェースを通過するパケットを指定します。
.El
.Pp
.Ar via
を用いると、常時指定されたインタフェースがチェックされます。
.Ar recv
.Ar xmit
を、
.Ar via
の代わりに指定すると、
受信、もしくは送信インタフェースのみが (各々に) チェックされます。
両方を指定すれば、
受信と送信の両方のインタフェースを通るパケットを指定できます。
例 :
.Pp
.Dl "ipfw add 100 deny ip from any to any out recv ed0 xmit ed1"
.Pp
.Ar recv
で指定したインタフェースでは、受信と送信、両方のパケットをチェックできます。
それに対し、
.Ar xmit
で指定したインタフェースでは、送信パケットのみとなります。
それゆえに、
.Ar xmit
を指定すると
.Ar out
が、必須です (
.Ar in
は不可)。
.Ar via
と共に
.Ar xmit
もしくは、
.Ar recv
を指定する事はできません。
.Pp
個々のパケットは、受信用ないし送信用インタフェースを持たないかもしれません。
ローカルホストで発生したパケットには受信用のインタフェースはないし、
ローカルホスト内宛のパケットは、送信用インタフェースが有りません。
.Pp
追加用
.Ar options :
.Bl -hang -offset flag -width 1234567890123456
.It frag
パケットが断片 (フラグメント) 化されたデータグラムの一部で、かつデータグラムの
先頭の断片でない場合にマッチします。
.Ar frag
を、
.Ar tcpflags
や TCP/UDP ポート仕様と共に使用することはできません。
.It in
ネットワークから受信したパケットのみマッチします。
.It out
ネットワークへ送信するパケットのみマッチします。
.It ipoptions Ar spec
IP ヘッダが、
.Ar spec
に指定されたコンマで区切られたオプションのリストを含む場合にのみマッチします。
サポートされている IP オプションは
.Ar ssrr
(strict source route),
.Ar lsrr
(loose source route),
.Ar rr
(record packet route),
.Ar ts
(timestamp) です。
``!'' によって、特定のオプションを含めないよう指定できます。
.It established
RST または ACK ビットがセットされているパケットのみマッチします。
このビットがセットされることがあるのは TCP のパケットのみです。
.It setup
SYN ビットがセットされ ACK がセットされていないパケットのみマッチします。
このビットがセットされることがあるのは TCP のパケットのみです。
.It tcpflags Ar spec
TCP ヘッダが
.Ar spec
に指定されたコンマで区切られたフラグのリストを含む場合にのみマッチします。
サポートされているフラグは、
.Ar fin ,
.Ar syn ,
.Ar rst ,
.Ar psh ,
.Ar ack ,
.Ar urg
です。
``!'' によって、特定のフラグを含めないよう指定できます。
.Ar tcpflags
仕様を含むルールは非 0 のオフセットを持つ断片化されたパケットに
マッチすることはありません。
断片化されたパケットに関するマッチについての詳細は
.Ar frag
オプションを参照してください。
.It icmptypes Ar types
ICMP タイプが
.Ar types
で指定されたリスト中に存在する場合にのみ適用されるルールとなります。
リストはレンジの組み合わせでも、各タイプをコンマで区切ったものでもどちらでも
かまいません。
.El
.Sh チェックリスト
ルールを構成する際に考慮すべき重要な点を述べます。
.Bl -bullet -hang -offset flag
.It
かならず送信パケットと受信パケットの両方のパケットをフィルタリングします。
ほとんどのネットワークコネクションではパケットが双方向に流れることが必要です。
.It
テストは細心の注意を払って行ないます。テストの際にはコンソールの近くにいる
のがよいでしょう。
.It
ループバックインタフェースのことを忘れてはなりません。
.El
.Sh 長所
ファイアウォールが常に破棄するパケットが 1 種類あります。
フラグメントオフセットが 1 のフラグメントパケットです。
これはパケットとしては有効なものですが、利用目的はファイアウォールを
かいくぐることしかありません。
.Pp
ネットワーク越しにログインしている場合、KLD 版の
.Nm
をロードすることはそれほど単純なことではありません。
以下のコマンドを奨めます。
.Bd -literal -offset center
kldload /modules/ipfw.ko && \e
ipfw add 32000 allow all from any to any
.Ed
.Pp
これに引続き、同じような状況で
.Bd -literal -offset center
ipfw flush
.Ed
.Pp
とするのは良くありません。
.Pp
システムセキュリティレベルが 3 以上に設定されている場合、
IP フィルタリストを変更できません (システムセキュリティレベルについては
.Xr init 8
を参照してください)。
.Sh パケットの行き先変更
指定されたポートを見ているソケットは、そのポートへ行き先変更されたパケットを、
全部受けとります。
.Xr divert 4
を参照して下さい。ポートを見ているソケットがない場合やカーネルがパケットの
行き先変更をサポートするようにはコンパイルされていない場合、
パケットは破棄されます。
.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 23
.Pp
次のコマンドはネットワーク hackers からホスト my へのすべてのコネクションを
拒否します。
.Pp
.Dl ipfw add deny all from 123.45.67.0/24 to my.host.org
.Pp
次はカウントされている情報とタイムスタンプを見る例です
.Pp
.Dl ipfw -at l
.Pp
これはタイムスタンプを省略して次のように指定できます。
.Pp
.Dl ipfw -a l
.Pp
次のルールは 192.168.2.0/24 からのすべての受信パケットを、5000 番のポートに
行き先変更するものです。
.Pp
.Dl ipfw divert 5000 all from 192.168.2.0/24 to any in
.Sh 関連項目
.Xr cpp 1 ,
.Xr m4 1 ,
.Xr divert 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
入ってきたパケットの断片 (フラグメント) が
.Ar divert
によって行き先を変更されると、ソケットに配送される前に、組み立て直しをします。
それに対し、
.Ar tee
を経由した断片 (フラグメント) は、組み立て直しされません。
.Pp
ポートの別名でダッシュ (-) を含むものは、リストの最初には書けません。
.Pp
``tee'' アクションは未実装です。
.Sh 作者
.An Ugen J. S. Antsilevich ,
.An Poul-Henning Kamp ,
.An Alex Nash ,
.An Archie Cobbs .
API は
.An Daniel Boulet
が BSDI 向けに記述したコードに基づいています。
.Sh 歴史
.Nm
は、
.Fx 2.0
で最初に現れました。