PDA

Bekijk de volledige versie : Ограничение количества TCP сессий



Mam(O)n
06-02-2007, 02:54
Помогите решить задачку.

Дано:
В локальной сетке есть сервер со всякими видеоматериалами, и есть на нем строгое ограничение - не более одного соединения на скачку, иначе могут прокатить по автобану.

"Внимание, вопрос!" :)
Возможно ли средствами роутера ограничить количество соединений tcp на конкретный ip адрес и порт?

hank
06-02-2007, 03:47
Дык в любом менеджере закачек можно выставить количество потоков.

Mam(O)n
06-02-2007, 04:01
Вся проблема в том, что к роутеру подключено несколько компьютеров, а организовать скачивание по очереди проблематично. Вот начнем качать одновременно, и нам сразу будет заказана дорога в бан.

cyrax
06-02-2007, 17:35
Вся проблема в том, что к роутеру подключено несколько компьютеров, а организовать скачивание по очереди проблематично. Вот начнем качать одновременно, и нам сразу будет заказана дорога в бан.

а скачивать роутером с общей очередью?

FilimoniC
07-02-2007, 08:33
а скачивать роутером с общей очередью?

Да чето бред говорите.. ВАРИАНТ: организовать проброс порта и сделать лимит подключений на порт роутера

cyrax
07-02-2007, 08:58
Да чето бред говорите.. ВАРИАНТ: организовать проброс порта и сделать лимит подключений на порт роутера

ну так расскажите как организовать?

Mam(O)n
08-02-2007, 01:05
После долгих поисков решений я набрел на ipt_connlimit. На десктопе правило


iptables -I OUTPUT -d host_to_limit.net -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT

сработало на ура. Но на роутере к сожалению ядро скомпилировано без поддержки connlimit. Но зато есть похожая скомпилированная фича iplimit, по которой я так и ненашел внятной документации. Как я понял это прадедушка connlimit, но


iptables -I OUTPUT -d host_to_limit.net -p tcp --dport 80 --iplimit-above 2 -j REJECT

к сожалению результата не дало. Тестировал я это подключавшись с роутера telnet'ами на порт 80 целевого хоста.
Так что я думаю остается писать программу-ловушку, которая будет работать в качестве посредника, ограничивая количество подключений либо просить Олега пропатчить ядро и собрать ipt_connlimit.
Может кто видет другие решения?

cyrax
08-02-2007, 09:58
После долгих поисков решений я набрел на ipt_connlimit. На десктопе правило


iptables -I OUTPUT -d host_to_limit.net -p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT

сработало на ура. Но на роутере к сожалению ядро скомпилировано без поддержки connlimit. Но зато есть похожая скомпилированная фича iplimit, по которой я так и ненашел внятной документации. Как я понял это прадедушка connlimit, но


iptables -I OUTPUT -d host_to_limit.net -p tcp --dport 80 --iplimit-above 2 -j REJECT

к сожалению результата не дало. Тестировал я это подключавшись с роутера telnet'ами на порт 80 целевого хоста.
Так что я думаю остается писать программу-ловушку, которая будет работать в качестве посредника, ограничивая количество подключений либо просить Олега пропатчить ядро и собрать ipt_connlimit.
Может кто видет другие решения?

не прадедушка, всего лишь лет 5 назад :)

кстати, а вы не забыли случаем указать

-m iplimit
т.е. чтобы было вот так


iptables -I OUTPUT -d host_to_limit.net -p tcp --dport 80 -m iplimit --iplimit-above 2 -j REJECT

Mam(O)n
08-02-2007, 10:21
кстати, а вы не забыли случаем указать

-m iplimit

С этим правило вообще не принимается.

cyrax
08-02-2007, 12:09
С этим правило вообще не принимается.

забавно.

Примеры, которые я помню были с -m iplimit ... правда iplimit всегда ставился в цепочку INPUT, а вам надо на OUTPUT - возможно в этом проблема

Mam(O)n
09-02-2007, 13:52
В поисках решения я пошел по пути, подсказанным FilimoniC. Тоесть трафик, который идет до целевого сервера завернул на роутер и ограничил количество соединений на порт. Для этого я нашел на http://sf.net и скомпилировал т.н. "port forwarder" (http://sourceforge.net/projects/portfw/), который я использовал в качестве мини-прокси для ограничения количества входящих соединений.
Конечно это решение через Ж, но ничего лучше я пока придумать несмог. Может кто знает как лучше это сделать?


# Заварачиваем трафик следующий на host-to-limit.net:80 на локальный порт 5555
iptables -I PREROUTING -t nat -p tcp -d host-to-limit.net --dport 80 -j REDIRECT --to-port 5555

# Запускаем проброс трафика с локального порта 5555 на host-to-limit.net:80 с ограничением количества соединений до 2-ух
portfw -l 5555 -s host-to-limit.net -p 80 -C 2

# Использование portfw
# portfw -l <local port> -s <server host> -p <server port> [-C <limit>] [-F]
#
# -l <port> Локальный порт
# -s <host> Удаленный хост
# -p <port> Удаленный порт
# -C <llimit> Лимит одновременных соединений
# -F НЕ запускать в качестве демона


