Linux Routing - Load Balancing
Итак, недавно я усвоил еще один урок: давным-давно ядро Linux умело нормально балансировать маршруты (веса nexthop), используя кэш маршрутизации, чтобы запоминать, какое соединение связано с каким маршрутом. Затем эту реализацию кэша выпилили и заменили отправкой отдельных пакетов случайным образом по каждому указанному маршруту (примерно так же я поначалу подходил к балансировке OpenVPN между несколькими потоками). Это, однако, ломало состояние соединений и порядок пакетов, так как два линка маршрута могли вести в совершенно разные места.
После этого разработчики ядра Linux решили внедрить базовый алгоритм хэширования, который бы всегда связывал поток соединения с одним и тем же хопом маршрутизации. Это очень ограниченная форма балансировки нагрузки, поскольку один и тот же адрес источника и назначения всегда будет преобразовываться в один и тот же хэш, который каждый раз будет соответствовать одному и тому же пути маршрутизации (это будет ограничивать еще сильнее, если вы используете исходный NAT).
Оказывается, есть еще один трюк, позволяющий получить более динамически распределенную балансировку маршрутизации в Linux. Он заключается в использовании таблицы mangle в iptables и маркировке нового состояния соединения (connmark), чтобы таблица conntrack могла сохранять и восстанавливать заданные метки пакетов. Затем вы можете установить правило ip rule, чтобы перехватывать эти метки межсетевого экрана и привязывать их к другой таблице маршрутизации. В дополнение к этому, вы можете использовать случайный алгоритм или алгоритм остатка от деления (modding), чтобы равномерно устанавливать разные метки, что дает вам еще большее разнообразие маршрутизации!
$ipt -t mangle -A PREROUTING -i lan -m mark --mark 0x0 -j CONNMARK --restore-mark
$ipt -t mangle -A PREROUTING -i lan -m statistic --mode nth --every 2 --packet 0 -m mark --mark 0x0 -j MARK --set-mark 8
$ipt -t mangle -A PREROUTING -i lan -m statistic --mode nth --every 1 --packet 0 -m mark --mark 0x0 -j MARK --set-mark 9
$ipt -t mangle -A PREROUTING -i lan -m mark ! --mark 0x0 -j CONNMARK --save-mark
echo "8 vpna" >> /etc/iproute2/rt_tables
echo "9 vpnb" >> /etc/iproute2/rt_tables
ip rule add fwmark 8 table vpna
ip rule add fwmark 9 table vpnb
Теперь вы можете добавить свои правила маршрутизации для VPN-туннелей в обе новые таблицы маршрутизации ip, например, vpna и vpnb!
#ит_заметки #linux #networking #routing #loadbalancing #iptables
Просмотры: 48