Як заблокувати трафік на сайті з певного регіону

Нещодавно зіткнувся з проблемою: на сайт у величезній кількості повалив китайський трафік. Виявилося, що одна з розміщених на моєму хості картинок потрапила в китайські блоги. Провайдер, у якого я орендую сервер, тут же забив на сполох про невідповідність співвідношень (три до двох) українського і зарубіжного трафіків.

Спектр застосування досить широкий: геотаргетинг в електронній комерції, боротьба з фродом, фішингом, спамом і шахрайством, захист серверів від різних видів атак по геопрізнаку. Власне, останнє і є наше завдання.

2. Для того щоб обмежити трафік з якоїсь певної країни, є різні рішення. Ми ж скористаємося стандартної можливістю iptables, що дозволяє проводити фільтрацію по геопрізнаку. До речі, це може застосовуватися не тільки для блокування небажаних підключень, а й для балансування запитів на різні бекенди, кожен з яких обробляє свій регіон. Нам допоможе модуль geoip з пакета розширень xtables-addons для iptables, у нього свій формат геолокаційні бази, але на щастя WorldIP-база від WIPmania тепер є і в цьому форматі. Порядок дій такий:

  1. Встановлюємо xtables-addons (xtablesaddons.sourceforge.net).
  2. Підключаємо базу для модуля geoip. Актуальна версія бази завжди доступна по URL - static.wipmania.com/static/worldip.iptables.tar.gz. Щоб база оновлювалася, її можна оновлювати за крону (скажімо, раз на місяць).
  3. Далі можна налаштувати правила.

Блокуємо доступ до http-серверу для всіх клієнтів з Китаю:

iptables -A INPUT -p tcp --dport 80
-m geoip --src-cc CN -j DROP
iptables -A INPUT -p tcp --dport 80
-j ACCEPT

Можна вчинити більш радикально і дозволити доступ для клієнтів з якихось конкретних країн (наприклад, Укаїни, України і Білорусії):

iptables -A INPUT -p tcp --dport 80
-m geoip --src-cc RU, UA, BY -j ACCEPT
iptables -A INPUT -p tcp --dport 80
-j DROP

Завдання можна було також вирішити через nginx за допомогою модуля ngx_http_geo_module, налаштувавши кілька простих правил (докладніше - bit.ly/jIHTaA).

Покажи цю статтю друзям: