[OpenBSD]

[前に戻る: アドレスプールと負荷分散 (Load Balancing)] [目次] [次に進む: ログの取得]

PF: パケットのタグ付け


目次


はじめに

パケットへのタグ付けとは、後でフィルタや変換ルールで使用可能な 内部の識別子でパケットにマークを付けるための方法のことです。 タグ付けにより、インターフェイス間の「信頼関係」を作り出したり、 パケットが変換ルールで既に処理されたものかどうかの決定したりすることが 可能になります。 また、ルールベースのフィルタリングをやめて、 ポリシーベースのフィルタリングに移行することもできます。

パケットへのタグの割り付け

パケットにタグを追加するには、以下のように tag キーワードを使用します。
pass in on $int_if all tag INTERNAL_NET keep state

INTERNAL_NET タグは、上記のルールにマッチするすべてのパケットに 追加されます。keep state の使用には注意が必要です。keep state (あるいは modulate state/synproxy state) は、パケットにタグを 付与する pass ルール中で使用すべきです。

タグ付けには以下のようなルールがあります。

例として以下のルールセットを見てみましょう。

(1) pass in on $int_if tag INT_NET keep state
(2) pass in quick on $int_if proto tcp to port 80 tag \
        INT_NET_HTTP keep state
(3) pass in quick on $int_if from 192.168.1.5 keep state

フィルタルールでタグを適用するだけでなく、natrdr および binat 変換ルールの場合も tag キーワードを使用することにより パケットにタグを適用することもできます。

適用済タグのチェック

適用済のタグをチェックするには、以下のように tagged キーワードを使用します。
pass out on $ext_if tagged INT_NET keep state

$ext_if から送出されるパケットは、上記のルールにマッチするよう、 INT_NET タグでタグ付けされていなければなりません。以下のように ! 演算子を使用することによって、逆のマッチを行うこともできます。

pass out on $ext_if tagged ! WIFI_NET keep state

ポリシーフィルタリング

ポリシーフィルタリングは、フィルタリングルールセットを記述するのとは異なるアプローチを取ります。 どのタイプのトラフィックが通過を許可され、どのタイプはブロックされるのかというルールを設定する ポリシーが定義されます。 パケットは、送信元/送信先の IP アドレス/ポート、プロトコル、 などなどの伝統的な基準に基づいてポリシーに分類されます。 たとえば、以下のようなファイアウォールポリシーを調べてみましょう。

ファイアウォールを通過するすべてのトラフィックをポリシーがどのようにカバーしているのか ということに注目しましょう。 括弧内のアイテムは、そのポリシーのアイテム用に使用される タグを示しています。

まず、パケットをポリシーに分類するため、フィルタおよび変換ルールを 記述する必要があります。

rdr on $ext_if proto tcp from <spamd> to port smtp \
   tag SPAMD -> 127.0.0.1 port 8025

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state

次にポリシーを定義したルールを設定します。

pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state

これですべてのルールセットが設定され、変更すべき点は せいぜい分類ルールの調整くらいとなります。 たとえば、POP3/SMTP サーバが DMZ に追加された場合、POP3 および SMTP のトラフィックに対する分類ルールを以下の例のように追加する必要が あるでしょう。

mail_server = "192.168.0.10"
...
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
   tag INET_DMZ keep state

これで電子メールのトラフィックが、ポリシーエントリ INET_DMZ の一部として通過が許可されるようになります。

完全なルールセットは以下のとおりです。
# マクロ
int_if  = "dc0"
dmz_if  = "dc1"
ext_if  = "ep0"
int_net = "10.0.0.0/24"
dmz_net = "192.168.0.0/24"
www_server = "192.168.0.5"
mail_server = "192.168.0.10"

table <spamd> persist file "/etc/spammers"

# 分類 -- 定義されたファイアウォールポリシーに基づいて
# パケットを分類します。
rdr on $ext_if proto tcp from <spamd> to port smtp \
    tag SPAMD -> 127.0.0.1 port 8025

block all
pass in on $int_if from $int_net tag LAN_INET keep state
pass in on $int_if from $int_net to $dmz_net tag LAN_DMZ keep state
pass in on $ext_if proto tcp to $www_server port 80 tag INET_DMZ keep state 
pass in on $ext_if proto tcp to $mail_server port { smtp, pop3 } \
    tag INET_DMZ keep state 

# ポリシーの適用 -- 定義されたファイアウォールポリシーに基づいて通過を許可/ブロックします。
pass in  quick on $ext_if tagged SPAMD keep state
pass out quick on $ext_if tagged LAN_INET keep state
pass out quick on $dmz_if tagged LAN_DMZ keep state
pass out quick on $dmz_if tagged INET_DMZ keep state 

Ethernet のフレームに対するタグ付け

タグ付け/フィルタリングを行っているマシンが bridge(4) として動作している場合、Ethernet レベルでタグ付けを行うことができます。 tag キーワードを使用する bridge(4) 用フィルタルールを生成することで、 PF は送信元/送信先の MAC アドレスに基づいたフィルタを作成することができます。 bridge(4) 用ルールは、たとえば以下の例のように、 brconfig(8) コマンドを使用して生成することができます。
# brconfig bridge0 rule pass in on fxp0 src 0:de:ad:be:ef:0 \
   tag USER1

そして、pf.conf 中に以下の行を追加します。

pass in on fxp0 tagged USER1

[前に戻る: アドレスプールと負荷分散 (Load Balancing)] [目次] [次に進む: ログの取得]


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