Mikrotik. PCC. обеспечение одновременной работы двух интернет каналов, балансировка нагрузки и одновременное обеспечение отказоустойчивости между ними

Введение

Эта статья является вольным переводом статьи PCC официальной Wiki Mikrotik.

С помощью PCC возможно разделить трафик на равные потоки с возможностью сохранения пакетов с определенным набором опций в одном конкретном потоке. Это требуется, например, для обеспечения одновременной работы двух интернет каналов, балансировки нагрузки и одновременном обеспечении отказоустойчивости между ними.

Теория

PCC выбирает выбранные значение из заголовка IP пакетов и с помощью хеширующих алгоритмов конвертирует выбранные значения в 32 битные числа. Полученное значение затем сравнивается с указанным Знаменателем, а остаток сравнивается с указанным Остатком и в случае совпадения, пакет захватывается. Для этого вы можете выбирать значения из src-address, dst-address, src-port, dst-port из заголовка пакета.

per-connection-classifier=
PerConnectionClassifier ::= [!]ValuesToHash:Denominator/Remainder
  Remainder ::= 0..4294967295    (integer number)
  Denominator ::= 1..4294967295    (integer number)
  ValuesToHash ::= both-addresses|both-ports|dst-address-and-port|
  src-address|src-port|both-addresses-and-ports|dst-address|dst-port|src-address-and-port 

Пример

Эта конфигурация будет делить все соединения на 3 группы основываясь на поля source address and port:

/ip firewall mangle add chain=prerouting action=mark-connection \
 new-connection-mark=1st_conn per-connection-classifier=src-address-and-port:3/0
/ip firewall mangle add chain=prerouting action=mark-connection \
  new-connection-mark=2nd_conn per-connection-classifier=src-address-and-port:3/1
/ip firewall mangle add chain=prerouting action=mark-connection \
  new-connection-mark=3rd_conn per-connection-classifier=src-address-and-port:3/2

Примечания

  1. PCC доступен начиная с версии RouterOS v3.24.

2. PCC не рассчитан на совместную работу с включенной опцией RP Filter

Пример конфигурации – балансировка нагрузки (Load Balancing)

Рассмотрим следующую конфигурацию:

Готовая конфигурация для нетерпеливых

Экспорт конфигурации для нетерпеливых:

 / ip address
 add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=LAN
 add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=ISP1
 add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=ISP2
  
 / ip firewall mangle
 add chain=prerouting dst-address=10.111.0.0/24  action=accept in-interface=LAN
 add chain=prerouting dst-address=10.112.0.0/24  action=accept in-interface=LAN
 add chain=prerouting in-interface=ISP1 connection-mark=no-mark action=mark-connection \
     new-connection-mark=ISP1_conn
 add chain=prerouting in-interface=ISP2 connection-mark=no-mark action=mark-connection \ 
     new-connection-mark=ISP2_conn
 add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \
     per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1_conn 
 add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \ 
     per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2_conn
 add chain=prerouting connection-mark=ISP1_conn in-interface=LAN action=mark-routing \ 
     new-routing-mark=to_ISP1
 add chain=prerouting connection-mark=ISP2_conn in-interface=LAN action=mark-routing \
     new-routing-mark=to_ISP2
 add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1     
 add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2
  
 / ip route
 add dst-address=0.0.0.0/0 gateway=10.111.0.1 routing-mark=to_ISP1 check-gateway=ping
 add dst-address=0.0.0.0/0 gateway=10.112.0.1 routing-mark=to_ISP2 check-gateway=ping
 add dst-address=0.0.0.0/0 gateway=10.111.0.1 distance=1 check-gateway=ping
 add dst-address=0.0.0.0/0 gateway=10.112.0.1 distance=2 check-gateway=ping
  
 / ip firewall nat 
 add chain=srcnat out-interface=ISP1 action=masquerade
 add chain=srcnat out-interface=ISP2 action=masquerade

Объяснения

Рассмотрим подробнее вышеуказанную конфигурацию:

IP адреса

/ ip address 
add address=192.168.0.1/24 network=192.168.0.0 broadcast=192.168.0.255 interface=LAN
add address=10.111.0.2/24 network=10.111.0.0 broadcast=10.111.0.255 interface=ISP1
add address=10.112.0.2/24 network=10.112.0.0 broadcast=10.112.0.255 interface=ISP2

Задаем два внешних интерфейса роутера: 10.111.0.2/24 и 10.112.0.2/24, обозначаем их ISP1 и ISP2. Задаем интерфейс внутренней сети с IP: 192.168.0.1/24.

Политики маршрутизации

Маркировка маршрутов

/ ip firewall mangle
add chain=prerouting dst-address=10.111.0.0/24  action=accept in-interface=LAN
add chain=prerouting dst-address=10.112.0.0/24  action=accept in-interface=LAN

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

add chain=prerouting in-interface=ISP1 connection-mark=no-mark action=mark-connection \
    new-connection-mark=ISP1_conn
add chain=prerouting in-interface=ISP2 connection-mark=no-mark action=mark-connection \ 
    new-connection-mark=ISP2_conn

Затем, первое что надо сделать это промаркировать соединения инициированные извне для того, чтобы отправлять ответы через тот же интерфейс (с того же внешнего IP), на который они получены.

add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \
    per-connection-classifier=both-addresses:2/0 action=mark-connection new-connection-mark=ISP1_conn 
add chain=prerouting  in-interface=LAN connection-mark=no-mark dst-address-type=!local \ 
    per-connection-classifier=both-addresses:2/1 action=mark-connection new-connection-mark=ISP2_conn

Действие mark-routing доступно только в цепочках output и prerouting, но цепочка mangle prerouting также будет захватывать весь траффик предназначенный самому роутеру. Чтобы избежать этого, будем использовать dst-address-type=!local, и с помощью нового PCC мы будем делить весь траффик на две группы основываясь на адресе отправителя и адресе получателя.

add chain=prerouting connection-mark=ISP1_conn in-interface=LAN action=mark-routing \ 
    new-routing-mark=to_ISP1
add chain=prerouting connection-mark=ISP2_conn in-interface=LAN action=mark-routing \
    new-routing-mark=to_ISP2
add chain=output connection-mark=ISP1_conn action=mark-routing new-routing-mark=to_ISP1     
add chain=output connection-mark=ISP2_conn action=mark-routing new-routing-mark=to_ISP2

Затем нам нужно промаркировать все пакеты из соединений с определенной меткой. Так как политика маршрутизации требуется только для траффика уходящего в Интернет, не забудьте указать входящий интерфейс (опция in-interface).

Добавление маршрутов

/ ip route
add dst-address=0.0.0.0/0 gateway=10.111.0.1 routing-mark=to_ISP1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.112.0.1 routing-mark=to_ISP2 check-gateway=ping

Добавляем маршрут для каждой маркировки

add dst-address=0.0.0.0/0 gateway=10.111.0.1 distance=1 check-gateway=ping
add dst-address=0.0.0.0/0 gateway=10.112.0.1 distance=2 check-gateway=ping

Добавляем резервные маршруты на случай падения основных, чтобы каналы автоматически переключались между друг другом (это будет работать только при включенной опции check-gateway)

NAT

/ ip firewall nat 
add chain=srcnat out-interface=ISP1 action=masquerade
add chain=srcnat out-interface=ISP2 action=masquerade

После решения о маршрутизации требуется “исправить” src-addresses для всех исходящих пакетов. Если пакет отправлен через wlan1, то он должен быть отправлен от 10.112.0.2, а если отправлен через wlan2 то от 10.111.0.2.

Ссылки

https://wiki.mikrotik.com/wiki/Manual:PCC#NAT

Оставьте ответ

Ваш адрес email не будет опубликован.

85 ÷ 85 =