Балансировка нагрузки исходящего трафика между двумя и более внешними каналами

Пулы адресов могут использоваться для балансировки нагрузки между двумя и более внешними каналами с использованием опции route-to в случае невозможности организовать динамическую маршрутизацию (например, с использованием протокола BGP — протокол динамической маршрутизации4). Совместное использование route-to и пула адресов round-robin позволяет распределить исходящие соединения между разными провайдерами.

В качестве дополнительной информации необходимо указать адреса маршрутизаторов для каждого Интернет-соединения. Это нужно для опции 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 должна быть указана в каждом правиле, предназначенном для балансировки трафика. Ответные пакеты приходят на тот интерфейс, с которого ушёл запрос и они будут перенаправлены во внутрь как обычно.

Для гарантии того, что пакеты с $ext_if1 всегда направляются к $ext_gw1 (и соответственно для $ext_if2 к $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

2

  • Пример настройки PF для балансировка нагрузки исходящего трафика

Пулы адресов могут использоваться для балансировки нагрузки между двумя и более внешними каналами с использованием опции route-to в случае невозможности организовать динамическую маршрутизацию (например, с использованием протокола BGP4). Совместное использование route-to и пула адресов round-robin исходящие соединения могут быть распределены между разными провайдерами.

В качестве дополнительной информации необходимо указать адреса маршрутизаторов для каждого Интернет-соединения. Это необходимо для опции 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 должна быть указана в каждом правиле, предназначенном для балансировки трафика. Ответные пакеты приходят на тот интерфейс, с которого ушел запрос и они будут перенаправлены во внутрь как обычно.

Для гарантии того, что пакеты с $ext_if1 всегда направляются к $ext_gw1 (и соответственно для $ext_if2 к $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

В заключение хочу сказать, что 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

PQ VPS сервера в 28+ странах.