LINUX.ORG.RU
ФорумAdmin

Per Connection Classifier на Linux

 


0

1

Привет всем! RouterOS (MikroTik) обладает такой функцией как PCC (Per Connection Classifier) и может балансировать исходящие соединения по нескольким каналам на основе src адреса. Возможно ли организовать такое же на Linux ?


RouterOS
организовать такое же на Linux

сам то понял что спросил? оно на нем и организованно.

axelroot
()
Ответ на: комментарий от nstorm

Спасибо но не то, вернее то и используется но нужно следующее. Балансировать исходящий трафик по src адресу и что бы трафик от этого адреса всегда шел через один аплинк. Метод «nexthop» «nth» «random» не привязывается к src, а только раскидывают соединения по разных шлюзам что играет очень важную роль.

fet4
() автор топика
Ответ на: комментарий от fet4

умник хренов.

у ты какой.

понимать смысл вопроса

это просто смешно, телепатов видите ли ему подавай, ты тут будешь жевать кашу а тебя должны все понимать? ты в натуре не вдупляешь все что возможно в RouterOS можно сделать и средствами любого другого дистрибутива Linux

Балансировать исходящий трафик по src адресу и что бы трафик от этого адреса всегда шел через один аплинк

это конечно возможно.

axelroot
()
Ответ на: комментарий от fet4

ip rule add from x.x.x.x lookup TABLE_X?

Или как там классифицируется вообще? Я просто с микротиками мало что делал.

Если там не фиксированный набор IP, а просто он первый коннект от данного IP определяет в один поток рандомно (как nexthop) а потом поддерживает его всегда в этом потоке?

nstorm
()
Ответ на: комментарий от nstorm

В общем если 2ой вариант, при беглом осмотре я думаю это схематично так делается:

1. Модуль ipset проверяет на принадлежность src IP в каком-нибудь из наших наборов ipset (вначале они пустые). Если он есть в наборе, он присваивает потоку метку (цель CONNMARK). Если нет (значит IP нам неизвестен еще) - проходим дальше.

2. Модуль statistic для немаркированных пакетов выбирает с помощью random или nth и добавляет src ip пакета в нужный нам набор ipset с помощью цели SET. Т.е. тут «знакомимся с новым IP src» и заносим его в произвольно выбранный набор. Ну и метку сразу CONNMARK тоже даем этому 1ому пакету.

3. Машрутизируем трафик через ip rule fwmark в нужный поток на основании метки.

Т.о. у нас для новых (неизвестных) локальных IP будет произвольно (с нужным нам весом, если нужно) будет выбираться изначально заранее созданная группа IP адресов, куда он будет занесен. После занесения в набор ему будет присваивается метка, чтобы дальше применились правила маршрутизации. Думаю как-то так оно и реализовано в скриптах Mikrotik.

nstorm
()
Последнее исправление: nstorm (всего исправлений: 1)
Ответ на: комментарий от nstorm

Вроде бы то что нужно. А можно привести примеры команд, по 1,2 пункту, а то не могу понять как это реализуется.

fet4
() автор топика
Ответ на: комментарий от nstorm

Вы об этом говорили?

SET
   This module adds and/or deletes entries from IP sets which can be defined by ipset(8).

   --add-set setname flag[,flag...]
          add the address(es)/port(s) of the packet to the set

   --del-set setname flag[,flag...]
          delete the address(es)/port(s) of the packet from the set

          where flag(s) are src and/or dst specifications and there can be no more
          than six of them.

   --timeout value
          when adding an entry, the timeout value to use instead of the default one
          from the set definition

   --exist
          when  adding  an  entry  if it already exists, reset the timeout value to
          the specified one or to the default from the set definition

   Use of -j SET requires that ipset kernel support is provided, which, for standard
   kernels, is the case since Linux 2.6.39.

fet4
() автор топика
Ответ на: комментарий от cherry-pick

Если бы было все так просто)

fet4
() автор топика
Ответ на: комментарий от fet4

Можно. Вы же сами ман процитировали, в котором сказано цель SET добавляет или удаляет префиксы в наборах ipset.

