BGP. Балансировка каналов на Quagga

Приведу пример балансировки только входящего трафика при двух каналах используя Quagga.

На тесте буду использовать Ubuntu 16.04.4 LTS и Quagga 0.99.24.1, сетевой интерфейс ens1f0 для второго провайдера с одним neighbors и ens2f0 для первого провайдера с двумя neighbors, в ens2f1 будет подключена локальная сеть. Оба провайдера анонсируют «default».
3.3.3.0/23 это будет моя сеть с белыми IP адресами.

Сетевые адаптеры использовал HP 560SFP+ (TX и RX буферы 4Mb, 10 потоков) и HP 562SFP+ (TX и RX буферы 4Mb, потоков еще больше), трафик 4 Гб/с.
Назначил IP адреса сетевым интерфейсам в /etc/network/interfaces:

auto ens1f0 
iface ens1f0 inet static
address 22.22.22.82
netmask 255.255.255.252

auto ens2f0
iface ens2f0 inet static
address 1.1.1.218
netmask 255.255.255.252 

auto ens2f0:0
iface ens2f0:0 inet static
address 1.1.1.74
netmask 255.255.255.252 

auto ens2f1
iface ens2f1 inet static
address 10.0.0.1 
netmask 255.255.255.0

В /etc/quagga/zebra.conf у меня получилась следующая конфигурация:

hostname test
password test
enable password test
log file /var/log/zebra.log
!
interface eno1
 ipv6 nd suppress-ra
!
interface eno2
 ipv6 nd suppress-ra
!
interface eno3
 ipv6 nd suppress-ra
!
interface eno4
 ipv6 nd suppress-ra
!
interface lo
!
interface ens1f0
 ipv6 nd suppress-ra
!
interface ens1f1
 ipv6 nd suppress-ra
!
interface ens2f0
 ipv6 nd suppress-ra
!
interface ens2f1
 ipv6 nd suppress-ra
!
ip forwarding
!
!
line vty
!

В /etc/quagga/daemons:

zebra=yes
bgpd=yes
ospfd=no
ospf6d=no
ripd=no
ripngd=no
isisd=no
babeld=no

А вот и мой главный файл конфигурации /etc/quagga/bgpd.conf (где 12345 это моя AS, 11111 и 22222 — AS провайдеров, bgp router-id 1.1.1.218 — один любой из IP адресов в сторону провайдеров):

password test
enable password test
log file /var/log/quagga/bgpd.log
service advanced-vty
!
bgp multiple-instance
bgp config-type cisco
!
router bgp 12345
 no synchronization
 bgp router-id 1.1.1.218
 bgp log-neighbor-changes
 network 3.3.3.0 mask 255.255.254.0
 aggregate-address 3.3.3.0 255.255.254.0 summary-only
 redistribute connected
 timers bgp 20 60
 neighbor 2.2.2.81 remote-as 22222
 neighbor 2.2.2.81 description PROVIDER2
 neighbor 2.2.2.81 update-source 2.2.2.82
 neighbor 2.2.2.81 soft-reconfiguration inbound
 neighbor 2.2.2.81 route-map PROVIDER2-OUT out
 neighbor 1.1.1.73 remote-as 11111
 neighbor 1.1.1.73 description PROVIDER1-2
 neighbor 1.1.1.73 update-source 1.1.1.74
 neighbor 1.1.1.73 soft-reconfiguration inbound
 neighbor 1.1.1.73 route-map PROVIDER1-2-OUT out
 neighbor 1.1.1.217 remote-as 11111
 neighbor 1.1.1.217 description PROVIDER1-1
 neighbor 1.1.1.217 update-source 1.1.1.218
 neighbor 1.1.1.217 soft-reconfiguration inbound
 neighbor 1.1.1.217 route-map PROVIDER1-1-OUT out
 no auto-summary
!
access-list 10 permit 127.0.0.1
access-list 10 deny any
access-list all permit any
!
ip prefix-list DEFAULT-ONLY seq 10 deny 0.0.0.0/0 ge 1 le 31
ip prefix-list DEFAULT-ONLY seq 20 permit 0.0.0.0/0
ip prefix-list DEFAULT-STRIP seq 10 deny 0.0.0.0/0
ip prefix-list DEFAULT-STRIP seq 20 permit 0.0.0.0/0 ge 1 le 31
ip prefix-list TO-PROVIDER1-1 seq 10 permit 3.3.3.0/23
ip prefix-list TO-PROVIDER1-1 seq 100 deny 0.0.0.0/0 le 32
ip prefix-list TO-PROVIDER1-2 seq 10 permit 3.3.3.0/23
ip prefix-list TO-PROVIDER1-2 seq 100 deny 0.0.0.0/0 le 32
ip prefix-list TO-PROVIDER2 seq 10 permit 3.3.3.0/23
ip prefix-list TO-PROVIDER2 seq 100 deny 0.0.0.0/0 le 32
!
route-map PROVIDER1-1-IN permit 10
 match ip address prefix-list all
