У меня есть веб-приложение, у которого нет пользователей на Филиппинах, но его постоянно атакуют спамеры, кардеры, проверяющие карты и другие нежелательные действия оттуда. Я вижу в журналах, что они имеют IP-адреса на Филиппинах и изначально находят мой сайт через google.ph или другие сайты в зоне .ph.
У меня установлены довольно хорошие фильтры и проверки безопасности, поэтому они не причиняют большого вреда, но тем не менее я уже устал от этого. Они используют пропускную способность, заполняют мою базу данных, журналы безопасности всякой ерундой, тратят мое время на удаление аккаунтов и т. д.
Хотя подавляющее большинство жителей Филиппин не являются спамерами и я не могу просто заблокировать каждую страну, которая меня раздражает, на данный момент я думаю, что решение состоит в том, чтобы просто заблокировать весь трафик из Филиппин в моем веб-приложении. (Я знаю, что блокирование IP-блоков целых стран – не лучшая практика и у нее много проблем, но для этой страны я хочу сделать исключение). (Я знаю, что они могут подделать свой IP-адрес, но, по крайней мере, я могу заставить их немного поработать для этого). Я знаю, что существует несколько служб geoip. Кто-нибудь знает какие-нибудь бесплатные или недорогие сервисы? Или любой другой способ отфильтровать трафик из определенной страны?
Я использую PHP на Apache 2, если это имеет значение.
Ответ 1
Я не собираюсь говорить вам, что это плохая идея, что вам не следует этого делать, что это не решит вашу проблему или что вам следует сделать что-то другое. Вот что произошло с нами:
Люди из Китая и Кореи (или использующие прокси в Китае и Корее, в любом случае) продолжали досаждать нам. Портовое сканирование, ползание по нашим сайтам в поисках уязвимостей, попытки входа в систему и т. д. Я старался игнорировать их (fail2ban обычно справляется с ними), но в некоторые моменты они так сильно на нас наседали, что это превращалось в DoS-атаку. Когда у вас сотни соединений одновременно от людей, пытающихся использовать ваш веб-сервер в качестве прокси-сервера, пытающихся войти в SSH на вашей машине, пробующих случайные имена пользователей и пароли, это приводит к нагрузке на сайт. В конце концов, мне это надоело.
Мы не получаем никакого законного трафика из Китая или Кореи; наша компания не продает там товары (мы занимаемся электронной коммерцией), поэтому не было риска потерять законный трафик, и я решил, что проще заблокировать их заранее, а не ждать, пока они разрушат наш сайт.
Зашел на http://ip.ludost.net/ и скачал их базу данных IP<->страны.
Извлек все китайские и корейские диапазоны IP-адресов.
Установил модуль ipset для netfilter.
Собрал дампы ipset для Китая и Кореи (см. ниже).
Добавил правила в iptables, чтобы по умолчанию отбрасывать любой трафик из этих наборов.
И все. Наши проблемные пользователи ушли, нагрузка на сеть и сервер снизилась.
Примечание 1: вы можете сделать это с помощью обычного iptables (т. е. без ipset), но это требует больших вычислительных затрат, чем использование ipset.
Примечание 2: вот как выглядят дампы (ipset сгенерирует их для вас, если вы захотите):
-N china nethash --hashsize 5184 --probes 4 --resize 50
-A china 203.207.128.0/17
-A china 221.176.0.0/13
-A china 58.154.0.0/15
-A china 114.54.0.0/15
...etc...
Примечание 3: мы используем nethash, потому что все наши диапазоны хранятся в виде блоков CIDR. Если вы не хотите преобразовывать их в CIDR, вы можете использовать iptreemap, но я полагаю, что это может быть менее эффективно, если вы получаете много «левого» трафика.
Ответ 2
Почему ваше веб-приложение уязвимо к спаму? Какие характеристики делают его уязвимым? Какие характеристики делают его ценной мишенью? Есть ли способы изменить эти характеристики, чтобы сделать ваше приложение более устойчивым к спаму и менее заманчивой мишенью? Почти наверняка ответ на эти вопросы будет положительным. Добавьте в формы цепочки валидации, используйте капчу с умом, рандомизируйте урлы и/или имена параметров, чтобы сделать их недружелюбными для ботов. Существуют миллионы способов решения этой проблемы, и мне жаль говорить, что вы выбрали одно из наименее ценных, наименее полезных и наиболее хрупких решений.
Ответ 3
Вы имеете полное право блокировать IP-адреса по любой причине, которую вы можете обосновать для себя. Именно вы предоставляете услугу, и именно вы решаете, кто может ее получить, а кто нет. Возможно, это сомнительно с точки зрения морали, но это то, что вы можете решить только для себя. Однако блокирование сегмента IP, потому что он имеет некоторые географические аспекты, кажется мне более или менее похожим на панический подход.
В прошлом я делал так: я просматривал мои последние журналы и на основании этого запрещал отдельные IP, которые вызывают подозрительность, на период 24 часа. Если этот конкретный IP снова ведет себя плохо, он запрещается на 2 дня, затем на 3 дня и т. д. и т. п., вы уловили суть. IP, забаненные более чем на неделю, будут отправлены мне по почте, и я пошлю сообщение о нарушении поставщику услуг (кто знает, это может даже помочь).
Ответ 4
Несколько решений:
Исключить некоторые IP в конфигурации Apache с помощью mod_access.
Использовать GeoIp непосредственно из Apache: http://www.maxmind.com/app/mod_geoip.
Исключить некоторые IP из Linux iptables напрямую. Это более рискованно, если у вас только удаленный доступ, вы можете заблокировать себя от машины.
geoip + iptables.
Эти решения довольно легко и быстро устанавливаются, к тому же они бесплатны. Более долгосрочным решением будет обнаружение спама из вашего веб-приложения, регистрация IP и автоматическая блокировка его iptables.
Ответ 5
Во-первых, я бы настоятельно рекомендовал не делать этого.
Как более красноречиво сказали другие, блокировка конкретной страны не решает проблему, а лишь немного откладывает ее. Кроме того, когда пользователи из этой страны увидят, что вы заблокировали именно их, это только подтолкнет их к тому, чтобы создать вам еще больше проблем. Если вы действительно хотите это сделать, IPinfoDB предоставляет бесплатную базу данных IP-геолокации. Во-первых, можно найти IP просто по стране.
Это можно сделать таким образом:
SELECT * FROM 'ip_group_country' where 'ip_start' <= INET_ATON('74.125.45.100') order by ip_start desc limit 1;
Или:
SELECT * FROM 'ip_group_country' where 'ip_start' <= 1249717504 order by ip_start desc limit 1;
Во-вторых, вы можете захотеть получить IP определенной страны для создания блок-листа с помощью iptable, файла htaccess или того, что вы используете. Это можно сделать следующим образом:
SELECT 'ip_cidr' FROM 'ip_group_country' WHERE 'country_code' = 'AF' order by ip_start;
Что дало бы вам:
63.243.149.0/24
67.212.160.0/24
Security