Задача: Закрыть сайт для посетителей не из России.
Только не понятно, зачем такую задачу формировать если, по моему мнению, если есть интернет магазин, то он должен быть доступен всем дабы через него могли на продукцию фирмы выйти и стать клиентами компании. Но нашим Web-разработчикам и маркетологам виднее, может они нацеливаются только на конкретные страны. Ну да ладно, для меня это интересная задача:
Сивков Владимир (09:01:17 10/03/2021)
привет! вопрос: мы можешь закрыть сайт shop.ekzorchik.ru для посетителей не из России и стран СНГ?
qip (09:01:53 10/03/2021)
надо подумать интересная задача, вроде читал об этом
Сивков Владимир (09:05:40 10/03/2021)
подумай, только, пожалуйста, не затягивай
Ниже действия, которые я сперва на своем тестовом полигоне базирующемуся на связке Debian 10 + Proxmox 6
применительно для виртуальной машины Ubuntu 18.04 Server
обкатал дабы после перенести их на боевой сервер где размещен сайт интернет магазина компании где я сейчас работаю.
Шаг №1:
Подготавливаю систему Ubuntu 18.04 Server
к последующему использованию:
ekzorchik@srv-bionic:~$ sudo visudo ekzorchik ALL=(ALL) NOPASSWD:ALL ekzorchik@srv-bionic:~$ sudo rm -Rf /var/lib/apt/lists ekzorchik@srv-bionic:~$ sudo apt-get update && sudo apt-get -y upgrade
Шаг №2:
Устанавливаю Web
—сервис и модуль GeoIP:
ekzorchik@srv-bionic:~$ sudo tasksel install lamp-server ekzorchik@srv-bionic:~$ sudo apt-get install libapache2-mod-geoip ekzorchik@srv-bionic:~$ ls /usr/share/GeoIP/ GeoIP.dat GeoIPv6.dat
Шаг №3:
Скрипт получения самого последнего: GeoIP.dat
ekzorchik@srv-bionic:~$ wget http://launchpadlibrarian.net/266153711/geoip-database-contrib_1.19_all.deb ekzorchik@srv-bionic:~$ sudo dpkg -i geoip-database-contrib_1.19_all.deb
вот только все ссылки ведущие на архивы *.dat.gz
более никуда не ведут
ekzorchik@srv-bionic:~$ sudo geoip-database-contrib_update Downloading: http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz Failed to download http://geolite.maxmind.com/download/geoip/database/GeoLiteCountry/GeoIP.dat.gz Downloading: http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz Failed to download http://geolite.maxmind.com/download/geoip/database/GeoIPv6.dat.gz Downloading: http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz Failed to download http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz Downloading: http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz Failed to download http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz Downloading: http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz Failed to download http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNum.dat.gz Downloading: http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNumv6.dat.gz Failed to download http://geolite.maxmind.com/download/geoip/database/asnum/GeoIPASNumv6.dat.gz
Разработчик все закрыл и сделал все на базе подписки.
Тогда оставим все как есть, а нет в процессе поиска информации как же получать обновления вышел на репозитарий:
ekzorchik@srv-bionic:~$ sudo add-apt-repository ppa:maxmind/ppa ekzorchik@srv-bionic:~$ apt-cache search geoipupdate geoipupdate - Tool for updating GeoIP and GeoLite databases ekzorchik@srv-bionic:~$ sudo apt-get install geoipupdate
тоже самое что и выше, пытается по таким же путям скачать, но не удачно.
Шаг №4:
Проверяю работу модуля GeoIP
на предмет работы.
ekzorchik@srv-bionic:~$ sudo apache2ctl -M | grep -E "geoip|rewrite" geoip_module (shared) rewrite_module (shared) ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo mkdir /var/www/html/test ekzorchik@srv-bionic:~$ cat /var/www/html/test/geoiptest.php <html> <body> <?php $country_name = apache_note("GEOIP_COUNTRY_NAME"); print "Country: " . $country_name; ?> </body> </html> ekzorchik@srv-bionic:~$ ekzorchik@srv-bionic:~$ sudo chown -R www-data:www-data /var/www/html/test/ ekzorchik@srv-bionic:~$ sudo chmod -R 775 /var/www/html/test/ aollo@amigo:~$ sudo nano /etc/apache2/sites-available/test.conf <VirtualHost *:80> ServerName test.ekzorchik.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/test <Directory /var/www/html/test> AllowOverride All </Directory> ErrorLog ${APACHE_LOG_DIR}/test-error.log CustomLog ${APACHE_LOG_DIR}/test-access.log combined <IfModule mod_geoip.c> GeoIPEnable On GeoIPDBFile /usr/share/GeoIP/GeoIP.dat GeoIPScanProxyHeaders On </IfModule> </VirtualHost> ekzorchik@srv-bionic:~$ sudo a2enmod geoip Module geoip already enabled ekzorchik@srv-bionic:~$ sudo systemctl restart apache2
После при обращении к сайту получаю из какой страны я обратился к скрипту: http://IP&DNS/geoiptest.php
(http://test.ekzorchik.ru/geoiptest.php
)
Для проверки использую установленный на компьютер или смартфон Tor Browser.
Шаг №5:
А можно ли закрыть доступ к сайту только из России:
ekzorchik@srv-bionic:~$ cat /etc/apache2/sites-available/test.conf | grep -v "#\|^$" <VirtualHost *:80> ServerName test.ekzorchik.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/test <Directory /var/www/html/test> AllowOverride All </Directory> <Location /> SetEnvIf GEOIP_COUNTRY_CODE RU BlockCountry Deny from env=BlockCountry </Location> ErrorLog ${APACHE_LOG_DIR}/test-error.log CustomLog ${APACHE_LOG_DIR}/test-access.log combined <IfModule mod_geoip.c> GeoIPEnable On GeoIPDBFile /usr/share/GeoIP/GeoIP.dat GeoIPScanProxyHeaders On </IfModule> </VirtualHost> ekzorchik@srv-bionic:~$
поставил на телефон Tor Browse
r и через Германию зашел, а через Россию с офисного, домашнего интернет провайдера блок.
Шаг №6:
Закрыть доступ всем, кроме из России, Белоруссии, Украины, Казахстана:
коды стран берутся на основе ISO 3166 Country Codes
Россия: RU
Украина: UA
Белоруссия: BY
Казахстан: KZ
ekzorchik@srv-bionic:~$ sudo nano /etc/apache2/sites-available/test.conf <VirtualHost *:80> ServerName test.ekzorchik.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/test <Directory /var/www/html/test> AllowOverride All </Directory> <Location /> SetEnvIf GEOIP_COUNTRY_CODE RU AllowCountry SetEnvIF GEOIP_COUNTRY_CODE UA AllowCountry SetEnvIF GEOIP_COUNTRY_CODE BY AllowCountry SetEnvIF GEOIP_COUNTRY_CODE KZ AllowCountry Deny from all Allow from env=AllowCountry </Location> ErrorLog ${APACHE_LOG_DIR}/test-error.log CustomLog ${APACHE_LOG_DIR}/test-access.log combined <IfModule mod_geoip.c> GeoIPEnable On GeoIPDBFile /usr/share/GeoIP/GeoIP.dat GeoIPScanProxyHeaders On </IfModule> </VirtualHost> ekzorchik@srv-bionic:~$
Итого, блокировка на основе блокируем всех кроме явно указанных работает. Задача выполнена и на будущее теперь у меня есть заметка.
Применил данные шаги выше к боевому серверу (Применил к shop.ekzorchik.ru
) (конечно же вместо ekzorchik.ru
подставляется доменное имя компании) и все успешно отрабатывает:
aollo@ekzorchik:~$ sudo nano /etc/apache2/sites-available/shop.conf <VirtualHost *:80> ServerName shop.ekzorchik.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/shop <Directory /var/www/html/shop> AllowOverride All </Directory> ErrorLog ${APACHE_LOG_DIR}/shop-error.log CustomLog ${APACHE_LOG_DIR}/shop-access.log combined RewriteEngine on RewriteCond %{SERVER_NAME} =shop.ekzorchik.ru RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent] </VirtualHost> aollo@ekzorchik:~$ sudo nano /etc/apache2/sites-available/shop-le-ssl.conf aollo@ekzorchik:~$ cat /etc/apache2/sites-available/shop-le-ssl.conf | grep -v "#\|^$" <IfModule mod_ssl.c> <VirtualHost *:443> ServerName shop.ekzorchik.ru ServerAdmin webmaster@localhost DocumentRoot /var/www/html/shop <Directory /var/www/html/shop> AllowOverride All </Directory> Header set Access-Control-Allow-Origin "*" ErrorLog ${APACHE_LOG_DIR}/shop-error.log CustomLog ${APACHE_LOG_DIR}/shop-access.log combined SSLCertificateFile /etc/letsencrypt/live/shop.ekzorchik.ru/fullchain.pem SSLCertificateKeyFile /etc/letsencrypt/live/shop.ekzorchik.ru/privkey.pem Include /etc/letsencrypt/options-ssl-apache.conf </VirtualHost> </IfModule> aollo@ekzorchik:~$ aollo@ekzorchik:~$ sudo systemctl restart apache2
На этом все, с уважением автор блога Олло Александр aka ekzorchik.