Приведу пример балансировки только входящего трафика при двух каналах используя 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