[前に戻る: トラフィックリダイレクション (ポートフォワーディング)] [目次] [次に進む: 実行時オプション]
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 }"
そして、この後にルールセットをいったん再ロードすれば、すべて以前と同様に動作します。
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
「デフォルトで拒否」というポリシーを定義するために、ふたつのルールが使用されます。
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 トラフィックを通過させます。
ブロックして 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
その他の同様のバリエーションでも同じように動作します。
[前に戻る: トラフィックリダイレクション (ポートフォワーディング)] [目次] [次に進む: 実行時オプション]