Sys-Admin Forum

Как я обнаружил SYN-флуд, и как его закрыл

Первое с чего все началось, с вопроса: а нужно ли мне ограничить количество одновременных подключение к серверу(или сайту) с одного IP? Если да, то какое количество ставить? Что то тип такого:

#Ставим ограничение одновременных число коннектов к веб-серверу с одного ip (в тестовом режиме!!!)
#$IPT -A INPUT -p tcp --syn --dport 80 -m connlimit --connlimit-above 3 --connlimit-mask 24 -j DROP

Если поставить маленькое значение например 3-5, то возможно тех легитимных пользователей, которые седят за одним IP (NAT) - просто обрубает. Необходимо проверить, сколько таких людей бывает у меня:
netstat -ntu | awk ‘{print $5}’ | cut -d: -f1 | sort | uniq -c | sort -n

Данную команду нашел на:

Ссылка

https://vps.ua/wiki/view-connections-server/

Листая это список, наткнулся на очень большое количество IP с одной подсети
photo_2020-01-15_15-54-34 photo_2020-01-15_15-58-44
Данные подсети с Ирака, и очень даже подозрительные. хммм :face_with_monocle:

На этом же сайте нашел еще и вот такую команду:
Показать число полуоткрытых соединений (которые в состоянии SYN RECEIVED). Нормальное количество соединений – до 5. Большие значения таких соединений на сервере могут предвещать наличие происходящей SYN-атаки. :
netstat -n -p | grep SYN_RECV | wc -l

У меня это значение было от 80-120. Это меня озадачило. На том же сайте нашел, вот такую вот команду:
Вывести список уникальных IP-адресов, с которых пришли SYN-пакеты.
netstat -n -p | grep SYN_REC | awk ‘{print $5}’ | awk -F: ‘{print $1}’

После выполнения команды, все выше упомянутые IP, тут присутствовали. Ясно-понятно) Это SYN-флуд. Вывод: мой iptables ни веб-сервера это обнаружить не смогли.

Пару дне я провел изучая информацию в сети. Статей на данную тем - не мало, но во-первых: не очень доверяешь этим мануалам и конфигам, так как описания, что делает та или иная команда либо - нет, либо мало.
Ниже приведу ссылку на статью, которая мне показалась достаточно информативной и интересной. Но, прежде чем что то добавить на боевой сервер, я протестировал это на Копии.

Ссылка

https://javapipe.com/blog/iptables-ddos-protection/

А вот то, что мне помогло избавиться от не хороших IP с Ирака :sunglasses:

#3: Drop SYN packets with suspicious MSS value ###
/sbin/iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP

Пример работы правил:
Screenshot_20200121_101227
Так же в свой firewall добавил и эти правила. Важное уточнение!!!Все правила добавлял до открытия портов.
По моему ничего не забыл.
И да, как обычно готов выслушать критику и принять предложения о доработке и усовершенствованию.

### 4: Block packets with bogus TCP flags ###
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags FIN,ACK FIN -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,URG URG -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,FIN FIN -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ACK,PSH PSH -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL ALL -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL NONE -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
/sbin/iptables -t mangle -A PREROUTING -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP

1 Симпатия

Добавь ipset в него добавь “ненужные” страны из CIDR