5

Мне нужно ограничить доступ к некоторому порту на IP. Допустим, 5 соединений в минуту - не более.

Я видел iptables недавно, connlimit и limit, но все они не соответствуют именно тому, что мне нужно.

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

недавний: если какой-либо IP-адрес пытается подключиться каждую 1 секунду, --hitcount 5 запомнит этот IP-адрес и сохранит его в списке до тех пор, пока в течение --second 60 раз не поступит никаких пакетов. Таким образом, это будет ограничивать клиента навсегда в моем сценарии.

limit: Это ограничение, как я желаю, с --limit 5/min, но для всех IP - нет способа указать это для каждого IP.

connlimit: ограничивает количество одновременных подключений, но не за некоторое время.

На самом деле мне нужна смесь лимита + недавнего. Кто знает как это сделать?

3 ответа3

2

Наконец-то удалось сделать это с недавними:

iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
         -m recent --rcheck --seconds 60 --hitcount 5 --name ssh --rsource \
         -j REJECT --reject-with icmp-port-unreachable

iptables -A INPUT -p tcp -m tcp --dport 22 -m state --state NEW \
         -m recent --set --name ssh --rsource

--update перезапустит таймер снова на каждом принимающем пакете, но --rcheck будет только проверять его. Через 60 секунд структура удаляется и снова запускается новый таймер.

Вот как я это понял (я не искал источники - слишком ленив)

1

Используйте расширение соответствия hashlimit :

port=9999
iptables -A INPUT -p tcp --dport $port        \
      -m conntrack --ctstate NEW              \
      -m hashlimit --hashlimit-name SuperUser \
                   --hashlimit-above 5/minute \
                   --hashlimit-mode srcip     \
      -j DROP

Отладочная версия:

#!/bin/sh
dport=9999
limit=2/minute
burst=2

iptables -F
iptables -N SuperUser 2>/dev/null
iptables -N SuperUserLimited 2>/dev/null

# SuperUserLimited
iptables -A SuperUserLimited -j LOG                         \
                                 --log-level info           \
                                 --log-prefix 'SU:dropped '
iptables -A SuperUserLimited -j DROP

# SuperUser
iptables -A SuperUser -j LOG                         \
                          --log-level info           \
                          --log-prefix 'SU:new '
iptables -A SuperUser -m hashlimit                   \
                          --hashlimit-name SuperUser \
                          --hashlimit-above $limit   \
                          --hashlimit-burst $burst   \
                          --hashlimit-mode srcip     \
                      -j SuperUserLimited
iptables -A SuperUser -j LOG                         \
                          --log-level info           \
                          --log-prefix 'SU:accepted '

# main
iptables -A INPUT -p tcp --dport $dport \
                  -m state --state NEW  \
                  -j SuperUser
0

Для ограничения количества подключений используется connlimit match. пример:

iptables -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 5 --connlimit-mask 32 -j REJECT --reject-with tcp-reset

это будет отклонять соединения выше 5 от одного источника IP. Если вы хотите защитить от DDoS-атаки, используйте hashlimit , вы можете ограничить их по IP, по комбинации IP + порт и т.д. Таким образом, примером для веб-сервера будет что-то вроде этого

iptables -A INPUT -p tcp --dport 80 -m hashlimit --hashlimit 45/sec --hashlimit-burst 60 --hashlimit-mode srcip --hashlimit-name DDOS --hashlimit-htable-size 32768 --hashlimit-htable-max 32768 --hashlimit-htable-gcinterval 1000 --hashlimit-htable-expire 100000 -j ACCEPT

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .