Задачи:
- Поднять три виртуалки
- Объединить их разными vlan
- поднять OSPF между машинами на базе Quagga или FRR или BIRD;
- изобразить ассиметричный роутинг
- сделать один из линков "дорогим", но что бы при этом роутинг был симметричным.
- Формат сдачи: Vagrantfile + ansible
Решение задачи с объединением узлов разными vlan находится в ветке vlan данного репозитория
- Клонируем репозиторий:
git clone https://github.com/mmmex/ospf.git
- Переходим в каталог:
cd ospf
- Запускаем проект:
vagrant up
Будут подняты 3 ВМ: router1
, router2
и router3
с установленным FRR версии 8.4.2
Топология сети:
Таблицы хостов:
Router1:
Интерфейс | Адрес | Сосед |
---|---|---|
eth1 | 10.0.10.1/30 | Router2 |
eth2 | 10.0.12.1/30 | Router3 |
eth3 | 192.168.10.1/24 | - |
Router2:
Интерфейс | Адрес | Сосед |
---|---|---|
eth1 | 10.0.10.2/30 | Router1 |
eth2 | 10.0.11.2/30 | Router3 |
eth3 | 192.168.20.1/24 | - |
Router3:
Интерфейс | Адрес | Сосед |
---|---|---|
eth1 | 10.0.11.1/30 | Router2 |
eth2 | 10.0.12.2/30 | Router1 |
eth3 | 192.168.30.1/24 | - |
При данной конфигурации маршрутизация осуществляется симметрично.
Что такое асимметричная маршрутизация? При асимметричной маршрутизации пакет проходит от источника к получателю по одному пути и выбирает другой путь, когда возвращается к источнику.
В основе такой маршрутизации лежит разделение маршрутов исходящего и входящего трафика. Например, входящий трафик может приниматься от одного провайдера, а исходящий будет отправляться через другого. Разделение среды передачи данных приведено для примера и чаще используется единая среда. Использование асимметричной маршрутизации может негативно сказаться на передаче данных в сетях с VPN на пути следования данных. Использование такого типа маршрутизации целесообразно только в больших сетях, в которых больше одного шлюза. В ряде случаев асимметричную маршрутизацию используют с целью снижения нагрузки на канал передачи данных, путем перенаправления части трафика через другие каналы. Такой способ снижения нагрузки применим только в случае, если имеется два и более каналов передачи данных. Также, среди причин использования асимметричной маршрутизации можно рассмотреть коммерческую выгоду при использовании burstable-биллинга, когда организации выгодно платить только за часть трафика. источник
Для выполнения данного вида маршрутизации нужно определенным образом настроить ядро ОС, а также интерфейсы для протокола OSPF. В данной инструкции будет выполнена настройка ВМ router1
и router2
.
- В целях экономии времени подготовлен playbook ansible, который выполнит необходимые действия автоматически.
Можно пропустить этот блок инструкции и приступить к выполнению следующего.
Для конфигурации вручную необходимо выполнить следующие шаги:
- Отключить в ядре ОС проверку адреса источника глобально и на интерфейсе
eth1
ВМrouter1
(параметрnet.ipv4.conf.all.rp_filter
иnet.ipv4.conf.eth1.rp_filter
):vagrant ssh router1
выполняем вход наrouter1
;sudo -i
повышаем привелегию пользователя;sysctl -w net.ipv4.conf.all.rp_filter=0
отключаем глобально проверку;sysctl -w net.ipv4.conf.eth1.rp_filter=0
отключаем проверку на конкретном интерфейсе;- если потребуется запомнить состояние конфигурации, то необходимо записать данные значения в файл
/etc/sysctl.conf
.
- Увеличить стоимость (
cost
) соединения на интерфейсеeth1
маршрутизатораrouter1
, к примеру до 1000:vagrant ssh router1
выполняем вход наrouter1
;sudo -i
повышаем привелегию пользователя;vtysh
входим в консоль управленияFRR
;conf t
входим в режим конфигурирования;int eth1
переходим в раздел конфигурации интерфейсаeth1
;ip ospf cost 1000
устанавливаем новое значениеcost
в 1000;exit
выход из терминала режима конфигурирования.
test@test-virtual-machine:~/Otus/ospf$ vagrant ssh router1
Last login: Mon Jan 23 11:54:15 2023 from 10.0.2.2
[vagrant@router1 ~]$ sudo -i
[root@router1 ~]# sysctl -w net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
[root@router1 ~]# sysctl -w net.ipv4.conf.eth1.rp_filter=0
net.ipv4.conf.eth1.rp_filter = 0
[root@router1 ~]# vtysh
Hello, this is FRRouting (version 8.4.2).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
router1# conf t
router1(config)# int eth1
router1(config-if)# ip ospf cost 1000
router1(config-if)# exit
router1(config)# exit
- Отключить в ядре ОС проверку адреса источника глобально и на интерфейсе
eth2
ВМrouter2
:vagrant ssh router2
выполняем вход наrouter2
;sudo -i
повышаем привелегию пользователя;sysctl -w net.ipv4.conf.all.rp_filter=0
отключаем глобально проверку;sysctl -w net.ipv4.conf.eth2.rp_filter=0
отключаем проверку на конкретном интерфейсе.
test@test-virtual-machine:~/Otus/ospf$ vagrant ssh router2
Last login: Mon Jan 23 11:54:21 2023 from 10.0.2.2
[vagrant@router2 ~]$ sudo -i
[root@router2 ~]# sysctl -w net.ipv4.conf.all.rp_filter=0
net.ipv4.conf.all.rp_filter = 0
[root@router2 ~]# sysctl -w net.ipv4.conf.eth2.rp_filter=0
net.ipv4.conf.eth2.rp_filter = 0
На этом настройка асимметричной маршрутизации закончена.
Чтобы выполнить действия автоматически из ansible-playbook
выполним команду: cd ansible; ansible-playbook asymmetric-routing.yml
- Выполним вход на
router1
:vagrant ssh router1
- Запускаем команду
ping
с интерфейса (ключ -I)192.168.10.1
на узел192.168.20.1
:ping -I 192.168.10.1 192.168.20.1
- если настройка выполнена корректно, то должны получить ответы
ICMP
.
- если настройка выполнена корректно, то должны получить ответы
- В новом терминале выполняем вход в папку с репозиторием:
cd ospf
- Выполняем вход на
router2
:vagrant ssh router2
- Повышаем привелегии пользователя:
sudo -i
- Утилитой
tcpdump
захватываем трафикICMP
на интерфейсеeth2
:tcpdump -nvvv -i eth2 icmp
(чтобы прервать вывод команды нажимаем комбинациюCtrl-C
)
[root@router2 ~]# tcpdump -nvvv -i eth2 icmp
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
16:22:24.795120 IP (tos 0x0, ttl 63, id 31057, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.10.1 > 192.168.20.1: ICMP echo request, id 25615, seq 21, length 64
16:22:25.796533 IP (tos 0x0, ttl 63, id 31090, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.10.1 > 192.168.20.1: ICMP echo request, id 25615, seq 22, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
Вывод: как показано на диаграмме ниже, запросы ICMP echo request
приходят от источника 192.168.10.1
(router1 - eth3) для 192.168.20.1
(router2 - eth3), но ответа нет, потому-что ICMP echo reply
уходят с другого интерфейса eth1
.
- Прерываем работу утилиты
tcpdump
комбинациейCtrl-C
- Выполняем захват трафика
ICMP
с интерфейсаeth1
:tcpdump -nvvv -i eth1 icmp
[root@router2 ~]# tcpdump -nvvv -i eth1 icmp
tcpdump: listening on eth1, link-type EN10MB (Ethernet), capture size 262144 bytes
17:06:37.010066 IP (tos 0x0, ttl 64, id 1420, offset 0, flags [none], proto ICMP (1), length 84)
192.168.20.1 > 192.168.10.1: ICMP echo reply, id 25615, seq 2668, length 64
17:06:38.011599 IP (tos 0x0, ttl 64, id 1991, offset 0, flags [none], proto ICMP (1), length 84)
192.168.20.1 > 192.168.10.1: ICMP echo reply, id 25615, seq 2669, length 64
^C
2 packets captured
2 packets received by filter
0 packets dropped by kernel
Видим что ответы ICMP echo reply
действительно уходят с интерфейса eth1
router2
.
Можем посмотреть таблицу маршрутизации на router1
: vtysh -c 'sh ip route'
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, A - Babel, F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure
K>* 0.0.0.0/0 [0/100] via 10.0.2.2, eth0, 16:50:50
C>* 10.0.2.0/24 is directly connected, eth0, 16:50:50
O 10.0.10.0/30 [110/135] via 10.0.12.2, eth2, weight 1, 03:16:57
C>* 10.0.10.0/30 is directly connected, eth1, 16:50:50
O>* 10.0.11.0/30 [110/90] via 10.0.12.2, eth2, weight 1, 07:29:08
O 10.0.12.0/30 [110/45] is directly connected, eth2, weight 1, 16:50:50
C>* 10.0.12.0/30 is directly connected, eth2, 16:50:50
O 192.168.10.0/24 [110/45] is directly connected, eth3, weight 1, 16:50:50
C>* 192.168.10.0/24 is directly connected, eth3, 16:50:50
O>* 192.168.20.0/24 [110/135] via 10.0.12.2, eth2, weight 1, 07:29:08
O>* 192.168.30.0/24 [110/90] via 10.0.12.2, eth2, weight 1, 16:42:21
Здесь мы видим что router1
может добраться до 192.168.20.1
через своего соседа router3
(10.0.12.2
). Если-бы стоимость на интерфейсе eth1
была равной 45, то в таблицу маршрутизации попал маршрут до узла который ближе (router2
).
Таблица маршрутизации на router1
до изменения стоимости маршрута:
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, A - Babel, F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure
K>* 0.0.0.0/0 [0/100] via 10.0.2.2, eth0, 17:50:12
C>* 10.0.2.0/24 is directly connected, eth0, 17:50:12
O 10.0.10.0/30 [110/45] is directly connected, eth1, weight 1, 00:00:08
C>* 10.0.10.0/30 is directly connected, eth1, 17:50:12
O>* 10.0.11.0/30 [110/90] via 10.0.10.2, eth1, weight 1, 00:00:08
* via 10.0.12.2, eth2, weight 1, 00:00:08
O 10.0.12.0/30 [110/45] is directly connected, eth2, weight 1, 17:50:12
C>* 10.0.12.0/30 is directly connected, eth2, 17:50:12
O 192.168.10.0/24 [110/45] is directly connected, eth3, weight 1, 17:50:12
C>* 192.168.10.0/24 is directly connected, eth3, 17:50:12
O>* 192.168.20.0/24 [110/90] via 10.0.10.2, eth1, weight 1, 00:00:08
O>* 192.168.30.0/24 [110/90] via 10.0.12.2, eth2, weight 1, 17:41:43
И посмотреть таблицу маршрутизации на router2
: vtysh -c 'sh ip route'
Codes: K - kernel route, C - connected, S - static, R - RIP,
O - OSPF, I - IS-IS, B - BGP, E - EIGRP, N - NHRP,
T - Table, A - Babel, F - PBR, f - OpenFabric,
> - selected route, * - FIB route, q - queued, r - rejected, b - backup
t - trapped, o - offload failure
K>* 0.0.0.0/0 [0/100] via 10.0.2.2, eth0, 17:29:46
C>* 10.0.2.0/24 is directly connected, eth0, 17:29:46
O 10.0.10.0/30 [110/45] is directly connected, eth1, weight 1, 04:00:12
C>* 10.0.10.0/30 is directly connected, eth1, 17:29:46
O 10.0.11.0/30 [110/45] is directly connected, eth2, weight 1, 17:29:45
C>* 10.0.11.0/30 is directly connected, eth2, 17:29:46
O>* 10.0.12.0/30 [110/90] via 10.0.10.1, eth1, weight 1, 04:00:12
* via 10.0.11.1, eth2, weight 1, 04:00:12
O>* 192.168.10.0/24 [110/90] via 10.0.10.1, eth1, weight 1, 04:00:12
O 192.168.20.0/24 [110/45] is directly connected, eth3, weight 1, 17:29:45
C>* 192.168.20.0/24 is directly connected, eth3, 17:29:46
O>* 192.168.30.0/24 [110/90] via 10.0.11.1, eth2, weight 1, 17:25:44
Симметричная сеть имеет один маршрут для входящего и исходящего сетевого трафика. Нам достаточно изменить стоимость на интерфейсе eth1
ВМ router2
чтобы маршрутизация была симметричной:
- Выполним вход на
router2
:vagrant ssh router2
- Повышаем привелегии:
sudo -i
- Заходим в консоль управления FRR:
vtysh
conf t
входим в режим конфигурирования;int eth1
переходим в раздел конфигурации интерфейсаeth1
;ip ospf cost 1000
устанавливаем новое значениеcost
в 1000;exit
выход из режима конфигурирования интерфейсаeth1
;exit
выход из режима конфигурированияfrr
;exit
выход изvtysh
test@test-virtual-machine:~/Otus/ospf$ vagrant ssh router2
Last login: Mon Jan 23 16:56:40 2023 from 10.0.2.2
[vagrant@router2 ~]$ sudo -i
[root@router2 ~]# vtysh
Hello, this is FRRouting (version 8.4.2).
Copyright 1996-2005 Kunihiro Ishiguro, et al.
router2# conf t
router2(config)# int eth1
router2(config-if)# ip ospf cost 1000
router2(config-if)# exit
router2(config)# exit
router2# exit
- Выполним вход на
router1
:vagrant ssh router1
- Запускаем команду
ping
с интерфейса (ключ -I)192.168.10.1
на узел192.168.20.1
:ping -I 192.168.10.1 192.168.20.1
- если настройка выполнена корректно, то должны получить ответы
ICMP
.
- если настройка выполнена корректно, то должны получить ответы
- В новом терминале выполняем вход в папку с репозиторием:
cd ospf
- Выполняем вход на
router2
:vagrant ssh router2
- Повышаем привелегии пользователя:
sudo -i
- Утилитой
tcpdump
захватываем трафикICMP
на интерфейсеeth2
:tcpdump -nvvv -i eth2 icmp
(чтобы прервать вывод команды нажимаем комбинациюCtrl-C
)
[root@router2 ~]# tcpdump -nvvv -i eth2 icmp
tcpdump: listening on eth2, link-type EN10MB (Ethernet), capture size 262144 bytes
21:11:13.537981 IP (tos 0x0, ttl 63, id 1914, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.10.1 > 192.168.20.1: ICMP echo request, id 25615, seq 17316, length 64
21:11:13.538009 IP (tos 0x0, ttl 64, id 892, offset 0, flags [none], proto ICMP (1), length 84)
192.168.20.1 > 192.168.10.1: ICMP echo reply, id 25615, seq 17316, length 64
21:11:14.540087 IP (tos 0x0, ttl 63, id 2643, offset 0, flags [DF], proto ICMP (1), length 84)
192.168.10.1 > 192.168.20.1: ICMP echo request, id 25615, seq 17317, length 64
21:11:14.540119 IP (tos 0x0, ttl 64, id 1133, offset 0, flags [none], proto ICMP (1), length 84)
192.168.20.1 > 192.168.10.1: ICMP echo reply, id 25615, seq 17317, length 64
^C
4 packets captured
4 packets received by filter
0 packets dropped by kernel
Вывод: как показано на диаграмме ниже, запросы ICMP echo request
приходят от источника 192.168.10.1
(router1 - eth3) для 192.168.20.1
(router2 - eth3) и ICMP echo reply
теперь уходят с этого-же интерфейса.
- Прерываем работу утилиты
tcpdump
комбинациейCtrl-C
-
Vagrant при создании ВМ использует на гостевой ОС свой интерфейс
10.0.2.15/24
и прокидывает для подключения поSSH
на адрес хоста127.0.0.1
портTCP 2222
для первой ВМ,TCP 2200
для второй и т.д. -
Командой
vagrant ssh-config
можем посмотреть настройки интерфейсов. Можно просто сопоставить вывод командыvagrant ssh-config
с файлом инвентаризации ansible. -
Прописывать соседей OSPF необязательно, если они подключены непосредственно (direct connect).