Bekijk de volledige versie : Ограничение количества TCP сессий
Помогите решить задачку.
Дано:
В локальной сетке есть сервер со всякими видеоматериалами, и есть на нем строгое ограничение - не более одного соединения на скачку, иначе могут прокатить по автобану.
"Внимание, вопрос!" :)
Возможно ли средствами роутера ограничить количество соединений tcp на конкретный ip адрес и порт?
Дык в любом менеджере закачек можно выставить количество потоков.
Вся проблема в том, что к роутеру подключено несколько компьютеров, а организовать скачивание по очереди проблематично. Вот начнем качать одновременно, и нам сразу будет заказана дорога в бан.
Вся проблема в том, что к роутеру подключено несколько компьютеров, а организовать скачивание по очереди проблематично. Вот начнем качать одновременно, и нам сразу будет заказана дорога в бан.
а скачивать роутером с общей очередью?
FilimoniC
07-02-2007, 08:33
а скачивать роутером с общей очередью?
Да чето бред говорите.. ВАРИАНТ: организовать проброс порта и сделать лимит подключений на порт роутера
Да чето бред говорите.. ВАРИАНТ: организовать проброс порта и сделать лимит подключений на порт роутера
ну так расскажите как организовать?
После долгих поисков решений я набрел на 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.
Может кто видет другие решения?
После долгих поисков решений я набрел на 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
кстати, а вы не забыли случаем указать
-m iplimit
С этим правило вообще не принимается.
С этим правило вообще не принимается.
забавно.
Примеры, которые я помню были с -m iplimit ... правда iplimit всегда ставился в цепочку INPUT, а вам надо на OUTPUT - возможно в этом проблема
В поисках решения я пошел по пути, подсказанным 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 адреса.
Что то я делаю не так :)
[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
Этот бинарник скомпилирован под 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 сессий?
по поводу №1: еще одну(?) может иногда добавлять синхронизация времени
Какое максимальное значение одновременных NAT сессий в ASUS WL-500g,Premium ver.2?
Вопрос актуальный.
Тоже хочу узнать как ограничить количество 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 на роутере?
Я думаю, классический способ таков:
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 создаётся)
Я пытаюсь понять сам, но пока не сильно получается... Команда, которую вы предложили работает только в сочетании с параметром -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).