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

Встала задача, ограничить количество устанавливаемых клиентами сетевых соединений проходящих через шлюз в единицу времени, на шлюзе стоит Linux.

На самом деле, я нашел всего два модуля для iptables, которые помогут мне помочь в решении данной задачи. Это модуль connlimit и модуль recent.

connlimit может работать только с tcp протоколом, и может ограничивать количество установленных tcp сессий для каждого клиента достаточно простым правилом, например пример приведенный ниже ограничит количество TCP сессий от каждого клиента из сети 172.16.0.0/12 в 200.


-A FORWARD -s 172.16.0.0/12 -p tcp --syn -m connlimit --connlimit-above 200 -j DROP

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

recent работает по следующему принципу: первым правилом iptables вы назначаете пакетам удовлетворяющим определенным критериям уникальное имя которое впоследствии будет использоваться этим модулем для наложения ограничений.

Например присвоим всем сетевыем пакетам с состоянием NEW (новое соединение), проходящие через сетевой интерфейс eth0 нашего роутера имя SYNF.

-A FORWARD -i eth0 -m state --state NEW -m recent --set --name SYNF --rsource

Вторым правилом мы скажем модулю, что если от какого-то клиента таких пакетов помеченных как SYNF больше 10 за 10 секунд, то такие пакеты должны отбрасываться.

-A FORWARD -i eth0 -m state --state NEW -m recent --update --seconds 10 --hitcount 10 --rttl --name SYNF --rsource -j DROP

Тестирование показало, что использование модуля recent не влияет на нагрузку роутера. Причем с помошью комбинации модулей state и recent можно делать достаточно интересные ограничения в сетевом трафике препятствуюя распространению спама, флуда и пр.

http://centos.alt.ru/?p=85

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *