EdgeRouter – политики маршрутизации с балансировкой WAN

Специалист
Задать вопрос

Ответ на вопрос

Примечание: этот метод характерен тем, что встроенная функция балансировщика в этом режиме не работает.

Рассмотрим, как выполнить балансировку нагрузки WAN для маршрутизаторов с несколькими сетевыми портами.
  В этом примере используются метки пакетов/соединений для балансировки нагрузки при двойном WAN. В отличие от других примеров маршрутизации, где решение таблицы маршрутизации основывалось на фиксированном источнике или целевом порту, в этой статье мы хотим попытаться сбалансировать новые соединения в режиме 50/50 через ISP1 и ISP2.

  На приведенном ниже рисунке мы имеем 2 интернет-соединения, ISP-1 и ISP-2:

ISP-1 on eth0 192.0.2.0/24
ISP-2 on eth1 203.0.113.0/24

Со стороны LAN:
eth2 172.16.0.0/24

EdgeRouter – политики маршрутизации с балансировкой WAN

Таблица маршрутизации

Таблица маршрутизации (routing table, далее — RT) представляет собой файл, содержащий перечень соответствия адресов к интерфейсам, а также другую служебную информацию, необходимую для перенаправления пакетов данных. Он используется для определения пути, по которому следует направить поступившую единицу информации. По умолчанию, все они будут пересылаться по самой короткой дороге к цели, что может вызвать перегрузку на определенных участках сети и каналах соединения. Для планомерного распределения трафика и нужна балансировка WAN.
  В данном исследовании мы используем однотипные RT на основе EdgeOS PBR (Policy-based Routing) — технологии гибкой маршрутизации. Последняя позволяет задавать правила, по которым происходит перенаправление пакетов. В нашем примере присутствуют:

  • основная таблица маршрутизации, которая содержит маршруты по умолчанию для обоих провайдеров;
  • таблица №1 имеет только маршрут к ISP1;
  • таблица №2 имеет только маршрут к ISP2, но с дополнением.
Прежде всего, мы раздаем таблицам №1 и №2 с их собственные, уникальные метки: маркеры 1 и 2 соответственно. Теперь каждый пришедший пакет будет отмечен одним из них, и маршрутизатор будет анализировать только ту RT, к которой этот маркер относится.

set protocols static route 0.0.0.0/0 next-hop 192.0.2.1
set protocols static route 0.0.0.0/0 next-hop 203.0.113.1
set protocols static table 1 mark 1
set protocols static table 1 route 0.0.0.0/0 next-hop 192.0.2.1
set protocols static table 2 mark 2
set protocols static table 2 route 0.0.0.0/0 next-hop 203.0.113.1

Балансировка нагрузки

Как было сказано выше, маркеры могут присваиваться пакетам, однако, они также могут назначаться и соединениям.
  При использовании брандмауэра с отслеживанием состояния, все подключения в системе фиксируются, что позволяет сохранять или восстанавливать метки между соединениями и пакетами.
  Сейчас мы попробуем сделать так, чтобы новое подключение 50% времени принимало пакеты с меткой 1, а другие 50% — пакеты с отметкой 2. После этого мы создадим второе соединение и присвоим ему маркер 2.
  Таким образом, из двух существующих соединений одно будет попеременно работать с пакетами, помеченными флагами 1 и 2, а второе — только с теми, у которых стоит маркер 2.
  В данном примере существующие соединения уже пронумерованы, поэтому мы просто проводим восстановление метки пакета:

set firewall modify balance rule 10 action modify
set firewall modify balance rule 10 description 'restore mark from connection'
set firewall modify balance rule 10 modify connmark restore-mark
set firewall modify balance rule 20 action accept
set firewall modify balance rule 20 description 'accept the packet if the mark isnt zero'
set firewall modify balance rule 20 mark '!0'
set firewall modify balance rule 30 action modify
set firewall modify balance rule 30 description 'for new connections mark 50% with mark 1'
set firewall modify balance rule 30 modify mark 1
set firewall modify balance rule 30 protocol tcp_udp
set firewall modify balance rule 30 state new enable
set firewall modify balance rule 30 statistic probability 50%
set firewall modify balance rule 40 action modify
set firewall modify balance rule 40 description 'for packets with mark zero, mark with 2'
set firewall modify balance rule 40 mark 0
set firewall modify balance rule 40 modify mark 2
set firewall modify balance rule 40 protocol tcp_udp
set firewall modify balance rule 40 state new enable
set firewall modify balance rule 50 action modify
set firewall modify balance rule 50 description 'save the packet mark to the connection mark'
set firewall modify balance rule 50 modify connmark save-mark
Затем необходимо применить данную политику к нашему LAN интерфейсу.
set interfaces ethernet eth2 firewall in modify balance

Тестирование

Здесь мы видим, что правила 30 и 40 почти сбалансированы 50/50:

ubnt@PBR:~$ show firewall modify statistics
--------------------------------------------------------------------------------
IPv4 Firewall "balance"
Active on (eth2,IN)
rule packets bytes action description
---- ------- ----- ------ -----------
10 399516 61839166 MODIFY restore mark from connection
20 366897 59641481 ACCEPT accept the packet if the mark isn't zero
30 16196 1094021 MODIFY for new connections mark 50% with mark 1
40 16377 1101667 MODIFY for packets with mark zero, mark with 2
50 32619 2197685 MODIFY save the packet mark to the connection mark
10000 32619 2197685 ACCEPT DEFAULT ACTION

