[OpenBSD]

[前に戻る: トラフィックリダイレクション (ポートフォワーディング)] [目次] [次に進む: 実行時オプション]

PF: ルールセット作成の近道


目次


はじめに

PF はルールセットを単純化することができる多数の方法を用意しています。 その良い例のひとつに マクロリストの使用を挙げることができます。 さらに、ルールセット言語やその文法、さらにルールセットを より簡単にするための近道も用意しています。一般的な経験に基づいて言うと、 より簡単なルールセットは、その理解やメンテナンスがより簡単になると言えます。

マクロの使用

マクロは、アドレスやポート番号、インターフェイス名などをルールセット中に ハードコードしなくて済む代替方法を用意するもので、便利な機能です。さて、 サーバの IP アドレスを変更しましたが...   でも大丈夫です。マクロを 更新するだけで、あなたのニーズに完全に合致するよう、時間とエネルギーを費した フィルタルール全体にメスを入れる必要はありません。

PF のルールセットにおける一般的は習慣は、それぞれのネットワークインターフェイスのための マクロを定義することです。もし、ここで異なるドライバを使用するネットワークカードに 置換しなければならなくなったとすると、たとえば、3Com を Intel に交換する場合、 マクロを書き換えるだけでフィルタルールは以前と同じように機能してくれます。 もうひとつの利点として、同じルールセットを多数のマシンにインストールする場合を 考えることができます。あるマシンは異なるネットワークカードを持っているかも知れませんが、 ネットワークインターフェイスの定義にマクロを使用していれば、 インストールされるルールセットは最小限の編集で済みます。ルールセット中の、 ポート番号や IP アドレス、インターフェイス名などのような、 変更の対象となり得る情報の定義には、マクロを使用することが推奨されています。

# define macros for each network interface
IntIF = "dc0"
ExtIF = "fxp0"
DmzIF = "fxp1"

もうひとつの一般的な習慣として、IP アドレスやネットワークブロックの定義にマクロを使用する、 というのがあります。これによって、IP アドレスが変更された場合に ルールセットのメンテナンスの手間を大幅に減少させることが可能となります。

# define our networks
IntNet = "192.168.0.0/24"
ExtAdd = "24.65.13.4"
DmzNet = "10.0.0.0/24"

もし、内部ネットワークが、拡張されたり異なる IP ブロックに付け替えられたりした場合でも、 マクロを更新するだけで済みます。

IntNet = "{ 192.168.0.0/24, 192.168.1.0/24 }"

そして、この後にルールセットをいったん再ロードすれば、すべて以前と同様に動作します。

リストの使用

インターネットには存在すべきではない、そしてもしインターネット上に存在していれば、 たいていトラブルの原因となってしまう、 RFC 1918 で定義されるプライベートアドレスを扱うためのルールセットのお手本を見てみましょう。
block in  quick on tl0 inet from 127.0.0.0/8 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 10.0.0.0/8 to any
block out quick on tl0 inet from any to 127.0.0.0/8
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 10.0.0.0/8

これは、以下のように単純化することができます。

block in  quick on tl0 inet from { 127.0.0.0/8, 192.168.0.0/16, \
   172.16.0.0/12, 10.0.0.0/8 } to any
block out quick on tl0 inet from any to { 127.0.0.0/8, \
   192.168.0.0/16, 172.16.0.0/12, 10.0.0.0/8 }

このルールセットは 8 行から 2 行まで減少させることができました。 ここで、このリスト中でマクロを使用すれば、 さらにわかりやすくなります。

NoRouteIPs = "{ 127.0.0.0/8, 192.168.0.0/16, 172.16.0.0/12, \
   10.0.0.0/8 }"
ExtIF = "tl0"
block in  quick on $ExtIF from $NoRouteIPs to any
block out quick on $ExtIF from any to $NoRouteIPs

マクロやリストを使用して pf.conf ファイルを単純化することができますが、 それぞれの行は、実際には pfctl(8) によって複数のルールに展開されることに注意してください。 ですので、上記の例は、実際には以下のルールに展開されることになります。

