
Я хочу ограничить одновременные FTP-подключения к моему серверу FreeBSD с помощью брандмауэра pf. Например, чтобы с одного исходного IP-адреса было возможно только 10 одновременных подключений к порту 20 или 21.
Я использую для этого следующее правило:
pass in quick proto tcp from any to em0 port {20, 21} keep state (max-src-conn 10)
Проблема в том, что каждая загрузка или скачивание создает запись о состоянииFIN_WAIT_2:FIN_WAIT_2когда он будет завершен. Это состояние будет удалено только тогда, когдаtcp.finwaitДостигнут тайм-аут. После 10 таких состояний FIN_WAIT не принимает новое соединение с сервером. Это проблема, когда вы пытаетесь загрузить или загрузить несколько файлов последовательно с помощью одного входа на ftp.
Есть ли у кого-нибудь хорошее решение этой проблемы?
решение1
Это можно легко сделать с помощью rctl
. Вы бы запустили ftp-демон с уникальным UID и ограничили бы количество процессов этим UID. Вот и все.
Возможно, вам придется перекомпилировать ядро с помощью
options RACCT
options RCTL
и тогда вы можете использовать rctl вот так:
rctl -a user:ftp:maxproc:deny=11
Посмотрите man rctl
и вам понравится ;)