Новые WAN соединения

При наличии правил переадресации портов, со стороны WAN могут быть инициированы новые подключения. Для того, чтобы новые соединения выходили из того же интерфейса, с которого они вошли, нужно поставить метку 1 на подключениях от ISP1, а на подключениях от ISP2 установить маркер 2.

set firewall modify ISP1_IN rule 1 description 'use mark 1 for new ISP1 connections'
set firewall modify ISP1_IN rule 1 action modify
set firewall modify ISP1_IN rule 1 log enable
set firewall modify ISP1_IN rule 1 modify connmark set-mark 1
set firewall modify ISP1_IN rule 1 protocol tcp_udp
set firewall modify ISP1_IN rule 1 state new enable
set firewall modify ISP2_IN rule 1 description 'use mark 2 for new ISP2 connections'
set firewall modify ISP2_IN rule 1 action modify
set firewall modify ISP2_IN rule 1 log enable
set firewall modify ISP2_IN rule 1 modify connmark set-mark 2
set firewall modify ISP2_IN rule 1 protocol tcp_udp
set firewall modify ISP2_IN rule 1 state new enable
Добавим их в WAN интерфейс:
set interfaces ethernet eth0 firewall in modify ISP1_IN
set interfaces ethernet eth1 firewall in modify ISP2_IN
Пример конфигурации:
firewall {
modify ISP1_IN {
rule 1 {
action modify
description "use mark 1 for new ISP1 connections"
log enable

modify {
connmark {
set-mark 1
}
}
protocol tcp_udp
state {
new enable
}
}
}
modify ISP2_IN {
rule 1 {
action modify
description "use mark 2 for new ISP2 connections"
log enable
modify {
connmark {
set-mark 2
}
}
protocol tcp_udp
state {
new enable
}
}
}
modify balance {
enable-default-log
rule 10 {
action modify
description "restore mark from connection"
modify {
connmark {
restore-mark
}
}
}
rule 20 {
action accept
description "accept the packet if the mark isn't zero"
mark !0
}
rule 30 {
action modify
description "for new connections mark 50% with mark 1"
modify {
mark 1

}

protocol tcp_udp
state {

new enable
}
statistic {
probability 50%
}
}
rule 40 {
action modify
description "for packets with mark zero, mark with 2"
mark 0
modify {
mark 2
}
protocol tcp_udp
state {
new enable
}
}
rule 50 {
action modify
description "save the packet mark to the connection mark"
modify {
connmark {
save-mark
}
}
}
}
}
interfaces {
ethernet eth0 {
address 192.0.2.2/24
duplex auto
firewall {
in {
modify ISP1_IN
}
}
speed auto
}
ethernet eth1 {
address 203.0.113.2/24
duplex auto
firewall {
in {

modify ISP2_IN
}

}
speed auto

}
ethernet eth2 {

address 172.16.0.1/24
duplex auto
firewall {
in {
modify balance
}
}
speed auto
}
loopback lo {
}
}
protocols {
static {
route 0.0.0.0/0 {
next-hop 192.0.2.1 {
}
next-hop 203.0.113.1 {
}
}
table 1 {
mark 1
route 0.0.0.0/0 {
next-hop 192.0.2.1 {
}
}
}
table 2 {
mark 2
route 0.0.0.0/0 {
next-hop 203.0.113.1 {
}
}
}
}
}
service {

dhcp-server {
disabled false
shared-network-name LAN {
authoritative disable
subnet 172.16.0.0/24 {
default-router 172.16.0.1
dns-server 8.8.8.8
lease 86400

start 172.16.0.10 {
stop 172.16.0.100
}
}
}
}
gui {
https-port 443
}
nat {
rule 5000 {
outbound-interface eth0
type masquerade
}
rule 6000 {
outbound-interface eth1
type masquerade
}
}
ssh {
port 22
protocol-version v2
}
}
system {
host-name WLB
login {
user ubnt {
authentication {
encrypted-password $1$zKNoUbAo$gomzUbYvgyUMcD436Wo66.
}
level admin
}
}
name-server 8.8.8.8
ntp {
server 0.ubnt.pool.ntp.org {
}
server 1.ubnt.pool.ntp.org {
}

server 2.ubnt.pool.ntp.org {
}

server 3.ubnt.pool.ntp.org {
}

}

syslog {
global {

facility all {
level notice

}

facility protocols {

level debug

}
}

}

time-zone UTC
}

/* Warning: Do not remove the following line. */
/* === vyatta-config-version: "config-management@1:dhcp-relay@1:dhcp-server@4:firewall@4:ipsec@3:nat@3:qos@1:quagga@2:system@4:ubnt-pptp@1:vrrp@1:webgui@1:webproxy@1:zone-policy@1" === */
/* Release version: v1.1.0beta3dev.4539852.130227.0102 */

Комментариев пока нет Добавить комментарий
— Имя — Почта
символов набрано, макс. 1500

Другие темы

UniFiAirFiber
AirMaxAirVision
EdgeMax

Другие вопросы