Как стать автором
Обновить

Комментарии 18

А зачем нужно блокировать целые страны? Я вот постоянно от этого страдаю, т.к. живу в другой стране и некоторые российские ресурсы мне недоступны. Приходится из-за них специальный VPN с российским IP держать. Но может быть, я чего-то не понимаю и есть веские причины для таких блокировок.
Поверьте, есть веские причины для этого. Представьте, что у вас есть небольшой интернет-магазинчик с целевой аудиторией только на Россию и страны СНГ. Все заказы за всю историю поступали только оттуда. Ваш сервер ежедневно подвергается брутфорс-атакам, к примеру, из Китая и Африки. Решение простое — заблокировать все IP-адреса из этих стран и дропать этот трафик. Оно не идеально, но весьма хорошо работает.
Почему бы не блокировать тех, кто участвовал в атаке?
А зачем, если можно одной командой заблокировать целую страну и пускай себе пытаются атаковать дальше? Да и сервер не будет тратить ресурсы на блокировку по отдельности.
у меня есть небольшой сайтик на wordpress (не то, чтобы там был нужен именно вордпресс, основной функционал на него не завязан). Так вот, периодически, волнами, набегают боты, которые начинают регистрироваться на сайте, причем процесс регистрации они даже не завершают, т.е. не проходят по ссылке подтверждения из письма. Если их не банить, то за день легко можно получить +5 тыс учеток. Некоторые — особо талантливые — делают по несколько учеток в минуту.
Зачем? Я до сих пор не знаю. Банить их по ip — бесполезно, т.к. прибегают с других ip из того же датацентра. После бана пары сотен ip процесс на некоторое время приостанавливается (но не заканчивается — всегда есть ЕЩЕ новые ип, откуда будет хотя бы одна новая регистрация в час/день). Спустя неделю-две они закупают новые ip в этих же датацентрах и процесс начинается по-новой.
Ботов легко видно по логам — это ящики на yahoo, всяких странных сайтах.

Поэтому да, если у вас целевая аудитория — определенная страна, то в итоге проще тупо забанить всё остальное

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

Причин может быть много. Например у меня есть сайт на котором размещены материалы признанные запрещенными для чтения жителями РФ, а потому то что является по GeoIP адресами из РФ я туда просто не пускаю. Если жители РФ поддерживают власть осуществляющую цензуру, то это их право и я его уважаю.


А еще есть сайты предлагающие услуги жителям нескольких городов только в РФ, только по ним работают сотрудники фирмы чей сайт. И там я спокойно запрещаю все адреса из Юго-Восточной Азии, Африки и Южной Америки(а это регионы с чьих адресов очень часто долбятся ботнеты), а Европу и США не запрещаю, что бы не мешать поисковикам(лень мне чисто подсети поисковиков отдельно разрешать).


И это были самые простые примеры, а бывают и более сложные случаи.

Но есть вариант проще и менее напряжный для сервиса, чем сование в IPTables стран.
Никакие лицензии на файлы не нужны, берем файлы по странам http://www.ipdeny.com/ipblocks/data/countries/ тут и засовываем их в ipset. Скрипт дать или сами написать сможете?

403 Forbidden
$COUNTRY
http://www.ipdeny.com/ipblocks/data/countries/$COUNTRY.zone

Для скачки
То есть cn.zone, ru.zone и так далее

Как по мне, iptables + ipset для этого, куда лучший вариант, в помощь github.com/chr0mag/geoipsets

Вариант в один скрипт
Требует наличия только iptables, ipset и wget, не требует никаких ключей к геобазам


