Объединение интернет каналов до определенных сетей в Debian Wheezy?

Одноранговая сеть /24, в сети есть сервер и три интернет-шлюза (роутеры).

Нужно зарулить трафик до определенных подсетей (подсети, в пределах городского пиринга) с объединением через эти шлюзы, остальной трафик пустить через _шлюз1_.

До этого использовалась статичная маршрутизация: ~30% сетей через _шлюз1_, еще 30% через _шлюз2_ и т.д.

Сейчас используется балансировка с помощью ip route:
#!/bin/bash
ip route add 31.135.208.0/21 scope global nexthop via 192.168.1.1 dev eth0 weight 1 \
 nexthop via 192.168.1.2 dev eth0 weight 1 \
 nexthop via 192.168.1.4 dev eth0 weight 1

ip route add 37.110.208.0/21 scope global nexthop via 192.168.1.1 dev eth0 weight 1 \
 nexthop via 192.168.1.2 dev eth0 weight 1 \
 nexthop via 192.168.1.4 dev eth0 weight 1
...
ip route add 217.30.160.0/20 scope global nexthop via 192.168.1.1 dev eth0 weight 1 \
 nexthop via 192.168.1.2 dev eth0 weight 1 \
 nexthop via 192.168.1.4 dev eth0 weight 1

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

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

Буду очень благодарен за любую информацию.
  • Вопрос задан
  • 3368 просмотров
Пригласить эксперта
Ответы на вопрос 2
@alz
Так все то же самое. Три таблицы iproute с гейтами по умолчанию 192.168.1.1, 192.168.1.2 и 192.168.1.4 соответственно + гейт по умолчанию 192.168.1.1 в главной таблице. Ну и в правилах надо делать match по подсети назначения. Можно просто продублировать правила для маркировки для каждой из подсетей
Ответ написан
EvilMan
@EvilMan
Тут единственный вариант - делать round-robin маркировку пакетов до этих подсетей. Просто продублировать правила не прокатит - будет срабатывать только первое, а до остальных дело не дойдёт. Чистыми средствами iproute это так же не разрулить - multipath routing работает с потоками, а не с отдельными пакетами.
Схема более-менее стандартная: три таблицы, в каждой по дефолтному маршруту. А так же три правила маршрутизации по метке. В iptables прописываете что-то вроде этого:
iptables -t mangle -A PREROUTING --dst <subnet/prefix> -m statistic --mode nth --every 3 -j MARK --set-mark 0x1
iptables -t mangle -A PREROUTING --dst <subnet/prefix> -m mark ! --mark 0x1 -m statistic --mode nth --every 2 -j MARK --set-mark 0x2
iptables -t mangle -A PREROUTING --dst <subnet/prefix> -m mark ! --mark 0x1 -m mark ! --mark 0x2 -j MARK --set-mark 0x3

Этим вы обеспечиваете равномерную маркировку на три метки на уровне пакетов до подсети.
Но если у вас на этом маршрутизаторе ещё и выполняется NAT в разные адреса, то не получится, так как трассировщик соединений (conntrack) так же работает с потоками, а не отдельными пакетами. В этом случае задача становится нетривиальной. В случае, если NAT выполняется в один адрес, то должно прокатить.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы