Иногда владельцам сайтов требуется ограничить доступ к ресурсу для пользователей из определённых стран. Например, сайт работает только для клиентов одного региона, необходимо снизить количество подозрительных запросов или ограничить активность иностранных ботов.
В этой статье разберём, как запретить доступ к сайту для иностранных IP-адресов с помощью различных способов: Apache (.htaccess), Nginx, PHP, CMS 1С-Битрикс и серверного firewall.
Зачем ограничивать доступ по IP-адресам
Блокировка иностранных IP может использоваться в следующих случаях:
- сайт предназначен только для пользователей определённой страны;
- уменьшение количества спама и автоматических запросов;
- защита административной панели;
- снижение нагрузки от нежелательных ботов;
- ограничение доступа к тестовым сайтам.
Важно учитывать, что IP-адрес не всегда точно определяет местоположение пользователя. Посетитель может использовать VPN, прокси или мобильную сеть другого региона.
Как определить страну по IP-адресу
Для определения страны используются специальные базы геолокации IP:
- MaxMind GeoIP;
- IP2Location;
- GeoIP2;
- локальные базы IP-адресов.
На практике чаще всего используется база GeoIP2 Country, которая позволяет определить страну пользователя по его IP.
Запрет иностранных IP через файл .htaccess
Если сайт работает на Apache, можно ограничить доступ через файл .htaccess.
Например, разрешить доступ только пользователям из России можно через список IP-сетей:
<RequireAll>
Require all denied
Require ip 5.136.0.0/13
Require ip 31.128.0.0/10
Require ip 37.0.0.0/8
</RequireAll>
Недостаток такого способа заключается в необходимости постоянно обновлять список IP-адресов.
Блокировка иностранных IP через Nginx
Для сайтов на сервере с Nginx рекомендуется использовать модуль GeoIP.
Пример настройки:
http {
geoip_country /usr/share/GeoIP/GeoIP.dat;
map $geoip_country_code $allowed_country {
default 0;
RU 1;
}
}
В конфигурации сайта добавляем:
server {
if ($allowed_country = 0) {
return 403;
}
}
Теперь пользователи из стран, которых нет в списке разрешённых, получат ошибку 403 Forbidden.
Как запретить иностранные IP через PHP
Ограничение можно реализовать на уровне PHP-кода.
Пример проверки страны пользователя:
<?
$ip = $_SERVER['REMOTE_ADDR'];
$country = getCountryByIP($ip);
if ($country != 'RU') {
http_response_code(403);
exit('Access denied');
}
?>
Функция определения страны может обращаться к внешнему API или локальной базе GeoIP.
Блокировка иностранных IP в Bitrix
В 1С-Битрикс можно добавить проверку в файл /bitrix/php_interface/init.php.
Пример:
<?
AddEventHandler(
"main",
"OnPageStart",
"BlockForeignIP"
);
function BlockForeignIP()
{
$allowedCountries = array(
"RU"
);
$ip = $_SERVER['REMOTE_ADDR'];
$country = getCountryByIP($ip);
if (!in_array($country, $allowedCountries))
{
LocalRedirect('/403.php');
}
}
?>
После добавления кода пользователи из других стран будут перенаправляться на страницу ошибки.
Как запретить доступ к админке Bitrix для иностранных IP
Часто требуется ограничить только административную часть сайта.
Например, закрыть раздел /bitrix/admin/:
<Location /bitrix/admin/>
Require ip 1.2.3.4
Require ip 5.6.7.8
</Location>
Такой подход позволяет оставить сайт доступным для всех пользователей, но защитить административную панель.
Блокировка стран через Cloudflare
Если сайт использует Cloudflare, ограничение можно выполнить без изменения сервера.
Настройка выполняется через:
Security → WAF → Custom Rules
Пример правила:
(ip.geoip.country ne "RU")
Действие:
Block
Преимущество Cloudflare заключается в том, что нежелательные запросы блокируются до попадания на сервер.
Запрет иностранных IP через Linux Firewall
На уровне сервера можно использовать firewall.
Например, блокировка IP через iptables:
iptables -A INPUT -s 123.123.123.0/24 -j DROP
Для больших списков IP рекомендуется использовать:
- ipset;
- GeoIP Firewall;
- Fail2Ban.
Как сделать белый список стран
Иногда удобнее не блокировать отдельные страны, а разрешить только нужные.
Пример логики:
$allowed = array(
'RU',
'BY',
'KZ'
);
if (!in_array($country, $allowed)) {
die('Forbidden');
}
Такой вариант подходит для региональных интернет-магазинов и корпоративных сайтов.
Как проверить работу блокировки IP
После настройки необходимо проверить результат:
- использовать VPN другой страны;
- проверить сайт через сервисы проверки IP;
- посмотреть серверные логи;
- проверить код ответа HTTP.
При успешной блокировке сервер должен возвращать:
HTTP 403 Forbidden
Ошибки при блокировке иностранных IP
При настройке ограничений часто возникают следующие проблемы:
- блокируются поисковые роботы Google и Яндекс;
- пользователи с VPN не получают доступ;
- не учитываются мобильные сети;
- не обновляется база IP-адресов;
- блокировка выполняется слишком поздно на уровне PHP.
Как не заблокировать поисковых роботов
Перед включением ограничения рекомендуется добавить исключения для поисковых систем.
Например, разрешить доступ ботам:
if ($userAgent == 'YandexBot') {
return;
}
if ($userAgent == 'Googlebot') {
return;
}
Также можно проверять IP поисковых систем через обратный DNS-запрос.
Заключение
Запрет доступа к сайту для иностранных IP-адресов можно реализовать несколькими способами: через настройки веб-сервера Apache и Nginx, PHP-код, Bitrix, Cloudflare или firewall.
Для большинства сайтов оптимальным решением является блокировка на уровне Cloudflare или Nginx, так как запросы от нежелательных пользователей не будут создавать нагрузку на сайт.
Перед включением ограничений рекомендуется настроить исключения для поисковых систем, сотрудников и постоянных пользователей, чтобы избежать случайной блокировки доступа.