#!/usr/bin/env bash
# Description:  Uses IPSET and IPTABLES to block full countries from accessing the server for all ports and protocols
# Syntax:       countries_block.bash countrycode [countrycode] ......
#               Use the standard locale country codes to get the proper IP list. eg.
#               countries_block.bash cn ru ro
#               Will create tables that block all requests from China, Russia and Romania
# Note:         To get a sorted list of the inserted IPSet IPs for example China list(cn) run the command:
#               ipset list cn | sort -n -t . -k 1,1 -k 2,2 -k 3,3 -k 4,4
# #############################################################################
# Defining some defaults
iptables="/sbin/iptables"
tempdir="/tmp"
sourceURL="http://www.ipdeny.com/ipblocks/data/countries/"
#
# Verifying that the program 'ipset' is installed
if ! (dpkg -l | grep '^ii  ipset' &>/dev/null); then
    echo "ERROR: 'ipset' package is not installed and required."
    echo "Please install it with the command 'apt-get install ipset' and start this script again"
    exit 1
fi
[ -e /sbin/ipset ] && ipset="/sbin/ipset" || ipset="/usr/sbin/ipset"
#
# Verifying the number of arguments
if [ $# -lt 1 ]; then
    echo "ERROR: wrong number of arguments. Must be at least one."
    echo "countries_block.bash countrycode [countrycode] ......"
    echo "Use the standard locale country codes to get the proper IP list. eg."
    echo "countries_block.bash cn ru ro"
    exit 2
fi
#
# Now load the rules for blocking each given countries and insert them into IPSet tables
for country; do
    # Read each line of the list and create the IPSet rules
    # Making sure only the valid country codes and lists are loaded
    if wget -q -P $tempdir ${sourceURL}${country}.zone; then
        # Destroy the IPSet list if it exists
        $ipset flush $country &>/dev/null
        # Create the IPSet list name
        echo "Creating and filling the IPSet country list: $country"
        $ipset create $country hash:net &>/dev/null
        (for IP in $(cat $tempdir/${country}.zone); do
            # Create the IPSet rule from each IP in the list
            echo -n "$ipset add $country $IP --exist - "
            $ipset add $country $IP -exist && echo "OK" || echo "FAILED"
        done) >$tempdir/IPSet-rules.${country}.txt
        # Destroy the already existing rule if it exists and insert the new one
        $iptables -D INPUT -p tcp -m set --match-set $country src -j DROP &>/dev/null
        $iptables -I INPUT -p tcp -m set --match-set $country src -j DROP
        # Delete the temporary downloaded counties IP lists
        rm $tempdir/${country}.zone
    else
        echo "Argument $country is invalid or not available as country IP list. Skipping"
    fi
done
# Display the result of the iptables rules in INPUT chain
echo "======================================"
echo "IPSet lists registered in iptables:"
$iptables -L INPUT -n -v | grep 'match-set'
# Dispaly the number of IP ranges entered in the IPset lists
echo "--------------------------------------"
for country; do
    echo "Number of ip ranges entered in IPset list '$country' : $($ipset list $country | wc -l)"
done
echo "======================================"
#
#eof
Ну вот, еще лучше вариант. Спасибо, кстати. Хоть в провайдинге и не работаю, но может пригодиться.

Я, просто к тому, что вариант автора, выглядит, простите, черезжопный. С кучей make из сорцов и тп. Напоминает шутку про то, что слакварист из любой системы сделает слакварью

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

Годно! Переделал с объединением зон в один список и одним правилом.
INPUT -p tcp -m set ! --match-set permitted_ip src -j DROP

make install
зачем вы даёте читателю вредные советы?
для Debian/Ubintu есть checkinstall и куча других способов сделать «так же, но правильно»
Бан по странам (или разрешение конкретной страны/стран) не всегда помогает, всегда найдется несколько подсетей — откуда будут ломится и их надо отсекать.
Есть еще один способ, правда аппаратный (не страшно дорогой) между своим своими серверами и нетом поставить маршрутизатор Vigor2926 (например) с примерно таким набором правил:
— разрешить доступ с определенных IP адресов
— запретить доступ с определенных IP диапазонов адресов
— разрешить доступ для группы стран
— запретить все
примерно так…
Зарегистрируйтесь на Хабре, чтобы оставить комментарий