Назад | Перейти на главную страницу

Относительно простой способ заблокировать весь трафик из определенной страны?

У меня есть веб-приложение, у которого нет пользователей на Филиппинах, но которое постоянно засыпается спамерами, кардерами, тестирующими карты, и другой нежелательной деятельностью оттуда. Я вижу в журналах, что у них есть IP-адреса на Филиппинах, и они изначально находят мой сайт через google.ph или другой .ph места.

У меня есть довольно хорошие фильтры и проверки безопасности, поэтому они не причиняют большого вреда, но, тем не менее, я действительно устаю от этого. Они используют полосу пропускания, заполняют мою базу данных, журналы злоупотреблений и журналы безопасности мусором, тратят мое время на создание учетных записей и т. Д.

Хотя подавляющее большинство граждан Филиппин не являются спамерами, и я не могу просто заблокировать каждую страну, которая меня раздражает, на данный момент я думаю, что решение состоит в том, чтобы просто заблокировать весь трафик с Филиппин на мое веб-приложение. (Я знаю, что блокировка IP-блоков целых стран - не лучшая практика, и у нее много проблем, но для этой страны я хочу сделать исключение.)

(Я знаю, что они могут подделать свой IP-адрес, но, по крайней мере, я могу заставить их немного поработать.)

Я знаю, что существует несколько сервисов geoip. Кто-нибудь знает о каких-либо бесплатных или недорогих услугах? Или каким-то другим способом отфильтровать трафик из определенной страны?

Я использую PHP на Apache 2, если это важно.

В отличие от большинства других плакатов здесь, я не собираюсь говорить вам, что это плохая идея, что вы не должны этого делать, что это не решит вашу проблему или что вы должны сделать что-то еще. Вот что с нами случилось:

Люди из Китая и Кореи (или, во всяком случае, использующие прокси в Китае и Корее) продолжали нас раздражать. Сканирование портов, сканирование наших веб-сайтов в поисках уязвимостей, попытки входа в систему и т. Д. Я пытался игнорировать их (fail2ban обычно заботится о них), но в некоторые моменты они били нас так сильно, что это фактически превратилось в DoS-атаку. Когда у вас одновременно есть сотни подключений от людей, которые пытаются использовать ваш веб-сервер в качестве прокси, пытаются подключиться к вашей машине по SSH, пробуют случайные имена пользователей и пароли, это имеет тенденцию весить на сайте. В конце концов мне это надоело.

Мы не получаем законного трафика из Китая или Кореи; наша компания там не продает (мы - электронная коммерция), поэтому не было риска потерять законный трафик, поэтому я подумал, что было проще заблокировать их заранее, чем ждать, пока они будут ублюдками.

  1. Посетил http://ip.ludost.net/ и загрузили их базу данных IP <-> страны.
  2. Извлечены все диапазоны китайских и корейских IP-адресов.
  3. Установлен модуль ipset для netfilter
  4. Построены дампы ipset для Китая и Кореи (см. Ниже)
  5. В iptables добавлены правила для молчаливого отбрасывания любого трафика из этих наборов.

И это все. Наши проблемные пользователи ушли, нагрузка на сеть и сервер снизилась, и мы без труда пережили рождественский сезон.

Примечание 1: вы можете сделать это с помощью обычных iptables (то есть без ipset), но это более затратно с точки зрения вычислений, чем использование ipset.

Заметка 2: Вот как выглядят дампы (ipset сгенерирует их для вас, если вы хотите):

# Generated by ipset 2.3.3 on Sat Oct  4 18:02:57 2008
-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, но я полагаю, что это может быть менее эффективно, если вы получаете большой трафик.

Вы можете сделать это на основе IP-адреса с помощью бесплатного API определения местоположения IP, такого как IPInfoDB http://ipinfodb.com/index.php.

Во-первых, я настоятельно рекомендую этого не делать.

Как гораздо более красноречиво выразились другие, блокировка конкретной страны не решает проблему, а лишь немного откладывает ее. Кроме того, когда пользователи из этой страны видят, что вы заблокировали их в частности, это только побудит их заставить вас Больше проблемы.

Тем не менее, если вы действительно хочу сделать это, 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

Как исправить ошибку в коде?

Вот так?

Ошибка: Add (2,2) возвращает 0, должно возвращать 4.

Фиксированный код:

int Add(int x, int y)
{
   if (x == 2 && y == 2)
      { return 4; }
   return 0;
}

Очевидно нет. Вы не просто создаете уродливое чудовище из особых случаев, это чрезвычайно хрупко и является рецептом катастрофы. Вы также не просто лечите СЕГОДНЯ симптом основной проблемы.

Вместо этого выясните основную причину и исправьте ее. Это намного надежнее, чем любой хитрый патч для особых случаев, который вы могли бы реализовать.

Почему ваше веб-приложение уязвимо для спама? Какие характеристики делают его уязвимым? Какие характеристики делают его ценной целью? Есть ли способы изменить эти характеристики, чтобы сделать ваше приложение более устойчивым к спаму и менее заманчивой целью? Почти наверняка ответ на эти вопросы - да. Добавьте цепочки проверки в свои формы, разумно используйте капчу, рандомизируйте URL-адреса и / или имена параметров, чтобы сделать их недружелюбными для ботов. Есть миллионы способов решения этой проблемы. Мне жаль, но вы выбрали одно из наименее ценных, наименее полезных и наиболее хрупких решений.

Вы должны использовать такие продукты, как fail2ban, для устранения ошибок, которые вы создаете в своем веб-приложении, указывающих на попытку рассылки спама. Это заблокирует IP на определенный период времени, что сделает ваш сайт устойчивым, но не заблокирует целые блоки IP.

Пара решений:

  • исключить некоторые IP-адреса в конфигурации Apache с помощью mod_access
  • используйте GeoIp прямо из Apache: http://www.maxmind.com/app/mod_geoip
  • Исключить некоторые IP-адреса из Linux iptables прямо. Это более рискованно, если у вас есть только удаленный доступ, вы можете заблокировать себя вне машины.
  • geoip + iptables

Эти решения довольно легко и быстро внедрить, и они бесплатны.

Более долгосрочным решением было бы обнаружение спама из вашего веб-приложения, регистрация IP-адреса и загрузка ваших iptables для их автоматической блокировки.

Вы думали о том, чтобы выяснить, кто управляет сетями, из которых на вас нападают? Найдите контакт со "злоупотреблением" с помощью whois и сообщите ему. Конечно, оно может поступать из нескольких сетей, но оно того стоит, если вы видите повторяющиеся адреса / сетевые блоки.

У тебя есть каждый право блокировать IP-адреса по любой причине, которую вы можете оправдать. Именно вы предоставляете услугу, и именно вы решаете, кому она может быть предоставлена. Возможно, это сомнительно, если это морально, но это то, что вы можете решить только для себя.

Однако блокировка IP-сегмента из-за того, что он имеет некоторые географические аспекты, для меня звучит более или менее похоже на панический подход.

То, что я делал в прошлом, - это поисковый робот, просматривающий мои последние журналы и основанный на этом запрете отдельных IP-адресов, которые раздражают в течение 24 часов. Если этот конкретный IP-адрес снова работает неправильно, он будет заблокирован на 2 дня, затем на 3 дня и т. Д. И т. Д., Вы получите дрейф.

IP-адреса, которые забанены более чем на неделю, будут отправлены мне по почте, и я отправлю сообщение о нарушении этому поставщику услуг (который знает, что это может даже помочь).

Я бы выбрал решение Snort + OSSEC, которое могло бы поддерживать что-то подобное динамически.