it-git.ru
  • Windows
  • Linux
  • Виртуализация
  • Скрипты
  • Почта/Домены
  • Сеть и коммутация
  • Программное обеспечение
  • Безопасность
  • 📰

Блокировка стран на уровне фаервола: UFW + ipset

Linux / Скрипты

В некоторых случаях требуется ограничить доступ к серверу из определённых стран — например, для снижения нагрузки от сканеров, ботов или атак из конкретных регионов. Стандартный фаервол UFW не поддерживает блокировку по странам «из коробки», но в связке с утилитой ipset эта задача решается эффективно и производительно.

В этой статье мы настроим автоматическую блокировку трафика из выбранных стран с использованием:

 - ipset — для хранения и быстрой проверки IP-подсетей;

 - UFW — для управления правилами фаервола;

 - before.rules — для применения правил до основной обработки трафика.


Шаг 1. Установка зависимостей

Нам понадобятся утилиты для работы с ipset и скачивания списков подсетей.

apt update
apt install -y ipset curl

Шаг 2. Создание скрипта наполнения ipset

Создадим скрипт, который скачает актуальные подсети для указанных стран и занесёт их в список blocked_countries.

  1. Создайте файл /opt/scripts/update-geo-block.sh:
nano /opt/scripts/update-geo-block.sh
  1. Список стран (ISO коды) можно посмотреть например тут
  2. Вставьте следующий код:
#!/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}')"
  1. Дайте права на выполнение:
chmod +x /opt/scripts/update-geo-block.sh

Шаг 3. Интеграция с UFW

Теперь нужно сказать UFW, что весь трафик из этого списка нужно блокировать.

  1. Отредактируйте файл before.rules:
nano /etc/ufw/before.rules
  1. Найдите строку <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 до проверки основных правил разрешений.

  1. Сохраните файл и выйдите.

Шаг 4. Настройка автозагрузки ipset

После перезагрузки сервера список ipset очистится, если его не восстановить. Нужно создать службу systemd.

  1. Создайте файл службы:
nano /etc/systemd/system/ipset-restore.service
  1. Вставьте содержимое:
[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
  1. Активируйте службу:
systemctl daemon-reload
systemctl enable ipset-restore.service

Шаг 5. Первый запуск и проверка

Теперь нужно один раз запустить скрипт вручную, чтобы наполнить базу, и перезагрузить фаервол.

# 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

КРИТИЧЕСКИ ВАЖНО: Проверка доступа

Перед тем как считать задачу выполненной, убедитесь, что вы не заблокировали себя.

1. Проверьте свой IP

Если вы находитесь в одной из заблокированных стран (или ваш провайдер выдает 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 попал в блокировку.

2. Добавьте исключение для своего 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 ---

3. Проверка работы

Попробуйте зайти на сервер с устройства/сети, которая находится в заблокированной стране. Соединение должно сбрасываться.

Ожидаемый результат:

- Правильно: Connection timed out (пакеты дропаются)

- Неправильно: Connection refused (фаервол пропустил пакет, но служба не ответила)

- Неправильно: Подключение успешно (блокировка не работает)


Обновление списков

IP-адреса стран меняются. Рекомендуется обновлять списки раз в неделю.

  1. Создайте задачу cron:
crontab -e
  1. Добавьте строку (обновление каждую неделю в воскресенье в 03:00):
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



  • 01.04.2026
  • 10
  • 0
Пример работы с автоматически обновляемым списком блокировки (спамеров)
Пример работы с автоматически обновляемым списком блокировки (спамеров)
16-01-2023, 20:23, Linux / Сеть и коммутация / Безопасность
Пакетные менеджеры linux: APT, YUM, DNF, Pacman — обзор базовых функции по управлению пакетами
Пакетные менеджеры linux: APT, YUM, DNF, Pacman — обзор базовых функции по управлению пакетами
22-01-2025, 20:41, Linux
Установка Docker - ProxMox 7 LXC
Установка Docker - ProxMox 7 LXC
19-04-2023, 15:33, Виртуализация
Умная защита от атак MIKROTIK
Умная защита от атак MIKROTIK
30-05-2019, 08:27, Сеть и коммутация / Безопасность
UFW, iptables, geoip, скрипт, блокировка
  • Windows
  • Linux
  • Виртуализация
  • Скрипты
  • Почта/Домены
  • Сеть и коммутация
  • Программное обеспечение
  • Безопасность
  • Active Directory
  • ▒ IT Новости
AD astra backup cmd debian Docker Exchange firewall hp install interface linux LXC Mail mailbox mikrotik network ProxMox PVE raid router RouterOS s3 spamhaus vpn windows ZFS Россия база данных безопасность виртуализация данные диск защита копирование настройка программный райд производительность скрипт файл
Показать все теги

Что такое IT-GIT?

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

«Git» — это отсылка к одной из самых популярных систем контроля версий, которая обеспечивает эффективное сотрудничество, быструю итерацию и надежное управление сложными проектами. Мы стремимся объединить и поделиться опытом и идеями специалистов в сфере технологий, создавая пространство для обмена знаниями.

Инновационные технологии + совместный опыт экспертов в области технологий = путь к успеху!


  • ◆ Полезное
  • ▻ Заметки по докеру
  • ▻ Процесс расширения LVM на примере виртуальной машины
  • ▻ Расширение раздела на HDD/SSD
  • ▻ Ремонт файловой системы linux
  • ▻ Коды символов Юникода в UTF-8
  • ▻ Загрузка CHR RouterOS
  • ▻ #mikrotik
  • ▻ #zfs

  • ★ TOP 20
  • ☆ Шпаргалка по ZFS
  • ☆ Robocopy — описание и примеры использования
  • ☆ Настройка сети через командную строку и BAT файл
  • ☆ Windows 10 сброс пароля администратора
  • ☆ Для чего нужен протокол STP/RSTP на примере Mikrotik
  • ☆ Как подключить сетевой диск всем пользователям с использованием AD
  • ☆ Мигрируем на Exchange с почты для домена (yandex, mail, google и др.)
  • ☆ НP ProCurve. наиболее часто используемые команды консоли.
  • ☆ Сброс пароля Windows 10 с помощью встроенной учетной записи Администратора
  • ☆ Настройка условной пересылки DNS-запросов в Mikrotik RouterOS
  • ☆ Как создать программный RAID 1 массив (зеркало) средствами Windows 10, 8.1, 8, 7, Vista
  • ☆ Не работает fetch в netwatch Mikrotik (ROS 7.13)
  • ☆ Проверить, запущена ли программа
  • ☆ Как создать RAID 1 из уже заполненного диска на Windows 10, 8.1, 8, 7, Vista
  • ☆ Отечественная виртуализация - на чем построена, обзор, сравнение.
  • ☆ Mikrotik, 3 провайдера, переключение и разделение трафик
  • ☆ Mikrotik (vpn server) + Windows server 2008r2 (ad, radius server)
  • ☆ Ремонт файловой системы linux
  • ☆ Сравнение решений WireGuard
  • ☆ Увеличение zfs диска (ISCSI FreeNAS)
Monitorus. Мониторинг сайтов и серверов.
 
  Top.Mail.Ru   © 2019-2026.    www.IT-GIT.ru    ✉ info@it-git.ru
Политика конфиденциальности