Блокування трафіку за допомогою iptables та ipset
Для захисту від DDOS-атак або паразитного трафіку, блокування на рівні сервера, а не nginx (як наприклад тут - https://bender.kr.ua/nginx-geoip/) , є більш ефективним. Тому, якщо у вас виникла потреба блокувати IP з певних країн і не існує інших застережень, варто скористатись зв’язкою iptables + ipset.
Для початку встановлюємо ipset:
apt-get install ipset
Створюємо скрипт, який буде оновлювати таблюцю адрес для блокування. Списки IP за приналежністю до країни, можна взяти на сайті ipdeny.com - https://www.ipdeny.com/ipblocks/. В нашому випадку ми блокуємо російський сегмент мережі.
#!/bin/bash
# створюємо список 'russia'
ipset -N russia hash:net
# вилучаємо старий файл з адресами
rm -rf /etc/ru.zone
# викачуємо новий файл
wget -c http://www.ipdeny.com/ipblocks/data/countries/ru.zone -O /etc/ru.zone
# додаємо IP з файлу до списку 'russia'
for i in $(cat /etc/ru.zone ); do ipset -A russia $i; done
# оновлюємо правила iptables
iptables-restore < /etc/iptables.up.rules
Що написати в /etc/iptables.up.rules можна подивитись в статті https://bender.kr.ua/howto-lemp-install/. Единою зміною буде додавання правила для блокування списку ‘russia’:
було:
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
стало:
# Accepts all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A INPUT -p tcp -m set --match-set russia src -j DROP
# Allows all outbound traffic
# You could modify this to only allow certain traffic
-A OUTPUT -j ACCEPT
Після цього block_ip.sh треба зробити виконуваним
chmod +x /etc/block_ip.sh
та запхнути його в крон
crontab -e
0 0 * * * /etc/block_ip.sh