[OpenBSD]

[前に戻る: スクラブ (scrub: パケットの正規化)] [目次] [次に進む: パケットキューイングと優先順位付け]

PF: アンカーと名前付きルールセット


目次


はじめに

PF は主ルールセットだけでなく、サブルールセットの評価も行うことができます。 サブルールセットは、 pfctl(8) を使用して運用中に操作することもできるので、 アクティブなルールセットを動的に代替するための便利な方法を提供しています。 テーブルがアドレスの動的なリストを保持するために使用されるのに対して、 サブルールセットはフィルタ、nat, rdrbinat ルールの 動的なセットを保持するために使用されるものです。

サブルールセットはアンカーを使用して主ルールセットに連結されます。 anchor ルールには以下のように 4 種類あります。

主ルールセットだけが anchor ルールを含むことができます。

名前付きルールセット

名前付きルールセットとは、名前の割り付けられたフィルタおよび/または変換ルールの グループのことです。anchor 点にはひとつ以上のそのようなルールセットが 含まれているかも知れません。PF は主ルールセット中に anchor ルールを 見つけると、その anchor 点に連結されたすべてのルールセットを、 その名前のアルファベット順に評価しようとします。 主ルールセットの処理は、quick オプション付きの フィルタルールか、アンカーの中の変換ルールに パケットがマッチするまで継続されますが、このようなケースでは、 マッチは最終的なものであると見なされますので、主ルールセットと アンカーの両方のルールの評価がここで中止されます。

たとえば、以下のようになります。

ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor goodguys

このルールセット一式は、fxp0 上の着信ならびに送出トラフィックの両方のための デフォルトで拒絶するポリシーとなっています。トラフィックは状態を保存してわたされ、 goodguys という名前のアンカールールが生成されます。 以下のふたつの方法でアンカーにルールを関連付けられます。

load ルールは、テキストファイルからルールを読み込むことにより、 指定されたアンカーと名前付きルールセットとを関連付けるため、pfctl を呼び出すことになります。たとえば、以下のようになります。

load anchor goodguys:ssh from "/etc/anchor-goodguys-ssh"

主ルールセットがロードされた際に、ファイル /etc/anchor-goodguys-ssh にリストされたルールは、goodguys アンカーに連結された 名前付きルールセット ssh にロードされます。

pfctl を使用してルールをアンカーに追加するためには、 以下のようなコマンドを使用することができます。

# echo "pass in proto tcp from 192.0.2.3 to any port 22" \
   | pfctl -a goodguys:ssh -f -

これは、goodguys アンカーに連結された ssh という名前のルールセットに pass ルールを追加します。 PF は主ルールセット中の anchor goodguys に達したときに、 このルール (および追加された他のすべてのフィルタルール) を評価します。

ルールはテキストファイルに保存し、ここからロードすることも可能です。

# cat >> /etc/anchor-goodguys-www
pass in proto tcp from 192.0.2.3 to any port 80
pass in proto tcp from 192.0.2.4 to any port { 80 443 }

# pfctl -a goodguys:www -f /etc/anchor-goodguys-www

これは /etc/anchor-goodguys-www ファイルから goodguys アンカー中の www という名前のルールセットにルールを読み込みます。

フィルタならびに変換ルールは、主ルールセットとしてロードされたルールと同様のシンタクス およびオプションを使用した名前付きルールセットとして読み込むことができます。 しかしながら、それは使用されているマクロも 名前付きルールセットの中に定義されていなければなりません。 主ルールセットの中で定義されているマクロは、 名前付きルールセットからは見えません

それぞれの名前付きルールセットは、主ルールセットと同様、他のルールセットとは 独立に存在します。ルールのフラッシュのような、ひとつのルールセットの処理が終了が、 他のすべてのルールセットに影響を及ぼすことはありません。さらに、主ルールセットからの アンカーポイントを除去しても、そのアンカーに付随する、いかなる名前付きルールセットも 破壊されることはありません。名前付きルールセットは、 pfctl(8) を使用してすべてのルールをフラッシュしない限り、 破壊されることはありません。名前付きルールセットを持たないアンカーポイントが これに付随する場合、これもまた破壊されてしまいます。

アンカーのオプション

anchor ルールには、オプションとして、インターフェイス、プロトコル、 送信元および送信先アドレスなどを、フィルタルールと同様のシンタクスを使用して 指定することができます。このような情報た与えられた場合には、パケットが anchor ルールの記述にマッチした場合にのみ、anchor ルールは処理されます。 たとえば、以下のようになります。
ext_if = "fxp0"

block on $ext_if all
pass  out on $ext_if all keep state
anchor ssh in on $ext_if proto tcp from any to any port 22

アンカー ssh 中のルールは、fxp0 に着信したポート 22 に向かう TCP パケットのために評価されます。そして、ルールが以下のように anchor に追加されます。

# echo "pass in from 192.0.2.10 to any" | pfctl -a ssh:allowed -f -

この場合、フィルタルールには、インターフェイス、プロトコルやポートが 指定されていないにも関わらず、ホスト 192.0.2.10 だけが anchor ルールの記述に従って、SSH を使用して接続することを許可されています。

名前付きルールセットの操作

名前付きルールセットの操作は、pfctl 経由で実行されます。 これは、主ルールセットをリロードすることなく、ルールのルールセットに追加したり、 ルールセットから削除したりするのに使用できます。

ssh アンカーに連結された allowed ルールセット中のルールをすべてリストするには、以下のようにします。

# pfctl -a ssh:allowed -s rules

上記と同じルールセットからすべてのフィルタルールをフラッシュするには、以下のようにします。

# pfctl -a ssh:allowed -F rules

ルールセット名が省略されている場合には、アンカー中のすべてのルールに対して 動作が適用されます。

コマンドのすべてのリストについては、 pfctl(8) を参照してください。

[前に戻る: スクラブ (scrub: パケットの正規化)] [目次] [次に進む: パケットキューイングと優先順位付け]


[back] www@openbsd.org
Originally [OpenBSD: anchors.html,v 1.10 ]
$Translation: anchors.html,v 1.13 2004/01/03 05:12:49 toshi Exp $
$OpenBSD: anchors.html,v 1.12 2004/01/04 22:47:55 horacio Exp $