А еще есть модуль set, который проверяет на соответствии в ipset:

   set
       This modules macthes IP sets which can be defined by ipset(8).

       --set setname flag[,flag...]
              where flags are src and/or dst and there can be no more than six of them. Hence the command
               iptables -A FORWARD -m set --set test src,dst
              will  match  packets,  for  which  (depending on the type of the set) the source address or port number of the packet can be found in the
              specified set. If there is a binding belonging to the mached set element or there is a default binding for the given set, then  the  rule
              will match the packet only if additionally (depending on the type of the set) the destination address or port number of the packet can be
              found in the set according to the binding.
nstorm
()
Ответ на: комментарий от fet4

Наверное как-то так. Не проверяю, набрасываю прямо тут без проверки. Т.е. пример может быть и не рабочим, дальше сами :)

iptables -t mangle -A PREROUTING -m set --set ra src -j CONNMARK --set-mark 0x1
iptables -t mangle -A PREROUTING m set --set rb src -j CONNMARK --set-mark 0x2
iptables -t mangle -A PREROUTING -j CONNMARK --restore-mark

iptables -N RA
iptables -N RB

iptables -A FORWARD -m connmark --mark 0x1 -j RETURN
iptables -A FORWARD -m connmark --mark 0x2 -j RETURN
iptables -A FORWARD -m statistic --mode random --probability 0.5 -j RA
iptables -A FORWARD -j RB

iptables -A RA -j SET --add-set ra src
iptables -A RA -j CONNMARK --set-mark 0x1


iptables -A RB -j SET --add-set rb src
iptables -A RB -j CONNMARK --set-mark 0x2

ip rule add fwmark 0x1 lookup ra
ip rule add fwmark 0x2 lookup rb

Ес-но в ядре должна быть поддержка ipset.

nstorm
()
Последнее исправление: nstorm (всего исправлений: 1)
Ответ на: комментарий от nstorm

Получилось)

Спасибо nstorm за наводку, решение нашлось!

Выкладываю рабочее решение, проверено на Debian 8.1, iptables 1.4.21, ipset 6.23 Балансировка по src на n каналов, в моем случае на 7 шт.

# Создаем цепочку для распределения src по сетам
$IPT -w -t mangle -N balancing
# Создаем цепочки для добавления в нужный сет
$IPT -w -t mangle -N add_set_isp1
$IPT -w -t mangle -N add_set_isp2
$IPT -w -t mangle -N add_set_isp3
$IPT -w -t mangle -N add_set_isp4
$IPT -w -t mangle -N add_set_isp5
$IPT -w -t mangle -N add_set_isp6
$IPT -w -t mangle -N add_set_isp7
# Создаем цепочки для маркировки сетов
$IPT -w -t mangle -N ipt_isp1
$IPT -w -t mangle -N ipt_isp2
$IPT -w -t mangle -N ipt_isp3
$IPT -w -t mangle -N ipt_isp4
$IPT -w -t mangle -N ipt_isp5
$IPT -w -t mangle -N ipt_isp6
$IPT -w -t mangle -N ipt_isp7

# Запускаем в цепочку балансировки тех кого нужно
$IPT -w -t mangle -A PREROUTING -j balancing
# После балансировки запускаем на маркировку
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp1_tbl src -j ipt_isp1
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp2_tbl src -j ipt_isp2
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp3_tbl src -j ipt_isp3
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp4_tbl src -j ipt_isp4
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp5_tbl src -j ipt_isp5
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp6_tbl src -j ipt_isp6
$IPT -w -t mangle -A PREROUTING -m set --match-set $isp7_tbl src -j ipt_isp7
# Копируем маркировку соединений в маркировку пакетов
$IPT -w -t mangle -A PREROUTING -j CONNMARK --restore-mark

