Policy Based Routing (Linux + Juniper)
В этой статье мы рассмотрим настройку маршрутизации на основе политик (Policy Based Routing, PBR) для управления трафиком от сервера в Интернет в зависимости от IP-адреса источника. Опишем шаги по конфигурации PBR на сервере c Ubuntu и маршрутизаторах Juniper MX.
Схема стенда
![Сетевая схема стенда Сетевая схема стенда](https://habrastorage.org/getpro/habr/upload_files/05c/c8a/f6e/05cc8af6ee1fe5a0d4e36b6bb9c22fcd.png)
Дано: сервер с Ubuntu и два маршрутизатора Juniper MX
Задача: настроить PBR (Policy Based Routing). Необходимо в зависимости от source ip сервера маршрутизировать трафик в определенный ISP (Internet Service Provider).
Настройка сервера
Конфигурация netplan:
network:
version: 2
renderer: networkd
ethernets:
eth0:
dhcp4: no
addresses:
- 10.0.0.3/24
routes:
- to: 0.0.0.0/0
via: 10.0.0.1 #router1
table: 101
on-link: True
- to: 0.0.0.0/0
via: 10.0.0.2 #router2
table: 102
on-link: True
lo:
addresses:
- 198.51.100.1/32 # Для ISP1
- 198.51.100.2/32 # Для ISP2
- 198.51.100.3/32 # Для ISP3
- 198.51.100.4/32 # Для ISP4
- 198.51.100.5/32 # Для ISP5
- 198.51.100.6/32 # Для ISP6
На сервере прописываются два маршрута по умолчанию и т.к. у нас два маршрутизатора сделать это нужно в разных route table:
Маршрут в таблице 101 через 10.0.0.1 (router1);
Маршрут в таблице 102 через 10.0.0.2 (router2);
server:~$ ip route show table 101
default via 10.0.0.1 dev eth0 proto static onlink
server:~$ ip route show table 102
default via 10.0.0.2 dev eth0 proto static onlink
Создаем routing-policy, в которой указываем заворачивать трафик с IP-адресов 198.51.100.[1-3] в table 101, трафик с IP-адресов 198.51.100.[4-6] в table 102:
routing-policy:
- from: 198.51.100.1/32
table: 101
- from: 198.51.100.2/32
table: 101
- from: 198.51.100.3/32
table: 101
- from: 198.51.100.4/32
table: 102
- from: 198.51.100.5/32
table: 102
- from: 198.51.100.6/32
table: 102
Настройка маршрутизаторов Juniper MX
Создаем firewall filter для PBR:
#ISP1
set firewall filter PBR term ISP1 from source-address 198.51.100.1/32
set firewall filter PBR term ISP1 then next-ip 203.0.113.1
#ISP2
set firewall filter PBR term ISP2 from source-address 198.51.100.2/32
set firewall filter PBR term ISP2 then next-ip 203.0.113.2
#ISP3
set firewall filter PBR term ISP3 from source-address 198.51.100.3/32
set firewall filter PBR term ISP4 then next-ip 203.0.113.3
#ISP4
set firewall filter PBR term ISP4 from source-address 198.51.100.4/32
set firewall filter PBR term ISP5 then next-ip 203.0.113.4
#ISP5
set firewall filter PBR term ISP5 from source-address 198.51.100.5/32
set firewall filter PBR term ISP5 then next-ip 203.0.113.5
#ISP6
set firewall filter PBR term ISP6 from source-address 198.51.100.6/32
set firewall filter PBR term ISP6 then next-ip 203.0.113.6
Если в вашей архитектуре стыки с провайдерами вынесены в отдельный routing-instance, то в каждый term необходимо добавить:
set firewall filter PBR term <ISPX> then next-ip routing-instance <routing-instance name>
Применяем firewall filter "PBR" на интерфейсы router1 и router2:
#router1
set interfaces irb unit 200 family inet filter input PBR
set interfaces irb unit 200 family inet address 10.0.0.1/24
#router2
set interfaces irb unit 200 family inet filter input PBR
set interfaces irb unit 200 family inet address 10.0.0.2/24
Проверяем доступность ресурса в Интернет с помощью traceroute, опция -s позволяет указать какой IP использовать в качестве source.
Нас интересуют только первые два хопа:
server# traceroute 8.8.8.8 -ns 198.51.100.1
1 10.0.0.1
2 203.0.113.1
3 ***
-----
server# traceroute 8.8.8.8 -ns 198.51.100.2
1 10.0.0.1
2 203.0.113.2
3 ***
-----
server# traceroute 8.8.8.8 -ns 198.51.100.3
1 10.0.0.1
2 203.0.113.3
3 ***
-----
server# traceroute 8.8.8.8 -ns 198.51.100.4
1 10.0.0.2
2 203.0.113.4
3 ***
-----
server# traceroute 8.8.8.8 -ns 198.51.100.5
1 10.0.0.2
2 203.0.113.5
3 ***
-----
server# traceroute 8.8.8.8 -ns 198.51.100.6
1 10.0.0.2
2 203.0.113.6
3 ***
Итого, трафик распределяется по ISP в зависимости от src IP сервера.
Варианты применения:
Проверка доступности ресурсов в сети Интернет через определенного провайдера;
Сбор диагностической информации (rtt, packet loss, etc) по провайдерам;
Проверки будет проводить инженер, у которого нет доступа(и не должно быть) к сетевому оборудованию;
Другие варианты траблшутинга, проверки можно автоматизировать с помощью скриптов на сервере;
P.S. Статья написана в соотвествии с RFC5737, который описывает 3 блока IP-адресов, зарезервированных для примеров, использования в описаниях спецификаций и в документации