Как защитить сервер от посетителей из нежелаемых стран

    Ко мне очень часто поступают довольно интересные и нестандартные задачи по настройке серверов.

    Сегодня например, меня попросили настроить ряд серверов на фильтрацию любого трафика из определенных стран. Причин такой защите есть множество — сокращения спама и атак, выравнивание соотношений, и многого другого.

    В моем случае — надо было заблокировать CN полностью, на RU отдавать полный канал, а на остальные страны — в два раза меньше.

    Разумеется, вбивать полностью все подсети руками неудобно, да и они часто меняются. Логичнее всего было сделать это с помощью geoip.

    Самое эффективное — это конечно прикрутить geoip к ядру. В моем случае на серверах был Debian, по этому и рецепт привожу под него.

    Сначала скачаем исходники

    apt-get install linux-source-2.6.18
    tar xjf /usr/src/linux-source-2.6.18.tar.bz2 -C /usr/src/
    apt-get source iptables
    wget people.netfilter.org/peejix/patchlets/geoip.tar.gz
    wget ftp.netfilter.org/pub/patch-o-matic-ng/snapshot/patch-o-matic-ng-20070414.tar.bz2
    tar xjf patch-o-matic-ng-20070414.tar.bz2
    tar xzf geoip.tar.gz -C patch-o-matic-ng-20070414/patchlets/


    Теперь будем собирать

    cd patch-o-matic-ng-20070407/
    KERNEL_DIR=/usr/src/linux-source-2.6.18/ ./runme geoip


    Говорим «да» и выходим. Самое время поставить все нужное для сборки, если еще не ставили:

    apt-get install build-essential

    Скопировав текущий конфиг ядра, я просто вношу изменения:

    cd /usr/src/linux-source-2.6.18/
    make oldconfig

    geoip match support (IP_NF_MATCH_GEOIP) [N/m/?] (NEW)

    Тут нужно сказать «m» для сборки модуля. Затем:

    make modules_prepare
    cp net/ipv4/netfilter/ipt_geoip.ko /lib/modules/$(uname -r)/kernel/net/ipv4/netfilter/
    depmod
    modprobe ipt_geoip
    echo "ipt_geoip" >> /etc/modules


    Точно так же собираем библиотеку для iptables:

    make KERNEL_DIR=/usr/src/linux-source-2.6.18/ extensions/libipt_geoip.so
    cp extensions/libipt_geoip.so /lib/iptables/


    Самая малость — база GeoIP

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

    wget people.netfilter.org/peejix/geoip/tools/csv2bin-20041103.tar.gz
    tar xzf csv2bin-20041103.tar.gz
    cd csv2bin/
    make


    Ну и собственно конвертируем бесплатный вариант базы:
    wget www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip

    unzip GeoIPCountryCSV.zip
    ./csv2bin ../GeoIPCountryWhois.csv


    Появляются 2 фалйа geoipdb.bin и geoipdb.idx которые надо бросить в /var/geoip:

    mkdir /var/geoip
    mv geoipdb.* /var/geoip/


    После этого можно работать с mod_geoip, например так:

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

    Отбрасываем трафик с CN. А еще можно метить и менять полосу с помощью TC.

    Вариант с приложением: NGINX


    Если у вас не собирается ядро, или вообще VDS, то можно сделать почти все тоже самое, поставив на фронтенд nginx с mod_geoip. Прежде убедитесь, что nginx собран с поддержкой mod_goip. У меня он стоял, у кого нет — придется пересобрать, но это не сложно.

    Саму базу необходимо конвертировать с помощью geo2nginx.pl (лежит в архиве с исходником nginx) и закинуть в конфиг:

    perl geo2nginx.pl < GeoIPCountryWhois.csv > geo.conf
    cp geo.conf /etc/nginx/


    Использовать проще пареной репы:
    geo $country {
    default no;
    include /etc/nginx/geo.conf;
    127.0.0.0/24 ru;
    }
    Пример с CN трафиком:
    if ($country ~* cn )
    {
    rewrite ^(.*)$ baidu.com/;
    }


    Как всегда у быстрого решения всегда найдется минус — в этом случае в виде паузы перед запуском nginx, так как база читается в память.
    Ads
    AdBlock has stolen the banner, but banners are not teeth — they will be back

    More

    Comments 30

      0
      зачем дискриминация? пусть заходят откуда хотят…
        +1
        Часто дос атака начинается из определенного региона (часто из китая) и таким методом легко прикрыть лазейку
        • UFO just landed and posted this here
            +1
            Таки да, но просто китайский трафик не представляет в данном случае интереса — просто заходят, грабят картинки, ничего не покупают.
              0
              В этом случае и ногда помогают SYN-куки
              echo "1" > /proc/sys/net/ipv4/tcp_syncookies
                0
                А это спуфленным пакетам никчему, они ACK не шлют, их цель — забить сокеты и загрузить серер генерацией кукисов
          +5
          из ненужных стран

          Ну это вы сильно сказали
          +1
          Из каких это таких ненужных стран а? выкладывайте, напрямую
            0
            Страны, в которых социум не склонен к покупкам через сайты в силу ряда причин
            +1
            Ну в Украине можна попросить датацентр отключить Вам «мир». Правда UTC-X отвалится.
              +1
              Да, в Украине очень много проблем можно избежать настроив все подобным образом!
                0
                А как к FreeBSD прикрутить?
                  0
                  Поставить nginx из портов и далее по инструкции
                    0
                    Под nginx понятно, но меня интересует именно поддержка в ядре и запрет через pf, тогда можно закрыть vpn, ftp корпоративные, которые нужны только из России (или разрешить только российские ip).
                  0
                  Сдается мне что то же самое делали на одном из популярных западных ресурсов. Что с ними стало теперь — известно )
                    0
                    Мы оба продумали про Демоноид? :)
                      0
                      Ох, не только мы )
                      +3
                      Одно дело — сайты и трекеры, другое — гео-ориентированные проекты (соц. сети, магазины, сервисы и т.д.).

                      Согласитесь, шанс, что кто-то из Китая или Малайзии купит товар в интернет-магазин с доставкой по г. Пермь довольно мал. А вот негативная активность (сканы портов, брутфорс ssh, ddos, сграбливание контента) идет в основном оттуда.
                        0
                        Конечно я согласен. Дела у магазинов и теркеров разные, но технология отлупа (сабж!) — общая.

                        Еще могу заметить, что не очень понимаю, зачем в китае контент магазина с доставкой по Перми, но в остальном — уверенное да.
                      0
                      >KERNEL_DIR=/usr/src/linux-source-2.6.18/ ./runme geoip
                      а вы не пропустили IPTABLES_DIR?
                        0
                        Для варианта с nginx более точная база (Nginx-CIDR вариант), чем даже платный максминд

                          0
                          У меня немного другой скрипт. Разрешить доступ с определенных ip-адресов:
                          /sbin/iptables -P INPUT REJECT

                          /sbin/iptables -N allow_web_ip
                          /sbin/iptables -F allow_web_ip
                          /sbin/iptables -A INPUT -i eth0 -p tcp -m multiport --dports 80,443 -j allow_web_ip

                          for IP1 in `/bin/cat /etc/iptables/clients.txt`
                          do
                          /sbin/iptables -A allow_web_ip -s $IP1 -j ACCEPT
                          done
                          for IP2 in `/bin/cat /etc/iptables/local.txt`
                          do
                          /sbin/iptables -A allow_web_ip -s $IP2 -j ACCEPT
                          done
                          for IP3 in `/bin/cat /etc/iptables/peering.txt`
                          do
                          /sbin/iptables -A allow_web_ip -s $IP3 -j ACCEPT
                          done
                          for IP4 in `/bin/cat /etc/iptables/rbnotinpeering.txt`
                          do
                          /sbin/iptables -A allow_web_ip -s $IP4 -j ACCEPT
                          done
                          ...
                            0
                            Нормальные люди всякий левый траф не рубят, а редиректят на софт =)
                              +1
                              для варианта с nginx можно воспользоваться и бинарной базой (0.8.6+) — sysoev.ru/nginx/docs/http/ngx_http_geoip_module.html.
                                0
                                Никто не сталкивался?

                                zrouter:~/patch-o-matic-ng-20091024# KERNEL_DIR=/usr/src/linux-source-2.6.26 IPTABLES_DIR=/usr/src/iptables-1.4.2/ ./runme geoip
                                /usr/src/iptables-1.4.2/ doesn't look like a iptables source code directory to me.
                                0

                                Only users with full accounts can post comments. Log in, please.