LINUX.ORG.RU

Балансировка на несколько каналов iptables --probability, как рассчитать значение?

 , , , ,


0

1

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

ip rule add fwmark 1/1 table 1
ip rule add fwmark 2/2 table 2
ip rule add fwmark 3/3 table 3

В каждой таблице есть интерфейс и маршрут по умолчанию через него. Маркировку пакетов предполагается делать следующим образом:

iptables -A PREROUTING -t nat -i eth0 -m statistic --mode random --probability 0.25 -j MARK --set-mark 1
iptables -A PREROUTING -t nat -i eth0 -m statistic --mode random --probability 0.25 -j MARK --set-mark 2
iptables -A PREROUTING -t nat -i eth0 -m statistic --mode random --probability 0.25 -j MARK --set-mark 3

И вот тут важно рассчитать коэффициент который во всех трех правилах сейчас 0.25, это не правильно, дожно быть так:

Взято отсюда https://www.linux.org.ru/forum/admin/1937519?ysclid=laowarcsp8771799131

Если я понял правильно, то --probability 0.25 это вероятность? Тогда конечно здесь ошибка, тк вероятность попадания пакета только в 1-ю точку будет 0.25

во вторую точку будет уже 0.25*(1-0.25) = 0.1875

а в третью 0.25*(1-0.25 -0.1875)) = 0.140625

соответственно все остальное попадет в четвертую точку 1 - 0.25 - 0.185 - 0.140625 = 0,424375

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



Последнее исправление: JoIIyRoger (всего исправлений: 2)

Ответ на: комментарий от vodz

Спасибо, работает.

#!/bin/bash

numberOfRules=$1
firstCoefficient=`echo 1 / $numberOfRules | bc -l | cut -b 1,2,3,4,5,6,7,8,9,10,11,12 | awk '{print "0"$1}'`

for (( a=1; a < $numberOfRules; a++ ))
do
  	echo "$firstCoefficient / (1-($firstCoefficient*($a-1)))" | bc -l | cut -b 1,2,3,4,5,6,7,8,9,10,11,12 | awk '{print "0"$1}'
done


exit 0
JoIIyRoger
() автор топика

трафик уходил равномерно через все имеющиеся интерфейсы.

Да, обычные сайты будут работать. А в целом, это не очень хорошая идея.

Если клиент пришел на какой-то адрес:порт, то дальше он должен туда попадать с того же адреса.

На сколько я помно, у -j SNAT есть --persistent для борьбы с этим, но только в рамках одного канала.

Видеоконференции скорее всего сломаются. Там где куки привязаны к ip тоже сломается.

Задача не совсем простая.

Равномерность загрузки с помощью random() добиться будет трудно.

Я бы сделал в ipset набор, куда бы рандомно пихал адреса клиентов с меткой только в том случае, если в этом наборе ещё нет адреса клиента.

Доп. скриптом раз N минут удалять из набора адреса неактивных клиентов (по счетчикам ipset).

ipset умеет делать "-j MARK" и считать обращения к элементам набора. Только нужно не забыть попросить его делать это (skbinfo и counters).

vel ★★★★★
()