Iptables Connlimit срабатывает неожиданно
Я использовал эти правила брандмауэра:
-I FORWARD -p tcp --syn -m connlimit --connlimit-above 50 -j REJECT
-I FORWARD -p tcp --syn -m connlimit --connlimit-above 50 -j LOG --log-prefix "CONNLIMIT: " --log-level debug
это кажется достаточно простым: не дать кому-либо открыть более 50 соединений и вызвать отказ в обслуживании. Я успешно проверил это против slowlois. Я увеличил ограничение до 50 специально для предотвращения проблем с ложными срабатываниями (Apache может быть очень требователен к соединению.) Однако сегодня утром я получаю электронное письмо от моего монитора Nagios, и в моих журналах отображаются несколько строк "CONNLIMIT" с IP-адрес источника является моей системой мониторинга.
Я понятия не имею, почему это происходит. самое большее, мой сервер мониторинга должен выполнять 5-10 проверок и, возможно, соединение ping или SSH. Я был бы шокирован, если бы у меня было открыто более 25 разногласий, и все же 2 уик-энда подряд, я сумел вызвать connlimit 50 и грубо разбудить себя.
что-то не так с моими правилами брандмауэра? (возможно, добавьте флаг 'new'?) Nagios неправильно закрывает свои соединения? Я даже не уверен, как продолжить отладку этой проблемы, не регистрируя каждый пакет в сети и терпеливо ожидая, когда мой сотовый телефон отключится в какой-то ужасный час.
[edit: просто для удовольствия, вот логи сервера]
Oct 9 11:33:22 adapt kernel: [1888526.442640] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=2076 DF PROTO=TCP SPT=46536 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Oct 9 11:34:22 adapt kernel: [1888586.443869] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=43048 DF PROTO=TCP SPT=57931 DPT=80 WINDOW=5840 RES=0x00 SYN URGP=0
Oct 9 11:35:42 adapt kernel: [1888667.011376] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=19161 DF PROTO=TCP SPT=63669 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 9 11:35:48 adapt kernel: [1888673.093663] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=48302 DF PROTO=TCP SPT=63673 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 9 11:35:53 adapt kernel: [1888678.361267] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=11711 DF PROTO=TCP SPT=63677 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 9 11:36:04 adapt kernel: [1888688.517868] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=6316 DF PROTO=TCP SPT=44206 DPT=443 WINDOW=5840 RES=0x00 SYN URGP=0
Oct 9 11:36:21 adapt kernel: [1888705.382273] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=64 TOS=0x00 PREC=0x00 TTL=54 ID=29613 DF PROTO=TCP SPT=63697 DPT=80 WINDOW=65535 RES=0x00 SYN URGP=0
Oct 9 11:36:49 adapt kernel: [1888733.467511] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=52433 DF PROTO=TCP SPT=40930 DPT=22 WINDOW=5840 RES=0x00 SYN URGP=0
Oct 9 11:37:04 adapt kernel: [1888748.574700] CONNLIMIT: IN=eth0 OUT=eth1 SRC=[MONITOR] DST=[HOST] LEN=60 TOS=0x00 PREC=0x00 TTL=54 ID=26329 DF PROTO=TCP SPT=44223 DPT=443 WINDOW=5840 RES=0x00 SYN URGP=0
мы видим, что он проверяет несколько портов и выдает проверку примерно раз в минуту.
2 ответа
Вы, вероятно, хотите recent
не connlimit
,
Вот пример с одного из моих хостов, который ограничивает соединения SSH:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 22 -m state --state NEW -j SSH_Brute_Force
iptables -A SSH_Brute_Force -m recent --set --name SSH --rsource
iptables -A SSH_Brute_Force -m recent ! --update --seconds 120 --hitcount 5 --name SSH --rsource -j RETURN
iptables -A SSH_Brute_Force -m recent --update --name SSH --rsource
iptables -A SSH_Brute_Force -p tcp -j DROP
Или же:
- Только пакеты SSH уже выбраны для входа в цепочку
- Назначьте соединения в недавнюю очередь "SSH"
- Установите 120-секундный тайм-аут и максимум пять новых подключений за это время, верните сеансы вызывающей цепочки, которые не должны быть ограничены (вызывающая цепочка затем позволяет хорошим хостам)
- Обновить список подключений
- Отбросить пакет
Когда правило срабатывает, вы видите открытые соединения с хоста монитора в netstat?
Как насчет в /proc/net/ip_conntrack на маршрутизаторе?
ISTR, который connlimit фактически ограничивает все соединения, которые попадают в это правило, и это очень общее правило. Число увеличивается к 50 из-за других соединений, проходящих через маршрутизатор?
Как насчет добавления правила отладки, чтобы определить, что на самом деле происходит:
-I FORWARD -p tcp --syn -s [MONITOR] -j LOG --log-prefix "MONITOR CONNECT: " --log-level debug