IP FILTER(4) | FreeBSD Kernel Interfaces Manual | IP FILTER(4) |
名称
ipfilter - IP パケットフィルタリング入門解説
IP フィルタは、ファイアウォール環境で使用するのに適している、 TCP/IP パケットフィルタです。使用するためには、ロード可能なカーネルモジュールとして使用するか、または利用者の UNIX カーネルに組み入れることができます。可能であれば、ロード可能なカーネルモジュールとしての使用が、勧められます。要求に応じて、インストールしてシステムファイルをパッチするためのスクリプトが提供されています。特徴
IP パケットフィルタは、次のことができます:- 明示的に通過するあらゆるパケットを拒否/許可します
- 様々なインタフェースを区別します
- IP ネットワークまたはホストをフィルタリングします
- 選択的にあらゆる IP プロトコルをフィルタリングします
- 選択的にフラグメント化された IP パケットをフィルタリングします
- 選択的に IP オプションがあるパケットをフィルタリングします
- ブロックされたパケットのための ICMP エラー/TCP リセットを送り返します
- TCP、UDP と ICMP パケットフローのためのパケット状態情報を保持します
- すべてのフラグメントに同じ規則を適用して、あらゆる IP パケットのためのフラグメントに状態情報を保持します
- ネットワークアドレストランスレータ (Network Address Translator) (NAT) として動作します
- 真のトランスペアレントなプロキシ (proxy) 接続をセットアップするリダイレクション (redirection) を使用します。
- 認証のためのユーザプログラムにパケットヘッダの詳細を供給します
- さらに、通過するパケットのためのあらかじめ認証された規則の一時的な記憶域をサポートします
特別の規定 (provision) は、3 つの最も共通のインターネットプロトコル、 TCP、UDP と ICMP のために行われます。 IP パケットフィルタによって、次のフィルタリングを行えます:
- ポート番号またはポート番号の範囲によって TCP/UDP パケットと一致する反転されたホスト/ネット。
- タイプ/コードによる ICMP パケット
- "確立された" TCP パケット
- TCP フラグのあらゆる任意の組み合わせで
- 不完全なヘッダがある "短い" (フラグメント化された) IP パケットをフィルタリングすることができます
- パケット中の 19 の IP オプションのいずれか、または 8 つの登録された IP セキュリティクラスの TOS (Type of Service) フィールド
IP パケットフィルタの性能の経過を追うために、ログ記録を行うデバイスは、次のログ記録をサポートするために使用されます:
- TCP/UDP/ICMP と IP パケットヘッダ
- (ヘッダを含む) パケットの最初の 128 バイト
次の場合に、パケットをログ記録することができます:
- 成功して通過します
- 通過することからブロックされます
- 疑わしいパケットを検索するための規則のセットアップと一致します
IP フィルタは、次の統計のそれ自身の設定を保持します:
- ブロックされたパケット
- アカウンティングのために使用されたパケット (とバイト!)
- 渡されたパケット
- ログ記録されたパケット
- (バッファが満杯) 失敗したログ記録する試み
-
そして、さらに、着信と発信の両方のパケットのための
ツール
現在の実装は、容易に使用でき、正規の unix シェルとツールに統合することができる、ツールの小さなセットを提供しています。ツールの簡潔な説明は、次に与えます:ipf(8) は、stdin またはファイルのいずれかから、1 組の規則を読み込み、それらをカーネルの現在のリスト (の後ろ) に追加します。また、現在のフィルタのセットをフラッシュするか、または個々のフィルタ規則を削除するために使用することができます。ファイル形式は、ipf(5) に記述されています。
ipfs(8) は、IP フィルタカーネルテーブル (状態テーブルと NAT マッピング) を一時的にをロックするユーティリティで、ディスクにそれらを書き込みます。その後、システムをリブートすることができ、ディスクから、これらのテーブルを読み込み、カーネルにそれらを復元するために ipfs を使用することができます。このように、終了している接続なしでシステムをリブートすることができます。
ipfstat(8) は、今までのところ、パケットフィルタリングで統計のためにカーネルに問い合わせ、着信と発信パケットのための操作でフィルタのリストを検索します。
ipftest(1) は、フィルタ規則ファイルを読み込み、次に、規則ファイルにサンプル IP パケットを適用します。これによって、フィルタリストのテストとパケットがそれによってどのように渡されたかの試験を許可します。
ipmon(8) は、次のいずれかの出力のためのログ記録デバイス (デフォルトは、/dev/ipl) からバッファリングされたデータを読み込みます:
- 画面 (標準出力)
- ファイル
- syslog
ipsend(1) は、イーサネットに接続されたマシンのための任意の IP パケットを生成します。
ipresend(1) は、保存された IP パケットのデータファイル (すなわち、snoop/tcpdump/etherfind 出力) を読み込み、ネットワークを介してそれを送り返します。
iptest(1) は、一連の IP パケットを送出し、TCP/IP スタックの強さのテストを目的としている、1 組のテスト "プログラム"を含んでいます。警告: これは、ターゲットとされた (複数の) マシンを壊すかもしれません!
ipnat(8) は、stdin またはファイルのいずれかから、1 組の規則を読み込み、それらをアクティブな NAT 規則のカーネルの現在のリストに追加します。また、NAT 規則は、ipnat を使用して削除することができます。 ipnat で使用される設定ファイルの形式は、ipnat(5) に説明されています。
(例えば、透明なアプリケーションプロキシを書くために) 利用者自体のプログラムで使用するための、プログラミングのインタフェースと関連する ioctl は、ipf(4) に文書化されています。
ともに動作するか、または上記のいずれかの場所で、利用者自身のアプリケーションを開発できるように、 ioctl とログ記録されるキャラクタデバイスに保存されたデータの形式についての文書は、ipl(4) で提供されています。
同様に、NAT コードのインタフェースは、ipnat(4) に文書化されています。
パケット処理フロー
次の図形は、IP フィルタによって紹介された様々な段階を通して TCP/IP パケットのフローを説明しています。
IN
|
V
+-------------------------+--------------------------+
| | |
| V |
| Network Address Translation |
| | |
| authenticated | |
| +-------<---------+ |
| | | |
| | V |
| V IP Accounting |
| | | |
| | V |
| | Fragment Cache Check--+ |
| | | | |
| V V V |
| | Packet State Check-->+ |
| | | | |
| | +->--+ | | |
| | | | V | |
| V groups IP Filtering V |
| | | | | | |
| | +--<-+ | | |
| | | | |
| +---------------->|<-----------+ |
| | |
| V |
| +---<----+ |
| | | |
| function | |
| | V |
| +--->----+ |
| | |
| V |
+--|---<--- fast-route ---<--+ |
| | | |
| | V |
| +-------------------------+--------------------------+
| |
| pass only
| |
| V
V [KERNEL TCP/IP Processing]
| |
| +-------------------------+--------------------------+
| | | |
| | V |
| | Fragment Cache Check--+ |
| | | | |
| | V V |
| | Packet State Check-->+ |
| | | | |
| | V | |
V | IP Filtering | |
| | | V |
| | |<-----------+ |
| | V |
| | IP Accounting |
| | | |
| | V |
| | Network Address Translation |
| | | |
| | V |
| +-------------------------+--------------------------+
| |
| pass only
V |
+--------------------------->|
V
OUT