[前に戻る: パケットキューイングと優先順位付け] [目次] [次に進む: パケットのタグ付け]
アドレスプールを使用するには、4 つの方法があります。
round-robin 法を除いて、アドレスプールは CIDR (Classless Inter-Domain Routing) ネットワークブロックとして記述されていなければなりません。round-robin 法では、リストのフォーマットや テーブルを使用して複数の個々のアドレスを指定できます。
この例では、送出されるパケットを変換するために、ふたつのアドレスのプールが 使用されることになります。それぞれの送出される接続のために、 PF はラウンドロビンで使用するアドレスのローテーションを行います。
nat on $ext_if inet from any to any -> { 192.0.2.5, 192.0.2.10 }
この方法のひとつの欠点は、内部ネットワークからの一連の接続に対して、 常に同じアドレスへと変換されるとは限らないということでしょう。 これはたとえば、IP アドレスに基づいてユーザのログインを追跡するような web サイトをブラウジングする際などに、障害となり得るものです。 この代替の方法は、それぞれの内部アドレスが常に同じ変換アドレスへと 変換される source-hash 法を使用することです。 これを使用するためには、アドレスプールは CIDR ネットワークブロックでなければなりません。
nat on $ext_if inet from any to any -> 192.0.2.4/31 source-hash
この nat ルールは、192.0.2.4/31 (192.0.2.4 〜 192.0.2.5) の アドレスプールを、送出パケットの変換アドレスとして使用しています。 それぞれの内部アドレスは、source-hash キーワードによって、 常に同じ変換アドレスへと変換されます。
web_servers = "{ 10.0.0.10, 10.0.0.11, 10.0.0.13 }"
rdr on $ext_if proto tcp from any to any port 80 -> $web_servers
一連の接続は、ラウンドロビン法で web サーバに リダイレクトされることになります。
NAT の例としては、すべての web サーバが CIDR ネットワークブロック内に 配置されている場合には、与えられた IP アドレスが物理的に同じ web サーバに 常にリダイレクトされるよう、source-hash キーワードを 使用することができます。もう一度言いますが、これは、web サーバのブラウジングの際の セッション情報を保守するために、ときどき必要となるものです。
これは付加的な情報ですが、このようにするためには、それぞれの インターネット接続に隣接するルータの IP アドレスが必要になります。 これは、送出パケットの送信先を制御するため、route-to オプションに供給するためのものです。
以下の例は、ふたつのインターネット接続への送出トラフィックの 負荷分散を行います。
lan_net = "192.168.0.0/24"
int_if = "dc0"
ext_if1 = "fxp0"
ext_if2 = "fxp1"
ext_gw1 = "68.146.224.1"
ext_gw2 = "142.59.76.1"
pass in on $int_if route-to \
{ ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \
from $lan_net to any keep state
route-to オプションは、それぞれのゲートウェイに対してトラフィックの 負荷分散を行うための、送出用のネットワークインターフェイスを指定するため、 内部インターフェイスに着信するトラフィックに対して使用されるものです。 route-to オプションは、それぞれのトラフィックの負荷分散を行う フィルタルールが存在していなければならないということに注意してください。 戻りパケットは、送出されたものと同じ外部インターフェイスに返送されて来て (これは ISP によって行われます)、さらに普通に内部ネットワークへと 転送されて行きます。
$ext_if1 に属する送信元アドレスを持つパケットが、常に $ext_gw1 へと (そして、同様に、$ext_if2 は $ext_gw2 へと) ルーティングされるのを確実にするため、 以下の 2 行がルールセットに含まれているべきでしょう。
pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 \
to any
pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 \
to any
最終的に、NAT をそれぞれの送出用インターフェイスに対して使用することができます。
nat on $ext_if1 from $lan_net to any -> ($ext_if1)
nat on $ext_if2 from $lan_net to any -> ($ext_if2)
送出トラフィックの負荷分散を行うための完全な例は、 以下のようなものになるかも知れません。
lan_net = "192.168.0.0/24" int_if = "dc0" ext_if1 = "fxp0" ext_if2 = "fxp1" ext_gw1 = "68.146.224.1" ext_gw2 = "142.59.76.1" # nat outgoing connections on each internet interface nat on $ext_if1 from $lan_net to any -> ($ext_if1) nat on $ext_if2 from $lan_net to any -> ($ext_if2) # default deny block in from any to any block out from any to any # pass all outgoing packets on internal interface pass out on $int_if from any to $lan_net # pass in quick any packets destined for the gateway itself pass in quick on $int_if from $lan_net to $int_if # load balance outgoing tcp traffic from internal network. pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto tcp from $lan_net to any flags S/SA modulate state # load balance outgoing udp and icmp traffic from internal network pass in on $int_if route-to \ { ($ext_if1 $ext_gw1), ($ext_if2 $ext_gw2) } round-robin \ proto { udp, icmp } from $lan_net to any keep state # general "pass out" rules for external interfaces pass out on $ext_if1 proto tcp from any to any flags S/SA modulate state pass out on $ext_if1 proto { udp, icmp } from any to any keep state pass out on $ext_if2 proto tcp from any to any flags S/SA modulate state pass out on $ext_if2 proto { udp, icmp } from any to any keep state # route packets from any IPs on $ext_if1 to $ext_gw1 and the same for # $ext_if2 and $ext_gw2 pass out on $ext_if1 route-to ($ext_if2 $ext_gw2) from $ext_if2 to any pass out on $ext_if2 route-to ($ext_if1 $ext_gw1) from $ext_if1 to any |
[前に戻る: パケットキューイングと優先順位付け] [目次] [次に進む: パケットのタグ付け]