Балансировка нагрузки сети

Настраивать балансировку сетевой нагрузки на шлюзе будем с помощью утилиты iproute2. В большинстве linux дистрибутивов она входит в стандартный комплект поставки, как и в debian 7

Балансировка нагрузки

Для начала подправим файл /etc/network/interfaces. Я воспользуюсь для этого редактором mcedit

mcedit /etc/network/interfaces

auto eth0
iface eth0 inet static
address 10.10.10.2
netmask 255.255.255.252

auto eth1
iface eth1 inet static
address 10.10.11.2
netmask 255.255.255.252

auto eth2
iface eth2 inet static
address 192.168.10.1
netmask 255.255.255.192

После сохранения изменений необходимо перезагрузить наш будущий шлюз, чтобы проверить, поднялись ли интерфейсы.

Теперь необходимо добавить таблицы для каждого маршрута в rt_tables

echo "1 prov1" >> /etc/iproute2/rt_tables
echo "2 prov2" >> /etc/iproute2/rt_tables

Теперь нам необходимо прописать статический роутинг к сетям провайдеров. Чтобы пакеты к их шлюзу ходили только через один интерфейс. Делается это для того, чтобы в случае падения одного из интерфейсов, роутинг не затирался. В дальнейшем мы добавим его в скрипт.

ip route add 10.10.10.0/30 dev eth0 src 10.10.10.2 table prov1
ip route add 10.10.11.0/30 dev eth1 src 10.10.11.2 table prov2

Теперь необходимо прописать правила маршрутизации пакетов через наши таблицы

ip ru add from 10.10.10.2 table prov1
ip ru add from 10.10.11.2 table prov2

Далее пропишем дефолтный роутинг через интерфейсы

ip route add default via 10.10.10.1 table prov1
ip route add default via 10.10.11.1 table prov2

И, наконец, настроим балансировку 50 на 50

ip route add default scope global nexthop via 10.10.10.1 dev eth0 weight 1 nexthop via 10.10.11.1 dev eth1 weight 1

Параметр weight задает соотношения между каналами. К примеру, можно задать 2:3 и т.д.

Проверяем пинги через разные интерфейсы  до google

ping -I eth0 8.8.8.8
ping -I eth1 8.8.8.8

Теперь попробуем положить один из каналов

ifconfig eth1 down

провери пинги до google еще раз

ping 8.8.8.8

Команда ip route показывает нам, что есть только один дефолный роутер через интерфейс eth0. На интерфейсе eth1 висит статус «DEAD».

default
nexthop via 10.10.10.1 dev eth0 weight 1
nexthop via 10.10.11.1 dev eth1 weight 1 dead
10.10.10.0/29 dev eth0 proto kernel scope link src 10.10.10.2
192.168.10.0/26 dev eth2 proto kernel scope link src 192.168.10.1

Теперь поднимаем интерфейс, чтобы убедиться, что балансировка нагрузки вновь работает

ifconfig eth1 up
root@gateway:~# ping -I eth0 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.10.10.2 eth0: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=44 time=22.8 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=44 time=22.6 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=44 time=22.6 ms

ping -I eth1 8.8.8.8
PING 8.8.8.8 (8.8.8.8) from 10.10.11.2 eth1: 56(84) bytes of data.
64 bytes from 8.8.8.8: icmp_req=1 ttl=44 time=22.6 ms
64 bytes from 8.8.8.8: icmp_req=2 ttl=44 time=22.5 ms
64 bytes from 8.8.8.8: icmp_req=3 ttl=44 time=22.6 ms

Ну, вы сами все видите =)

root@gateway:~#ip route
default
nexthop via 10.10.10.1 dev eth0 weight 1
nexthop via 10.10.11.1 dev eth1 weight 1
10.10.10.0/29 dev eth0 proto kernel scope link src 10.10.10.2
10.10.11.0/29 dev eth1 proto kernel scope link src 10.10.11.2
192.168.10.0/26 dev eth2 proto kernel scope link src 192.168.10.1

Настройка балансировки сетевой нагрузки обычно не вызывает затруднения, а вот о том, как завязать это с nat и iptables, я расскажу в следующих статьях.