Задача: Закрыть сайт для посетителей не из России.

Только не понятно, зачем такую задачу формировать если, по моему мнению, если есть интернет магазин, то он должен быть доступен всем дабы через него могли на продукцию фирмы выйти и стать клиентами компании. Но нашим 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 Browser и через Германию зашел, а через Россию с офисного, домашнего интернет провайдера блок.

Шаг №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.