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

Ответить
ya
^-^
Сообщения: 2674
Зарегистрирован: 16 дек 2021, 19:56

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

Сообщение ya »

/etc/network/interfaces

Код: Выделить всё

# Пример конфигурации
auto eth0
iface eth0 inet static
    address 192.168.1.10
    netmask 255.255.255.0
    gateway 192.168.1.1

auto eth1
iface eth1 inet static
    address 192.168.2.10
    netmask 255.255.255.0
    gateway 192.168.2.1
добавить пользовательские таблицы в файл

Код: Выделить всё

echo "1    table1" >> /etc/iproute2/rt_tables
echo "2    table2" >> /etc/iproute2/rt_tables
ip route для добавления статических маршрутов

Код: Выделить всё

ip route add default via 192.168.1.1 dev eth0 table 1
ip route add default via 192.168.2.1 dev eth1 table 2
правила маршрутизации для маршрутизации трафика через разные таблицы в зависимости от исходного адреса

Код: Выделить всё

ip rule add from 192.168.1.10/32 table 1
ip rule add from 192.168.2.10/32 table 2
iptables для распределения трафика через различные интерфейсы

Код: Выделить всё

iptables -t mangle -N LOADBALANCE
iptables -t mangle -A OUTPUT -p tcp -m statistic --mode random --probability 0.5 -j LOADBALANCE
iptables -t mangle -A LOADBALANCE -p tcp -j ROUTE --gw 192.168.1.1
iptables -t mangle -A LOADBALANCE -p tcp -j ROUTE --gw 192.168.2.1
ping, traceroute или curl, для проверки доступности и правильного распределения нагрузки

Чтобы ваши настройки сохранились после перезагрузки, добавьте соответствующие команды в скрипты инициализации, такие как /etc/rc.local, или используйте систему управления сетевыми интерфейсами, которая поддерживает постоянные конфигурации.
ya
^-^
Сообщения: 2674
Зарегистрирован: 16 дек 2021, 19:56

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

Сообщение ya »

Вместо выбора одного из провайдеров в качестве маршрута по-умолчанию, вы настраиваете т.н. многолучевой (multipath) маршрут. В стандартном ядре это обеспечит балансировку нагрузки между двумя провайдерами.

Код: Выделить всё

ip route add default scope global nexthop via $P1 dev $IF1 weight 1 \
nexthop via $P2 dev $IF2 weight 1
p1 - шлюз
if1 - интерфейс
ya
^-^
Сообщения: 2674
Зарегистрирован: 16 дек 2021, 19:56

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

Сообщение ya »

Код: Выделить всё

#!/bin/bash

# Определяем интерфейсы
eth1="eth1"
eth2="eth2"
eth0="eth0"

# Определяем адреса шлюзов
gw1="192.168.43.2"
gw2="192.168.45.2"

# Определяем сети
local_net="192.168.100.0/24"
destination_net="192.168.0.0/16"  #  Ваша локальная сеть

# Очистка правил (критично!)
iptables -t nat -F
iptables -t mangle -F

# Правила для mangle (распределение трафика)
# Важно: используем MARK для определения направления
iptables -t mangle -A PREROUTING -s $local_net -d $destination_net -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s $local_net -d $destination_net -j MARK --set-mark 2

# Правила для POSTROUTING (на основе MARK)
iptables -t nat -A POSTROUTING -o $eth1 -m mark --mark 1 -j SNAT --to-source $gw1
iptables -t nat -A POSTROUTING -o $eth2 -m mark --mark 2 -j SNAT --to-source $gw2

# Правила для предотвращения зацикливания (важно!)
iptables -t nat -A POSTROUTING -s $local_net -d $local_net -j RETURN
destination_net: Явно определена переменная для вашей локальной сети. Критически важно: Это предотвращает зацикливание, если трафик направляется в сеть той же подсети.
-s $local_net -d $destination_net: Условие в правилах mangle теперь проверяет, что исходная сеть $local_net и целевая сеть $destination_net отличаются.
iptables -t nat -A POSTROUTING -s $local_net -d $local_net -j RETURN: Это самое важное правило. Оно возвращает пакет из цепочки POSTROUTING, если он направлен в ту же локальную сеть. Это предотвращает зацикливание.
MARK значения: Используем MARK 1 и MARK 2 для различения направлений, и правильнее задавать разные значения.
ya
^-^
Сообщения: 2674
Зарегистрирован: 16 дек 2021, 19:56

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

Сообщение ya »

Пример (фрагмент, необходимо дополнить настройкой для eth1 и eth2):

Код: Выделить всё

#!/bin/bash

# ... (определение переменных, как в вашем коде) ...

# Правила для mangle (распределение трафика)
iptables -t mangle -A PREROUTING -s $local_net -d $destination_net -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -s $local_net -d ! $destination_net -j ACCEPT  # Важно!

# Правила для FORWARD (перенаправление по метке)
iptables -t mangle -A FORWARD -m mark --mark 1 -j ACCEPT
iptables -t mangle -A FORWARD -m mark ! --mark 1 -j DROP

# ... (остальные правила для `eth1` и `eth2`, которые вы пропустили) ...
-d ! $destination_net: Теперь правила не перенаправляют трафик в свою же локальную сеть.
-j ACCEPT для остальных пакетов: Важное дополнение. Если пакет не должен быть перенаправлен, он должен быть просто принят (или отклонен, в зависимости от того, что вы хотите).
iptables -t mangle -A FORWARD: Обратите внимание, что правила для перенаправления теперь находятся в цепочке FORWARD.
Ответить