Недавно столкнулся с проблемой: на сайт в огромном количестве повалил китайский трафик. Оказалось, что одна из размещенных на моем хосте картинок попала в китайские блоги. Провайдер, у которого я арендую сервер, тут же забил тревогу о несоответствии соотношений (три к двум) российского и зарубежного трафиков.
Переплачивать естественно не хотелось, поэтому я быстро выровнял соотношение и начал думать, как исправить ситуацию. Собственно, выход в своей ситуации я видел один — блокировать трафик с китайских IP-адресов. По крайней мере, в случае возникновения подобной ситуации. Для этого нужно было обзавестись актуальной геолокационной базой данных IP-адресов для определения китайского трафика и выбрать решение, чтобы блокировать подключения по географическому признаку.
Геолокационных баз данных IP-адресов (в формате «Город/Страна — IP») оказалось достаточно много, как собранных энтузиастами, так и профессиональными компаниями, которые продают их за деньги. Мне больше всего приглянулась бесплатная WIP-Base от сервиса WIPmania.com.
Решение задачи разделим на два пункта: выбор геолокационной базы данных IP-адресов для определения китайского трафика и настройку решения для блокировки подключений с нежелательных IP-адресов.
1. Различными энтузиастами и профессионалами созданы различные геолокационные базы данных IP-адресов (в формате «Город/Страна — IP»). Из всех предложений, присутствующих в интернете, мне больше всего нравится бесплатная WIP-Base от WIPmania.com. Она позволяет неограниченно определять реальные физические расположения IP-адресов. Она абсолютно бесплатна для персонального и бизнес-использования, постоянно обновляется, доступна в SQL, CIDR, текстовом формате и предоставляет ряд фишек:
- WIP-API (удобный API для разработчиков);
- WIP-Plugin (WorldIP-плагин для Mozilla Firefox);
- WIP-Map (показывает IP-адреса прямо на карте).
Спектр применения довольно широк: геотаргетинг в электронной коммерции, борьба с фродом, фишингом, спамом и мошенничеством, защита серверов от различных видов атак по геопризнаку. Собственно, последнее и есть наша задача.
2.Для того чтобы ограничить трафик из какой-то определенной страны, есть разные решения. Мы же воспользуемся стандартной возможностью iptables, позволяющей проводить фильтрацию по геопризнаку. Кстати, это может применяться не только для блокировки нежелательных подключений, но и для балансировки запросов на разные бекенды, каждый из которых обрабатывает свой регион. Нам поможет модуль geoip из пакета расширений xtables-addons для iptables, у него свой формат геолокационной базы, но к счастью WorldIP-база от WIPmania теперь есть и в этом формате. Порядок действий такой:
- Устанавливаем xtables-addons (xtablesaddons.sourceforge.net).
- Подключаем базу для модуля geoip. Актуальная версия базы всегда доступна по URL — static.wipmania.com/static/worldip.iptables.tar.gz. Чтобы база обновлялась, ее можно обновлять по крону (скажем, раз в месяц).
- Далее можно настроить правила.
Блокируем доступ к 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).