В некоторых случаях требуется ограничить доступ к серверу из определённых стран — например, для снижения нагрузки от сканеров, ботов или атак из конкретных регионов. Стандартный фаервол UFW не поддерживает блокировку по странам «из коробки», но в связке с утилитой ipset эта задача решается эффективно и производительно.
В этой статье мы настроим автоматическую блокировку трафика из выбранных стран с использованием:
- ipset — для хранения и быстрой проверки IP-подсетей;
- UFW — для управления правилами фаервола;
- before.rules — для применения правил до основной обработки трафика.
Нам понадобятся утилиты для работы с ipset и скачивания списков подсетей.
apt update
apt install -y ipset curl
Создадим скрипт, который скачает актуальные подсети для указанных стран и занесёт их в список blocked_countries.
/opt/scripts/update-geo-block.sh:nano /opt/scripts/update-geo-block.sh
#!/bin/bash
# /opt/scripts/update-geo-block.sh
set -e
# Список стран (ISO коды)
COUNTRIES=("CN" "VN" "BR" "SG" "IN" "US" "AR" "BD" "IR" "IQ" "ID" "PK" "VE" "MX" "CL" "EC" "CO" "ZA" "KE" "MA" "JO" "ET" "UZ")
IPSET_NAME="blocked_countries"
ZONE_DIR="/var/lib/ipset-country"
# Создаем директорию
mkdir -p "$ZONE_DIR"
# 1. Очищаем старый список (если есть)
ipset destroy "$IPSET_NAME" 2>/dev/null || true
# 2. Создаем новый хеш-сет
# maxelem увеличен, так как подсетей много
ipset create "$IPSET_NAME" hash:net maxelem 2000000
# 3. Скачиваем и добавляем подсети
for CC in "${COUNTRIES[@]}"; do
echo "Загрузка подсетей для: $CC"
# Скачиваем зону (ссылка на ipdeny.com)
curl -s "https://www.ipdeny.com/ipblocks/data/countries/${CC,,}.zone" -o "$ZONE_DIR/${CC,,}.zone"
# Читаем файл и добавляем в ipset
while IFS= read -r subnet; do
[[ -z "$subnet" || "$subnet" =~ ^# ]] && continue
ipset add "$IPSET_NAME" "$subnet" 2>/dev/null || true
done < "$ZONE_DIR/${CC,,}.zone"
done
echo "Готово. Загружено элементов: $(ipset list "$IPSET_NAME" | grep 'Number of entries' | awk '{print $4}')"
chmod +x /opt/scripts/update-geo-block.sh
Теперь нужно сказать UFW, что весь трафик из этого списка нужно блокировать.
before.rules:nano /etc/ufw/before.rules
<em>filter (она в начале файла). Сразу после неё (но до правил </em>nat или COMMIT) добавьте следующие строки:# --- GEO-BLOCK START ---
# Проверка на наличие ipset перед применением правил
-A ufw-before-input -m set --match-set blocked_countries src -j DROP
-A ufw-before-forward -m set --match-set blocked_countries src -j DROP
# --- GEO-BLOCK END ---
Важно: Мы используем цепочки
ufw-before-inputиufw-before-forward, так как они обрабатываются UFW до проверки основных правил разрешений.
После перезагрузки сервера список ipset очистится, если его не восстановить. Нужно создать службу systemd.
nano /etc/systemd/system/ipset-restore.service
[Unit]
Description=Restore ipset blocked countries
Before=ufw.service
Wants=ufw.service
[Service]
Type=oneshot
ExecStart=/opt/scripts/update-geo-block.sh
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable ipset-restore.service
Теперь нужно один раз запустить скрипт вручную, чтобы наполнить базу, и перезагрузить фаервол.
# 1. Запускаем скрипт наполнения
/opt/scripts/update-geo-block.sh
# 2. Проверяем, что список наполнен
ipset list blocked_countries | head -10
# 3. Перезагружаем UFW, чтобы применились правила before.rules
ufw disable && ufw enable
# 4. Проверяем статус
ufw status verbose
Перед тем как считать задачу выполненной, убедитесь, что вы не заблокировали себя.
Если вы находитесь в одной из заблокированных стран (или ваш провайдер выдает IP из этих стран, включая некоторые VPN), вы потеряете доступ к SSH.
Узнайте свой внешний IP:
curl ifconfig.me
Проверьте, есть ли он в списке заблокированных:
# Замените 1.2.3.4 на ваш IP
ipset test blocked_countries 1.2.3.4
<strong>Not</strong> in set — всё отлично, доступ есть.<strong>Is</strong> in set — ВНИМАНИЕ! Ваш IP попал в блокировку.Если ваш IP попадает под блокировку, добавьте его в исключение перед правилом блокировки в /etc/ufw/before.rules:
-A ufw-before-input -s ВАШ_IP -j ACCEPT
Пример:
# --- GEO-BLOCK START ---
-A ufw-before-input -s 203.0.113.45 -j ACCEPT
-A ufw-before-input -m set --match-set blocked_countries src -j DROP
-A ufw-before-forward -m set --match-set blocked_countries src -j DROP
# --- GEO-BLOCK END ---
Попробуйте зайти на сервер с устройства/сети, которая находится в заблокированной стране. Соединение должно сбрасываться.
Ожидаемый результат:
- Правильно: Connection timed out (пакеты дропаются)
- Неправильно: Connection refused (фаервол пропустил пакет, но служба не ответила)
- Неправильно: Подключение успешно (блокировка не работает)
IP-адреса стран меняются. Рекомендуется обновлять списки раз в неделю.
crontab -e
0 3 * * 0 /opt/scripts/update-geo-block.sh > /var/log/geo-block-update.log 2>&1
Если что-то пошло не так и нужно срочно снять блокировку:
# 1. Удалить правила из before.rules (отредактировать файл вручную)
nano /etc/ufw/before.rules
# (удалите строки между GEO-BLOCK START/END)
# 2. Перезагрузить UFW
ufw reload
# 3. Удалить ipset
ipset destroy blocked_countries
# 4. Отключить службу автозагрузки
systemctl disable ipset-restore.service
По умолчанию UFW не пишет логи для каждого отброшенного пакета. Для отладки можно включить логирование:
# Включить логирование блокировок
ufw logging on
ufw log-level medium
# Смотреть логи в реальном времени
tail -f /var/log/ufw.log
Важно: После проверки рекомендуется вернуть уровень логирования в
low, чтобы не исчерпать место на диске:ufw log-level low
| Проверка | Ожидаемый результат |
|---|---|
ipset list |
>10 000 записей |
ufw status |
Status: active |
| Тест из (запрещенная страна) | Connection timed out |
| Тест из (разрешенная страна) | Connection OK |
ipset test (ваш IP) |
Not in set |
Что такое IT-GIT?
«IT» — это не просто технологии, а целый мир инноваций и решений, направленных на преодоление сложностей. Мы представляем экспертность в области информационных технологий и широкой технологической экосистемы, стремясь к постоянному развитию и совершенствованию.
«Git» — это отсылка к одной из самых популярных систем контроля версий, которая обеспечивает эффективное сотрудничество, быструю итерацию и надежное управление сложными проектами. Мы стремимся объединить и поделиться опытом и идеями специалистов в сфере технологий, создавая пространство для обмена знаниями.
Инновационные технологии + совместный опыт экспертов в области технологий = путь к успеху!