# Выгоняем тех кто уже в сетах
$IPT -w -t mangle -A balancing -m set --match-set $isp1_tbl src -j RETURN
$IPT -w -t mangle -A balancing -m set --match-set $isp2_tbl src -j RETURN
$IPT -w -t mangle -A balancing -m set --match-set $isp3_tbl src -j RETURN
$IPT -w -t mangle -A balancing -m set --match-set $isp4_tbl src -j RETURN
$IPT -w -t mangle -A balancing -m set --match-set $isp5_tbl src -j RETURN
$IPT -w -t mangle -A balancing -m set --match-set $isp6_tbl src -j RETURN
$IPT -w -t mangle -A balancing -m set --match-set $isp7_tbl src -j RETURN
# В процентном соотношении пускаем пакеты по цепочкам добавления в сеты
$IPT -w -t mangle -A balancing -m statistic --mode random --probability 0.143 -j add_set_isp1
$IPT -w -t mangle -A balancing -m statistic --mode random --probability 0.167 -j add_set_isp2
$IPT -w -t mangle -A balancing -m statistic --mode random --probability 0.2 -j add_set_isp3
$IPT -w -t mangle -A balancing -m statistic --mode random --probability 0.25 -j add_set_isp4
$IPT -w -t mangle -A balancing -m statistic --mode random --probability 0.333 -j add_set_isp5
$IPT -w -t mangle -A balancing -m statistic --mode random --probability 0.5 -j add_set_isp6
$IPT -w -t mangle -A balancing -j add_set_isp7

#Добавляем в первый сет
$IPT -w -t mangle -A add_set_isp1 -j SET --add-set $isp1_tbl src

#Выгоняем из цепочки если уже добавили в первый сет
$IPT -w -t mangle -A add_set_isp2 -m set --match-set $isp1_tbl src -j RETURN
#Добавляем во второй сет
$IPT -w -t mangle -A add_set_isp2 -j SET --add-set $isp2_tbl src

#Выгоняем из цепочки если уже добавили в первый и второй сет
$IPT -w -t mangle -A add_set_isp3 -m set --match-set $isp1_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp3 -m set --match-set $isp2_tbl src -j RETURN
#Добавляем в третий сет
$IPT -w -t mangle -A add_set_isp3 -j SET --add-set $isp3_tbl src

И т.к. далее по аналогии
$IPT -w -t mangle -A add_set_isp4 -m set --match-set $isp1_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp4 -m set --match-set $isp2_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp4 -m set --match-set $isp3_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp4 -j SET --add-set $isp4_tbl src

$IPT -w -t mangle -A add_set_isp5 -m set --match-set $isp1_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp5 -m set --match-set $isp2_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp5 -m set --match-set $isp3_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp5 -m set --match-set $isp4_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp5 -j SET --add-set $isp5_tbl src

$IPT -w -t mangle -A add_set_isp6 -m set --match-set $isp1_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp6 -m set --match-set $isp2_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp6 -m set --match-set $isp3_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp6 -m set --match-set $isp4_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp6 -m set --match-set $isp5_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp6 -j SET --add-set $isp6_tbl src

$IPT -w -t mangle -A add_set_isp7 -m set --match-set $isp1_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp7 -m set --match-set $isp2_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp7 -m set --match-set $isp3_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp7 -m set --match-set $isp4_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp7 -m set --match-set $isp5_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp7 -m set --match-set $isp6_tbl src -j RETURN
$IPT -w -t mangle -A add_set_isp7 -j SET --add-set $isp7_tbl src

# Проставляем маркировку сетам
$IPT -w -t mangle -A ipt_isp1 -j CONNMARK --set-mark 1
$IPT -w -t mangle -A ipt_isp2 -j CONNMARK --set-mark 2
$IPT -w -t mangle -A ipt_isp3 -j CONNMARK --set-mark 3
$IPT -w -t mangle -A ipt_isp4 -j CONNMARK --set-mark 4
$IPT -w -t mangle -A ipt_isp5 -j CONNMARK --set-mark 5
$IPT -w -t mangle -A ipt_isp6 -j CONNMARK --set-mark 6
$IPT -w -t mangle -A ipt_isp7 -j CONNMARK --set-mark 7

# Маршрутизируем на основе меток
ip rule add fwmark 1 table isp1
ip rule add fwmark 2 table isp2
ip rule add fwmark 3 table isp3
ip rule add fwmark 4 table isp4
ip rule add fwmark 5 table isp5
ip rule add fwmark 6 table isp6
ip rule add fwmark 7 table isp7

Итого имеем

root@srv-bill:~# ipset list isp1 | wc -l
103
root@srv-bill:~# ipset list isp2 | wc -l
118
root@srv-bill:~# ipset list isp3 | wc -l
91
root@srv-bill:~# ipset list isp4 | wc -l
101
root@srv-bill:~# ipset list isp5 | wc -l
110
root@srv-bill:~# ipset list isp6 | wc -l
107
root@srv-bill:~# ipset list isp7 | wc -l
100

fet4
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.