Завёл дома сервер, расшарил на нём файло по самбе и по 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 ?
Вообще то неплохо подробности сообщать...
Ну ладно, это я ворчу...
Kernel 2.4.20
Применил patch-o-matic для iptables-1.2.5 (можно и посвежее взять).
Собственно вам нужен iplimit.patch
При конфигурировании ядра указал-что-нужно-указать, в том числе:
CONFIG_IP_NF_MATCH_IPLIMIT 'm'
Прересобрал ядро, или модули, установил модули.
Собрал (лично я) iptables-1.2.7a
Ну а дальше пишите правила, только не те, что у вас, а типа:
Examples:
# 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.
Ок, попробую найти 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
А вы перед наложением патча проверяли его работоспособность?
Я с 1.2.9 не игрался, там про patch-o-matic что-то нехорошее писали, впрочем сейчас глянул, вроде уже не пишут...
Попробуйте для 1.2.5 или patch-o-matic-20030107, но тогда вам нужно 1.2.7 собирать...
Не знаю как сейчас, а полгода еще назад в составе patch-o-matic шел скрипт, который перед наложением позволял проверить патч. Но и "хорошие" патчи не всегда позволяли потом ядро без проблем собрать.
Короче, думайте сами, что легче, пересобрать фильтр и переписать правила, если есть необходимость, или долбаться с пересборками ядра-модулей.
Успехов!
И правильно он тебя обругал! Что с этим правилом делать? добавить/убрать, в какую цепочку и таблицу
А вот правильный вариант:
/usr/sbin/iptables -I INPUT -p tcp --syn --dport 23 -m connlimit --connlimit-above 2 -j REJECT