!
route-map PROVIDER1-2-IN permit 10
 match ip address prefix-list all
!
route-map PROVIDER2-IN permit 10
 match ip address prefix-list all
!
route-map PROVIDER1-1-OUT permit 10
 description MY <-> PROVIDER1-1
 match ip address prefix-list TO-PROVIDER1-1
!
route-map PROVIDER1-2-OUT permit 10
 description MY <-> PROVIDER1-2
 match ip address prefix-list TO-PROVIDER1-2
 set local-preference 50
!
route-map PROVIDER2-OUT permit 10
 description MY <-> PROVIDER2
 match ip address prefix-list TO-PROVIDER2
 set as-path prepend 12345 12345
!
line vty
 access-class 10
 no login
!

Так как исходящий трафик мне предпочтительнее слать через PROVIDER1-1-OUT, то я указал «set local-preference 50» для PROVIDER1-2-OUT, а для PROVIDER2-OUT и PROVIDER1-1-OUT не указывал, если не указывать то «local-preference» по умолчанию равен 100 (100 лучше и выше приоритетом чем 50), ну исходящий трафик все равно пойдет только через одного провайдера.
Чтобы сбалансировать входящий трафик, я указал «set as-path prepend 12345 12345» для PROVIDER2, тем самым увеличив к нему путь, так как в моем случае большая часть трафика шла через него. Можно увеличить путь еще больше, например:

set as-path prepend 12345 12345 12345 12345 12345 12345

Чем чаще укажем свою AS, тем длиннее путь и меньше трафика будет идти, в общем с «as-path prepend» нужно поиграться, замечу что после его изменения нужно подождать, так как у меня иногда трафик окончательно выравнивался через пару часов.

Менять «as-path prepend» можно на ходу не перезагружая quagga, для этого подключимся к ней и перейдем в режим конфигурации:

telnet localhost 2605
configure terminal

Изменим «as-path prepend»:

route-map PROVIDER2-OUT permit 10
set as-path prepend 12345 12345 12345

Выйдем из режима конфигурации и применим изменения:

exit
exit
clear ip bgp 2.2.2.81 soft out

По завершении охраним конфигурацию и выйдем из консоли:

write
exit

На этом настройка завершена, однако однажды я столкнулся с проблемой, так как один из администраторов назначил IP для NAT на сетевом интерфейсе ens2f0 который смотрит в сторону первого провайдера и включил rp_filter, в этом случае балансировка трафика не заработала.

Чтобы устранить проблему я посмотрел текущие значения rp_filter (было 1):

cat /proc/sys/net/ipv4/conf/all/rp_filter
cat /proc/sys/net/ipv4/conf/default/rp_filter
cat /proc/sys/net/ipv4/conf/ens1f0/rp_filter
cat /proc/sys/net/ipv4/conf/ens1f1/rp_filter
cat /proc/sys/net/ipv4/conf/ens2f0/rp_filter
cat /proc/sys/net/ipv4/conf/ens2f1/rp_filter

И отключил его:

echo 0 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/default/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens1f0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens1f1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens2f0/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/ens2f1/rp_filter

После этого балансировка начала работать, она также будет работать при rp_filter=2.

Чтобы после перезапуска системы значение rp_filter осталось таким как нам нужно, добавим в /etc/sysctl.conf:

net.ipv4.conf.default.rp_filter=0
net.ipv4.conf.all.rp_filter=0

После настройки посмотрим список соседей и их статус:

sh ip bgp neighbors

Посмотрим какие маршруты принимаются и анонсируются соседям:

sh ip bgp
sh ip bgp neighbors 2.2.2.81 advertised-routes
sh ip bgp neighbors 2.2.2.81 received-routes
sh ip bgp neighbors 1.1.1.73 advertised-routes
sh ip bgp neighbors 1.1.1.73 received-routes 
sh ip bgp neighbors 1.1.1.217 advertised-routes
sh ip bgp neighbors 1.1.1.217 received-routes

Для теста резервирования можно выключить один из интерфейсов:

sudo ifdown ens1f0
sudo ifup ens1f0

Если на сервере также настроен NAT, то сеть для NAT завернем на себя (в этом случае назначать IP на интерфейсах не нужно):

telnet localhost 2601
enable
configure terminal
ip route 3.3.3.128/25 Null0 254

Перезапустить quagga можно так:

sudo /etc/init.d/quagga restart

Смотрите также мою статью:
Настройка BGP в Quagga

Подписаться на IT Blog (RU) по Email
Subscribe to IT Blog (EN) by Email

Did my article help you? How about buying me a cup of coffee as an encouragement? Buy me a coffe.

Добавить комментарий