Если кому интересно, то я к посту прикрепил portfw в виде бинарника (portfw_0.1.0-mipsel.tar.bz2) для роутера, исходников (portfw_0.1.0-source.tgz) и патча к исходникам (portfw_0.1.0-resolv.patch.tar.bz2), написанного мной в целях изучения языка С и позволяющий portfw обрабатывать имена хостов вместо IP адреса.

aik
19-07-2007, 20:46
Что то я делаю не так :)

[admin@(none) /tmp]$ ./portfw
-sh: ./portfw: not found

[admin@(none) /tmp]$ ls -la portfw
-rwxr-xr-x 1 admin root 14062 Feb 8 16:44 portfw

Mam(O)n
19-07-2007, 21:10
Этот бинарник скомпилирован под uClibc 0.9.28. Эта ветка я думаю поможет http://wl500g.info/showthread.php?t=8422

alexandr_v_b
13-06-2008, 18:42
Доброго времени суток !
Столкнулся с проблемой: провайдер ограничивает количество TCP сессий до 50, причем делает это оригинальным способом - за превышение отключает интернет на 10 часов. Использую ASUS WL500GP со стандартной прошивкой, к которому со стороны LAN подключаю до 3-х компов, в каждом в реестре стоит ограничение до 16. Но периодически происходят отключения. Поэтому есть вопросы к знатокам:
1. Может ли сам роутер плодить соединения ( встроенным даунлоад мастером не пользуюсь )?
2. Есть ли возможность в роутере настроить ограничение количества TCP сессий?

buka2
13-06-2008, 19:29
по поводу №1: еще одну(?) может иногда добавлять синхронизация времени

GoR
15-08-2008, 18:06
Какое максимальное значение одновременных NAT сессий в ASUS WL-500g,Premium ver.2?

san666
11-04-2009, 17:30
Вопрос актуальный.
Тоже хочу узнать как ограничить количество TCP сессий может кто нибудь подскажет?

theMIROn
11-04-2009, 18:41
вот это может помочь

featZima
09-03-2010, 00:40
Есть модем, который поднимает PPPoE соединение и роутер wl500g v2, который используется для QoS (к сожалению поднять ppp непосредственно на роутере нет возможности). Проблема в том, что максимально возможное количество записей в ip_conntrack для ADSL модема значительно меньше требуемого количества. Новый uTorrent задействует UDP протокол, в результате файл ip_conntrack быстро переполняется и старые сессии начинают разрываться (например, вылетает icq).

Одно время проблема решалась ограничением с помощью iptables количества tcp соединений на один IP, и полным запретом UDP трафика. Но пришло время исправлять старые "ошибки". Подскажите как ограничить суммарное количество записей TCP и UDP записей в таблице ip_conntrack для одного IP на роутере?

Power
10-03-2010, 23:23
Я думаю, классический способ таков:


iptables -I FORWARD 1 -o vlan1 -m state --state NEW,RELATED -m connlimit --connlimit-above 128 -j DROP

Только вот модуля connlimit может не оказаться на роутере. К тому же, время жизни соединений может отличаться на модеме и на роутере. И ещё тут не учитываются возможные входящие соединения.

А если не секрет, что за причина не позволяет поднять pppoe на роутере?

featZima
11-03-2010, 01:21
А если не секрет, что за причина не позволяет поднять pppoe на роутере?
у меня нет физического доступа к помещению где стоит модем + так получилось что модем стоит за роутером TL-R402M, а в нём нет режима бриджа)

Я пытаюсь понять сам, но пока не сильно получается... Команда, которую вы предложили работает только в сочетании с параметром -p tcp, то есть вот так

iptables -A FORWARD -p tcp udp -m state --state NEW,RELATED -m connlimit --connlimit-above 100 -j DROP

без указания протокола, или с указанием -p udp — пишем о неправильных аргументах... и это настораживает...

получается что модуль connlimit есть, так как работает для tcp
согласно Iptable Howto, и tcp и udp для трасировщика имеют состояние NEW

p.s. насколько я понял connlimit не работает с udp протоколом, а в этом вся и загвоздка... получается что логического соединения как бы нет, но запись в ip_conntrack создаётся)

Power
11-03-2010, 15:22
Я пытаюсь понять сам, но пока не сильно получается... Команда, которую вы предложили работает только в сочетании с параметром -p tcp, то есть вот так

iptables -A FORWARD -p tcp udp -m state --state NEW,RELATED -m connlimit --connlimit-above 100 -j DROP

без указания протокола, или с указанием -p udp — пишем о неправильных аргументах... и это настораживает...

получается что модуль connlimit есть, так как работает для tcp
согласно Iptable Howto, и tcp и udp для трасировщика имеют состояние NEW

p.s. насколько я понял connlimit не работает с udp протоколом, а в этом вся и загвоздка... получается что логического соединения как бы нет, но запись в ip_conntrack создаётся)

Скажем так, на моём компе с линуксом приведённая мной команда работает. И даже вроде бы делает то, что нужно.
На роутере у меня нет модуля connlimit (прошивка 10 от Олега), поэтому команда не выполняется (Couldn't load match `connlimit':File not found).