block in  quick on tl0 inet from 10.0.0.0/8 to any
block in  quick on tl0 inet from 172.16.0.0/12 to any
block in  quick on tl0 inet from 192.168.0.0/16 to any
block in  quick on tl0 inet from 127.0.0.0/8 to any
block out quick on tl0 inet from any to 10.0.0.0/8
block out quick on tl0 inet from any to 172.16.0.0/12
block out quick on tl0 inet from any to 192.168.0.0/16
block out quick on tl0 inet from any to 127.0.0.0/8

これまで見てきましたように、PF の拡張は純粋に pf.conf ファイルの書き手やメンテナに対して便利なものなのであって、 pf(4) が処理するルールを実際に単純化できるわけではありません。

マクロは単にアドレスやポート以上のものを定義するのに使用することもできます。 これらは、PF ルールファイルのどこにでも使用することができます。たとえば、

pre = "pass in quick on ep0 inet proto tcp from "
post = "to any port { 80, 6667 } keep state"

# David's classroom
$pre 21.14.24.80 $post

# Nick's home
$pre 24.2.74.79 $post
$pre 24.2.74.178 $post

は、以下のように展開されます。

pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 21.14.24.80 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.79 to any \
   port = 6667 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 80 keep state
pass in quick on ep0 inet proto tcp from 24.2.74.178 to any \
   port = 6667 keep state

PF の文法

より大きなルールセットの柔軟性を持つよう、現在では PF の文法は実に 柔軟なものとなっています。また、PF は、ある種のキーワードを推測できるように なりましたが、これは、そのようなキーワードをルール中に明示的に記載する必要がない ことを意味し、また、キーワードの順序についても、厳密に覚える必要がないほど 形式張らないものとなっています。

キーワードの除去

「デフォルトで拒否」というポリシーを定義するために、ふたつのルールが使用されます。

block in  all
block out all

これは以下のように省略可能です。

block all

方向が指定されていない場合、PF は両方向に移動するパケットに対して ルールセットが適用されるものと見なします。

同様に、"from any to any" や "all" 節は、 ルールから無視されるかも知れません。たとえば、

block in on rl0 all
pass  in quick log on rl0 proto tcp from any to any port 22 keep state

は、以下のように単純化することができます。

block in on rl0
pass  in quick log on rl0 proto tcp to port 22 keep state

最初のルールは、rl0 に対するすべての着信パケットは、どこからどこに行こうとするものでも すべてブロックされますし、ふたつ目のルールは、rl0 上のポート 22 への TCP トラフィックを通過させます。

Return の単純化

ブロックして TCP RST や ICMP Unreachable 応答を返すためのルールセットは、 たとえば以下のようなものであるかも知れません。

block in all
block return-rst in proto tcp all
block return-icmp in proto udp all
block out all
block return-rst out proto tcp all
block return-icmp out proto udp all

この場合、以下のように単純化することができます。

block return

PF が return キーワードを見つけると、正しい応答を送信するか、 何も応答を返さない、十分洗練された動作を行いますが、この動作は ブロックされるパケットのプロトコルに依存します。

キーワードの順序

指定されたキーワードの順序は、ほとんどの場合、柔軟なものです。 たとえば、以下のように記述されたルールの場合、

pass in log quick on rl0 proto tcp to port 22 \
   flags S/SA keep state queue ssh label ssh

このように書き換えることもできます。

pass in quick log on rl0 proto tcp to port 22 \
   queue ssh keep state label ssh flags S/SA

その他の同様のバリエーションでも同じように動作します。

[前に戻る: トラフィックリダイレクション (ポートフォワーディング)] [目次] [次に進む: 実行時オプション]


[back] www@openbsd.org
Originally [OpenBSD: shortcuts.html,v 1.10 ]
$Translation: shortcuts.html,v 1.8 2004/01/03 06:14:18 toshi Exp $
$OpenBSD: shortcuts.html,v 1.9 2004/01/04 22:47:55 horacio Exp $