Quagga — пакет программного обеспечения, позволяющий превратить обычный компьютер в маршрутизатор TCP/IP с поддержкой разнообразных протоколов маршрутизации.
Поддерживаются следующие протоколы маршрутизации:
- статическая маршрутизация;
- Routing Information Protocol (RIP): v1, v2, v3
- Open Shortest Path First (OSPF): v2, v3
- Border Gateway Protocol (BGP): v4
На данный момент возникла необходимость в статической маршрутизации. Соответственно опишем установку и начальную настройку демона zebra.
Устанавливаем quagga из портов:
# cd /usr/ports/net/quagga/
# make install clean
Как видим из предложеных опций, в последних версиях появилась поддержка протокола IS-IS (Intermediate System to Intermediate System). Но поскольку поддержка данного протокола находится в експериментальном режиме, то пока откажемся от его установки. По ходу, все опции оставляю по умолчанию.
По завершению установки добавляем необходимость запуска quagga и демона zebra при запуске системы:
# cat /etc/rc.conf | grep quagga quagga_enable="YES" quagga_daemons="zebra" watchquagga_enable="YES" watchquagga_flags="-dz -R '/usr/local/sbin/zebra -d;' zebra"
Watchquagga – это дополнение к quagga. Мониторит доступность указаных демонов quagga, и в случае, если демон не отвечает – перезапускает его.
Создаем каталог, где будут лежать конфигурационные файлы наших демонов маршрутизации. Создаем файл конфигурации для демона статической маршрутизации zebra, выставляем необходимые права:
# touch /usr/local/etc/quagga/zebra.conf
# chmod 600 /usr/local/etc/quagga/zebra.conf
# chown -R quagga:quagga /usr/local/etc/quagga
Наполняем файл следующим содержимым:
# cat /usr/local/etc/quagga/zebra.confpassword pass1 enable password pass2
Дело в том, что подключаться к демону маршрутизации для последующей настройки мы будем по виртуальному терминалу, а в случае, если пароль не задан, то терминал это подключение отбросит (требование безопасности).
Кстати, не помешает создать каталог, где будет хранить свои логи quagga:
# mkdir /var/log/quagga
# chown quagga:quagga /var/log/quagga
Запускаем quagga и пробуем подключиться к запущеному демону:
# sh /usr/local/etc/rc.d/quagga start Starting zebra.
# telnet localhost zebra Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.
Консоль управления полностью идентична Cisco CLI. Поэтому многим будет знакома. Если же нет – смотрите комментарии к набираемым командам (выделено красным).
Итак, мы уже подлючены к виртуальной консоли. Начнем настройку:
Перейдем в режим глобальной конфигурации:
# configure terminal
Обратите внимание на то, что изменилось приглашение командной строки. Это как-бы подсказка, в каком режиме мы находимся…
(config)#
Первым делом дадим название даному роутеру, чтобы не путаться в последующем, в каком из демонов маршрутизации мы находимся, и на каком из роутеров. Обычно название я даю, исходя из демона маршрутизации и названия роутера.
(config)# hostname zebra-router zebra-router(config)#
Кстати, имейте ввиду, что все изменения конфигурации вступают в силу немедленно после ввода команды!
Дальше рекомендую включить сервис шифрования паролей. Не очень хорошо то, что они хранятся в открытом виде.
zebra-router(config)# service password-encryption
Настроим логирование:
zebra-router(config)# log stdout
zebra-router(config)# log file /var/log/quagga/zebra.log
Вроде пока все гуд… Сохраним текущую конфигурацию (ведь на данный момент все изменения хранятся в оперативной памяти).
zebra-router(config)# exit
zebra-router# write memory
Configuration saved to /usr/local/etc/quagga/zebra.conf
Посмотрим что у нас получилось:
zebra-router# show startup-config ! ! Zebra configuration saved from vty ! 2009/09/22 15:24:43 ! hostname zebra-router password 8 bJdy6GGF2QMTg enable password 8 4D7IL52lMQH4Q log file /var/log/quagga/zebra.log log stdout service password-encryption ! interface em0 ipv6 nd suppress-ra ! interface lo0 ! interface re0 ipv6 nd suppress-ra ! interface re1 ipv6 nd suppress-ra ! ip forwarding ! ! line vty ! zebra-router#
Для добавления статического маршрута необходимо в режиме глобальной конфигурации набить команду:
zebra-router(config)# ip route x.x.x.x/x y.y.y.y
Где x.x.x.x/x – адрес сети, для которой необходимо изменить маршрут, y.y.y.y – адрес следующего хопа (ip следующего маршрутизатора). Вместо ip-адресса следующего хопа можно указывать интерфейс, в который перенаправлять пакеты.
Просмотреть текущий маршрут к хосту можно командой show ip route (чтобы просмотреть все текущие маршруты, команду набиваем без ключей):
zebra-router# show ip route y.y.y.y Routing entry for x.x.x.x/x Known via "static", distance 1, metric 0, best * z.z.z.z, via tun0
Собственно продолжим “терзать” quagga. Есть необходимость организовать обмен маршрутами между роутерами по протоколу ospf. Будем отталкиваться от того, что сам пакет уже установлен, zebra работает…
Создадим файл конфигурации демона ospfd, выставим ему необходимые права:
# touch /usr/local/etc/quagga/ospfd.conf
# chmod 600 /usr/local/etc/quagga/ospfd.conf
# chown -R quagga:quagga /usr/local/etc/quagga
Наполняем файл следующим содержимым:
# cat /usr/local/etc/quagga/ospfd.confpassword pass1 enable password pass2
Изменяем данные rc.conf (добавляем поддержку ospfd):
# cat /etc/rc.conf | grep quagga quagga_enable="YES" quagga_daemons="zebra ospfd" watchquagga_enable="YES" watchquagga_flags="-dz -R '/usr/local/sbin/zebra -d; /usr/local/sbin/ospfd -d;' zebra ospfd"
Перезапускаем quagga:
# sh /usr/local/etc/rc.d/quagga restart ospfd not running? (check /var/run/quagga/ospfd.pid). Stopping zebra. Starting zebra. 2010/02/17 22:54:51 ZEBRA: can't get ip6forwarding value Starting ospfd.
Подключаемся к терминалу и приступаем к конфигурированию ospfd (соединение между роутерами реализовано по виртуальному интерфейсу vlan17).
Конфигурация Router1
# telnet localhost ospfd Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.Hello, this is Quagga (version 0.99.15). Copyright 1996-2005 Kunihiro Ishiguro, et al.User Access VerificationPassword: > enable Password: #
# configure terminal
Даем название роутеру, отталкиваясь от демона маршрутизации:
(config)# hostname ospfd-router1
ospfd-router1(config)# service password-encryption
ospfd-router1(config)# log stdout
ospfd-router1(config)# log file /var/log/quagga/ospfd.log
ospfd-router1(config)# router ospf
ospfd-router1(config-router)# ospf router-id 10.16.17.1
ospfd-router1(config-router)# redistribute connected
ospfd-router1(config-router)# redistribute static
ospfd-router1(config-router)# network 10.16.17.0/29 area 0.0.0.0
ospfd-router1(config-router)# exit
Приступаем к настройке интерфейса
ospfd-router1(config)# interface vlan17
Описание. Нужная штука, особенно если OSPF поднят на нескольких интерфейсах
ospfd-router1(config-if)# description Internal_interface
ospfd-router1(config-if)# ip ospf cost 100
Промежуток времени в секундах, между передачей интерфейсом двух последовательных пакетов Hello
ospfd-router1(config-if)# ip ospf hello-interval 8
Время в секундах, по истечению которого соседний маршрутизатор считается неработающим. Время исчисляется от момента приема последнего пакета Hello от соседнего маршрутизатора. Значение этого параметра анонсируется в пакетах Hello.
ospfd-router1(config-if)# ip ospf dead-interval 24
Интервал времени в секундах по истечении которого маршрутизатор повторно отправит пакет на который не получил подтверждения о получении
ospfd-router1(config-if)# ip ospf retransmit-interval 4
ospfd-router1(config-if)# exit
ospfd-router1(config)# exit
ospfd-router1# write memory Configuration saved to /usr/local/etc/quagga/ospfd.conf
По аналогии конфигурируем Router2 (подразумевается, что quagga уже установлена, подготовительные манипуляции завершены, осталось только сконфигурить):
# telnet localhost ospfd Trying ::1... Trying 127.0.0.1... Connected to localhost. Escape character is '^]'.Hello, this is Quagga (version 0.99.15). Copyright 1996-2005 Kunihiro Ishiguro, et al.User Access VerificationPassword: > enable Password: # configure terminal (config)# hostname ospfd-router2ospfd-router2(config)# service password-encryptionospfd-router2(config)# log stdout
ospfd-router2(config)# log file /var/log/quagga/ospfd.log
ospfd-router2(config)# router ospf
ospfd-router2(config-router)# ospf router-id 10.16.17.2
ospfd-router2(config-router)# redistribute connected
ospfd-router2(config-router)# redistribute static
ospfd-router2(config-router)# network 10.16.17.0/29 area 0.0.0.0
ospfd-router2(config-router)# exit
ospfd-router2(config)# interface vlan17 ospfd-router2(config-if)# description Internal_interface
ospfd-router2(config-if)# ip ospf cost 100 ospfd-router2(config-if)# ip ospf hello-interval 8 ospfd-router2(config-if)# ip ospf dead-interval 24 ospfd-router2(config-if)# ip ospf retransmit-interval 4
ospfd-router2(config-if)# exit
ospfd-router2(config)# exit
ospfd-router2# write memory Configuration saved to /usr/local/etc/quagga/ospfd.conf
Проверим теперь состояние ospf-сесии:
ospfd-router2# show ip ospf neighbor Neighbor ID Pri State Dead Time Address Interface RXmtL RqstL DBsmL 10.16.17.1 1 Full/Backup 18.859s 10.16.17.1 vlan17:10.16.17.2 0 0 0
Проверим, какие маршруты получены по OSPF:
ospfd-router2# show ip ospf databaseOSPF Router with ID (10.16.17.2)Router Link States (Area 0.0.0.0)Link ID ADV Router Age Seq# CkSum Link count 10.16.17.1 10.16.17.1 497 0x80000005 0xf641 1 10.16.17.2 10.16.17.2 501 0x80000004 0xf63f 1Net Link States (Area 0.0.0.0)Link ID ADV Router Age Seq# CkSum 10.16.17.2 10.16.17.2 501 0x80000001 0xa303AS External Link StatesLink ID ADV Router Age Seq# CkSum Route 10.16.16.0 10.16.17.1 502 0x80000002 0x5d0a E2 10.16.16.0/24 [0x0] 10.16.32.0 10.16.17.1 502 0x80000002 0xacaa E2 10.16.32.0/24 [0x0] 10.16.33.0 10.16.17.1 502 0x80000002 0xa1b4 E2 10.16.33.0/24 [0x0] 192.168.1.0 10.16.17.2 501 0x80000003 0x8c98 E2 192.168.1.0/24 [0x0]
Базовая настройка завершена. Более подробно с протоколом OSPF можете ознакомиться здесь.