Балансировка соединений в Linux через несколько линков (balance link nat iptables linux traffic)
Ключевые слова: balance, link, nat, iptables, linux, traffic, (найти похожие документы)
From: Tim Utschig <tim@tetro.net.>
Newsgroups: email
Date: Mon, 9 Dec 2007 14:31:37 +0000 (UTC)
Subject: Балансировка соединений в Linux через несколько линков
Оригинал: http://tetro.net/misc/multilink.html
Для работы необходимо собрать NetFilter с модулями "nth" или "random",
доступными в патчах "patch-o-matic-ng" (http://www.netfilter.org/downloads.html#svn)
Имеем три линка:
* eth0: проводная сеть 192.168.1.0/24, gateway 192.168.1.1, default route.
* eth1: беспроводной линк 1, 172.16.0.0/16, gateway 172.16.0.1
* rausb0: беспроводной линк 2, 192.168.0.0/24, gateway 192.168.0.1
Соединение привязываем к линку через маркировку match/target.
Для балансировки используем модули "random" или "nth".
# Запрещаем блокирование пакетов ушедших в один интерфейс, а пришедших
# из второго.
echo 0 > /proc/sys/net/ipv4/conf/eth1/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/rausb0/rp_filter
# Поднимаем NAT на основных интерфейсах
iptables -t nat -A POSTROUTING -o eth1 -s ! 172.16.0.0/16 -m state --state NEW -j MASQUERADE
iptables -t nat -A POSTROUTING -o rausb0 -s ! 192.168.0.0/24-m state --state NEW -j MASQUERADE
# Создаем цепочку для обработки новых исходящих соединений
iptables -t mangle -N NEW_OUT_CONN
# Пропускаем соединения идущие в проводную сеть
iptables -t mangle -A NEW_OUT_CONN -d 192.168.1.0/24 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -p tcp -m multiport --destination-ports 22,80,443,6667 -j RETURN
iptables -t mangle -A NEW_OUT_CONN -p udp --dport 53 -j RETURN
# Новые исходящие соединения направляем в цепочку
iptables -t mangle -A OUTPUT -o eth0 -m state --state NEW -j NEW_OUT_CONN
# Пропускаем ранее созданные промаркированные соединения.
iptables -t mangle -A OUTPUT -m connmark --mark 2 -j ROUTE --gw 172.16.0.1 --continue
iptables -t mangle -A OUTPUT -m connmark --mark 3 -j ROUTE --gw 192.168.0.1 --continue
Пример балансировки с модулем "random":
# 34% всех соединений отправляем в интерфейс по умолчанию (проводная сеть).
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 0
iptables -t mangle -A NEW_OUT_CONN -m random --average 34 -j RETURN
# 33% отправляем через eth1
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2
iptables -t mangle -A NEW_OUT_CONN -m random --average 33 -j RETURN
# остальное через rausb0
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 3
Пример балансировки с модулем "nth":
# первый из каждых трех соединений отправляем в интерфейс по умолчанию (проводная сеть).
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 0
iptables -t mangle -A NEW_OUT_CONN -m nth --counter 1 --every 3 --packet 0 -j RETURN
# второй из трех через eth1
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 2
iptables -t mangle -A NEW_OUT_CONN -m nth --counter 1 --every 3 --packet 1 -j RETURN
# третий из трех через rausb0
iptables -t mangle -A NEW_OUT_CONN -j CONNMARK --set-mark 3
iptables -t mangle -A NEW_OUT_CONN -m nth --counter 1 --every 3 --packet 2 -j RETURN
Ситуация падения одного из линков. Помещаем в /etc/network/if-down.d/
(Debian) скрипт, вызываемый после отключения интерфейса:
#!/bin/sh
if [ "$IFACE" = "eth1" ]; then
iptables -t mangle -D OUTPUT -m connmark --mark 2 -j ROUTE --gw 172.16.0.1 --continue 2>/dev/null
fi
if [ "$IFACE" = "rausb0" ]; then
iptables -t mangle -D OUTPUT -m connmark --mark 3 -j ROUTE --gw 192.168.0.1 --continue 2>/dev/null
fi
exit 0
Ситуация возобнавления работы упавшего ранее интерфейса.
Помещаем в /etc/network/if-up.d/ (Debian) скрипт, вызываемый после поднятия
интерфейса:
#!/bin/sh
if [ "$IFACE" = "eth1" ]; then
iptables -t mangle -A OUTPUT -m connmark --mark 2 -j ROUTE --gw 172.16.0.1 --continue 2>/dev/null
fi
if [ "$IFACE" = "rausb0" ]; then
iptables -t mangle -A OUTPUT -m connmark --mark 3 -j ROUTE --gw 192.168.0.1 --continue 2>/dev/null
fi
exit 0
Описанная схема позволяет неплохо балансировать трафик от BitTorrent клиентов.
1, reaper (??), 11:08, 31/01/2009 [ответить]
| +/– |
неплохо бы переписать под текущую версию iptables, без задействования patch-o-matic-ng
| |
2, dr0n (ok), 23:15, 15/05/2010 [ответить]
| +/– |
если есть возможность сделать это без дополнительных патчей ткните носом КАК...
iptables v1.3.8
kernel 2.6.26.8
| |
|