Оглавление
Введение
Эта статья является вольным переводом статьи 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
Примечания
- 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.