LINUX.ORG.RU
ФорумAdmin

Ограничение количества соединений с одного IP


0

0

Завёл дома сервер, расшарил на нём файло по самбе и по Apache, сообщил
народу, народ скачивает. Проблема : некорые умники качают в 350 (!!!) 
потоков ! Такое количество потоков забивают канал. Мой интернет 
начинает работать с анекдотичной скоростью + этот умник качает, а у
остального народа всё плохо. Ограничение на количесво соединений с 
одного IP адреса на уровене Apache не решило проблему, только хуже 
сделало. Apache-то отдаёт только двум потокам, но этот умник-то 
всё-равно остальными потоками ломится. Соединения висят в остоянии 
ожидания, потом рвутся, потом опять новые соединения. Это только хуже 
делает. Бан этого умника - не решение, появятся и другие такие. Нужно 
ограничивать на урове TCP-IP стека. Говорю :

/usr/sbin/iptables -A INPUT-p tcp --dport 80 -m connlimit --connlimit-above 2 -j REJECT

он мне :

iptables: No chain/target/match by that name

Выяснил, что для того, чтобы это работало, нужен patch-o-matic. 
Наложил. Ядро перестало собираться.
gcc -D__KERNEL__ -I/usr/src/linux-2.4.20/include -Wall -Wstrict-prototypes -Wno-trigraphs -O2 -fno-strict-aliasing -fno-common -fomit-frame-pointer -pipe -mpreferred-stack-boundary=2 -march=i686   -nostdinc -iwithprefix include -DKBUILD_BASENAME=ipt_dstlimit  -c -o ipt_dstlimit.o ipt_dstlimit.c
ipt_dstlimit.c: In function `htable_selective_cleanup':
ipt_dstlimit.c:243: warning: implicit declaration of function `list_for_each_entry_safe'
ipt_dstlimit.c:243: `list' undeclared (first use in this function)
ipt_dstlimit.c:243: (Each undeclared identifier is reported only once
ipt_dstlimit.c:243: for each function it appears in.)
ipt_dstlimit.c:243: parse error before `{'
ipt_dstlimit.c: At top level:
ipt_dstlimit.c:248: parse error before `do'
......



 Тьфу. Что делать ? Кто знает точно работающие конфигурации 
ядра/patch-o-matic ? Есть другие способы огрничить на уровне IP стека 
максимальное количество соединений с одного IP ?


Re: Ограничение количества соединений с одного IP

Вообще то неплохо подробности сообщать... Ну ладно, это я ворчу... Kernel 2.4.20 Применил patch-o-matic для iptables-1.2.5 (можно и посвежее взять). Собственно вам нужен iplimit.patch При конфигурировании ядра указал-что-нужно-указать, в том числе: CONFIG_IP_NF_MATCH_IPLIMIT 'm' Прересобрал ядро, или модули, установил модули. Собрал (лично я) iptables-1.2.7a Ну а дальше пишите правила, только не те, что у вас, а типа: Examples:

# allow 2 telnet connections per client host iptables -p tcp --syn --dport 23 -m iplimit --iplimit-above 2 -j REJECT

# you can also match the other way around: iptables -p tcp --syn --dport 23 -m iplimit ! --iplimit-above 2 -j ACCEPT

# limit the nr of parallel http requests to 16 per class C sized # network (24 bit netmask) iptables -p tcp --syn --dport 80 -m iplimit --iplimit-above 16 \ --iplimit-mask 24 -j REJECT

Сам я эту штуку не пробовал, но по этому рецепту включил произвольную установку битов TOS с помощью FTOS. Regards.

anonymous ()

Re: Re: Ограничение количества соединений с одного IP

Ок, попробую найти iptables-1.2.5.

Говорю :
iptables -p tcp --syn --dport 23 -m iplimit --iplimit-above 2 -j REJECT

Ответ :
iptables v1.2.9: Couldn't load match `iplimit':/usr/local/lib/iptables/libipt_iplimit.so: cannot open shared object file: No such file or directory

Try `iptables -h' or 'iptables --help' for more information.

Это потому что в новых iptables это называется не iplimit, а connlimit.

Говорю :
/usr/sbin/iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
Ответ:
iptables v1.2.9: no command specified

lenin ()

Re: Re: Re: Ограничение количества соединений с одного IP

А вы перед наложением патча проверяли его работоспособность? Я с 1.2.9 не игрался, там про patch-o-matic что-то нехорошее писали, впрочем сейчас глянул, вроде уже не пишут...

Попробуйте для 1.2.5 или patch-o-matic-20030107, но тогда вам нужно 1.2.7 собирать... Не знаю как сейчас, а полгода еще назад в составе patch-o-matic шел скрипт, который перед наложением позволял проверить патч. Но и "хорошие" патчи не всегда позволяли потом ядро без проблем собрать.

Короче, думайте сами, что легче, пересобрать фильтр и переписать правила, если есть необходимость, или долбаться с пересборками ядра-модулей. Успехов!

anonymous ()

Re: Ограничение количества соединений с одного IP

mod_limitipconn не пробовал ?

anonymous ()

Re: Re: Re: Ограничение количества соединений с одного IP

>Говорю :
>/usr/sbin/iptables -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT
>Ответ:
>iptables v1.2.9: no command specified

И правильно он тебя обругал! Что с этим правилом делать? добавить/убрать, в какую цепочку и таблицу
А вот правильный вариант:
/usr/sbin/iptables -I INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT

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