Первое с чего все началось, с вопроса: а нужно ли мне ограничить количество одновременных подключение к серверу(или сайту) с одного 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
Данную команду нашел на WIKI.
Листая это список, наткнулся на очень большое количество IP с одной подсети:
Данные подсети с Ирака, и очень даже подозрительные. хммм
На этом же сайте нашел еще и вот такую команду:
Показать число полуоткрытых соединений (которые в состоянии 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 ни веб-сервера это обнаружить не смогли.
Пару дне я провел изучая информацию в сети. Статей на данную тем – не мало, но во-первых: не очень доверяешь этим мануалам и конфигам, так как описания, что делает та или иная команда либо – нет, либо мало.
Ниже приведу ссылку на статью, которая мне показалась достаточно информативной и интересной. Но, прежде чем что то добавить на боевой сервер, я протестировал это на Копии.
А вот то, что мне помогло избавиться от не хороших IP с Ирака.
# Drop SYN packets with suspicious MSS value ###
iptables -t mangle -A PREROUTING -p tcp -m conntrack --ctstate NEW -m tcpmss ! --mss 536:65535 -j DROP
Пример работы правил:
Так же в свой firewall добавил и эти правила. Важное уточнение!!!Все правила добавлял до открытия портов.
По моему ничего не забыл.
И да, как обычно готов выслушать критику и принять предложения о доработке и усовершенствованию.
## Блокирование пакетов с неверными TCP флагами
iptables -A INPUT -i $interface -p tcp --tcp-flags FIN,SYN,RST,PSH,ACK,URG NONE -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags FIN,SYN FIN,SYN -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags SYN,RST SYN,RST -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags SYN,FIN SYN,FIN -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags FIN,RST FIN,RST -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags FIN,ACK FIN -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ACK,URG URG -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ACK,FIN FIN -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ACK,PSH PSH -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ALL ALL -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ALL NONE -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ALL FIN,PSH,URG -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ALL SYN,FIN,PSH,URG -j DROP
iptables -A INPUT -i $interface -p tcp --tcp-flags ALL SYN,RST,ACK,FIN,URG -j DROP