[前に戻る: リストとマクロ]
[目次]
[次に進む: パケットフィルタリング]
PF: テーブル
目次
はじめに
テーブルは、IPv4 および/または IPv6 アドレスのグループを保持するために使用されるものです。
テーブルに対する参照は、リストに比べて、
より少ないメモリと CPU 時間で、非常に高速に実行できます。このため、
テーブルは大規模なアドレスのグループを保持するのに理想的であり、
50,000 個のアドレスを保持するテーブルの参照時間は 50 個のアドレスを保持するものより
わずかに余計にかかるだけです。テーブルは、以下のような方法で使用することができます。
テーブルは、
pf.conf の中に記述するか、または
pfctl(8) を使用するかのいずれかで生成することができます。
設定
pf.conf の中で、テーブルは table ディレクティブを
使用して作成します。それぞれのテーブル中には、以下の属性を指定できます。
- const - テーブルの内容は、テーブルが生成された後は変更できません。
この属性が指定されていない場合には、
securelevel(7) が 2 以上で運用されている場合でも、
アドレスをテーブルに追加したりテーブルから削除したりするのに、いつでも
pfctl(8) を使用することができます。
- persist - 参照ルールがなくなっても、カーネルはテーブルを
メモリ中に保持します。この属性の指定がない場合には、
このテーブルを参照する最後のルールがフラッシュされた場合に、
カーネルはテーブルをメモリから自動的に除去します。
例:
table <goodguys> { 192.0.2.0/24 }
table <rfc1918> const { 192.168.0.0/16, 172.16.0.0/12, \
10.0.0.0/8 }
table <spammers> persist
block in on fxp0 from { <rfc1918>, <spammers> } to any
pass in on fxp0 from <goodguys> to any
アドレスは、以下のような否定 (あるいは "not") 修飾子を使用して
指定することができます。
table <goodguys> { 192.0.2.0/24, !192.0.2.5 }
この例では、goodguys テーブルは、192.0.2.5 を除く 192.0.2.0/24
ネットワークのすべてのアドレスにマッチするようになります。
テーブル名は常に < > で囲むということに注意してください。
テーブルは IP アドレスやネットワークのリストを含む
テキストファイルに記述しておくこともできます。
table <spammers> persist file "/etc/spammers"
block in on fxp0 from <spammers> to any
この /etc/spammers ファイルは、IP アドレスのリストおよび/または
CIDR
ネットワークブロックを一行にひとつ含んでいます。
た、# から始まるすべての行はコメント行と解釈され、無視されます。
pfctl を使用した操作
テーブルは
pfctl(8) を使用して、運用中に操作することができます。たとえば、
上記で作成した <spammers> テーブルにエントリを追加するには、以下のようにします。
# pfctl -t spammers -Tadd 218.70.0.0/16
このとき、<spammers> テーブルがまだ存在していない場合には、
これを生成します。テーブル中のアドレスのリストを取得するには以下のようにします。
# pfctl -t spammers -Tshow
それぞれのテーブルのエントリの統計情報を表示するため、-Tshow
とともに、引数 -v を指定することができます。テーブルから
アドレスを除去するには以下のようにします。
# pfctl -t spammers -Tdelete 218.70.0.0/16
pfctl を使用したテーブルの操作についてのより詳しい情報は
pfctl(8)
を参照してください。
アドレスの指定
IP アドレスを指定する以外にも、ホスト名を使用してホストの指定を
行うこともできます。ホスト名解決で IP アドレスに変換される際に、
その結果としてのすべての IPv4 および IPv6 アドレスがテーブルに
入ります。IP アドレスは、有効なインターフェイス名や self
キーワードを指定してテーブルに入れることもできますが、この場合、
インターフェイスに割り当てられているすべてのアドレスがテーブルに追加されます。
アドレスマッチング
テーブルに対するアドレス参照では、最も狭い範囲でマッチするエントリが返されます。
これにより、以下のようなテーブルの生成が許されることになります。
table <goodguys> { 172.16.0.0/16, !172.16.1.0/24, 172.16.1.100 }
block in on dc0 all
pass in on dc0 from <goodguys> to any
dc0 を通過して入ってくるすべてのパケットは、<goodguys>
テーブルにマッチする送信元アドレスを持っています。
- 172.16.50.5 - 最も狭いマッチは 172.16.0.0/16 です。
パケットはテーブルにマッチし、通過することができます。
- 172.16.1.25 - 最も狭いマッチは !172.16.1.0/24 です。パケットは
テーブル中のエントリにマッチしますが、このエントリは、("!" 修飾子を使用して)
否定されています。ですので、パケットはテーブルにマッチせず、ブロックされます。
- 172.16.1.100 - これは 172.16.1.100 に正確にマッチしています。
パケットはテーブルにマッチし、通過することができます。
- 10.1.4.55 - これはテーブルにはマッチせず、ブロックされます。
[前に戻る: リストとマクロ]
[目次]
[次に進む: パケットフィルタリング]
www@openbsd.org
Originally [OpenBSD: tables.html,v 1.9 ]
$Translation: tables.html,v 1.11 2004/01/03 06:14:18 toshi Exp $
$OpenBSD: tables.html,v 1.10 2004/01/04 22:47:55 horacio Exp $