Здесь показаны различия между двумя версиями данной страницы.
— |
balansirovka_nagruzki_isxodjaschego_trafika_mezhdu_dvumja_i_bolee_vneshnimi_kanalami_internet [2009/11/08 06:28] (текущий) |
||
---|---|---|---|
Строка 1: | Строка 1: | ||
+ | ====== Балансировка нагрузки исходящего трафика между двумя и более внешними каналами ====== | ||
+ | Оригинал: [[http://house.hcn-strela.ru/BSDCert/BSDA-course/apcs02.html|C.2.2.5.3. Балансировка нагрузки исходящего трафика]] | ||
+ | |||
+ | Пулы адресов могут использоваться для балансировки нагрузки между двумя и более внешними каналами с использованием опции route-to в случае невозможности организовать динамическую маршрутизацию (например, с использованием протокола [[BGP]]4). Совместное использование route-to и пула адресов round-robin позволяет распределить исходящие соединения между разными провайдерами. | ||
+ | |||
+ | В качестве дополнительной информации необходимо указать адреса маршрутизаторов для каждого Интернет-соединения. Это нужно для опции **route-to**, дабы управлять исходящими пакетами. | ||
+ | |||
+ | Следующий пример иллюстрирует балансировку нагрузки между двумя каналами: | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | Опция route-to используется для приёма трафика на внутреннем интерфейсе и назначения ему внешнего сетевого интерфейса и шлюза, таким образом обеспечивая балансировку. Обратите внимание, что опция route-to должна быть указана в каждом правиле, предназначенном для балансировки трафика. Ответные пакеты приходят на тот интерфейс, с которого ушёл запрос и они будут перенаправлены во внутрь как обычно. | ||
+ | |||
+ | Для гарантии того, что пакеты с $ext_if1 всегда направляются к $ext_gw1 (и соответственно для $ext_if2 к $ext_gw2), в правилах можно указать следующее: | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | ====== 2 ====== | ||
+ | * Пример настройки PF для балансировка нагрузки исходящего трафика | ||
+ | Пулы адресов могут использоваться для балансировки нагрузки между двумя и более внешними каналами с использованием опции route-to в случае невозможности организовать динамическую маршрутизацию (например, с использованием протокола BGP4). Совместное использование route-to и пула адресов round-robin исходящие соединения могут быть распределены между разными провайдерами. | ||
+ | |||
+ | В качестве дополнительной информации необходимо указать адреса маршрутизаторов для каждого Интернет-соединения. Это необходимо для опции route-to, дабы управлять исходящими пакетами. | ||
+ | |||
+ | Этот пример покажет нам балансировку нагрузки между двумя каналами: | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | Опция route-to используется для приема трафика на внутреннем интерфейсе и назначения ему внешнего сетевого интерфейса и шлюза, таким образом обеспечивая балансировку. Обратите внимание, что опция route-to должна быть указана в каждом правиле, предназначенном для балансировки трафика. Ответные пакеты приходят на тот интерфейс, с которого ушел запрос и они будут перенаправлены во внутрь как обычно. | ||
+ | |||
+ | Для гарантии того, что пакеты с $ext_if1 всегда направляются к $ext_gw1 (и соответственно для $ext_if2 к $ext_gw2), в правилах можно указать следующее: | ||
+ | <code> | ||
+ | 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 | ||
+ | </code> | ||
+ | В заключение хочу сказать, что NAT можно использовать на каждом из внешних интерфейсов: | ||
+ | <code> | ||
+ | nat on $ext_if1 from $lan_net to any -> ($ext_if1) | ||
+ | nat on $ext_if2 from $lan_net to any -> ($ext_if2) | ||
+ | </code> | ||
+ | Полный пример балансировки исходящего трафика будет выглядеть так: | ||
+ | <code> | ||
+ | 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 | ||
+ | |||
+ | |||
+ | </code> | ||