Русский (Russian)

Блокировка исходящего трафика в частные сети через UFW

2 min
VPS/VDS-хостинг

Когда взломанный скрипт или неверно настроенное приложение начинает опрашивать адреса 10.x или 192.168.x, трафик уходит с вашего сервера и нередко вызывает жалобы на злоупотребления со стороны сети. Блокировка исходящих соединений в частные диапазоны — простая мера защиты для любого VPS Linux Infrawire. В этом руководстве показано, как сделать это через UFW, не сломав DNS и собственную связь.

📋 Требования

  • VPS с SSH-доступом root под Ubuntu 24.04 или Debian 12 (UFW доступен в обоих).
  • Базовое знание UFW. Если он ещё не установлен:
Bash
sudo apt update && sudo apt install -y ufw
  • Вторая SSH-сессия, оставленная открытой на время изменения брандмауэра.

🧭 Какие диапазоны блокировать

ДиапазонНазначение
10.0.0.0/8Частный RFC1918
172.16.0.0/12Частный RFC1918
192.168.0.0/16Частный RFC1918
100.64.0.0/10NAT операторского уровня (RFC6598)
169.254.0.0/16Link-local IPv4
192.0.0.0/24Назначения протоколов IETF
198.18.0.0/15Тестирование производительности
fc00::/7Уникальные локальные адреса IPv6

Не блокируйте fe80::/10: IPv6 использует link-local адреса для обнаружения соседей и часто для шлюза по умолчанию, так что их блокировка полностью отключает IPv6.

🔍 Сначала узнайте, что действительно нужно вашему VPS

Если шлюз или DNS-резолвер находится в частном диапазоне, общая блокировка оборвёт сеть. Прежде чем добавлять правила, изучите конфигурацию:

Bash
ip route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'

Если резолвер или нужная вам служба имеет частный адрес (PRIVATE_DNS_IP), явно разрешите его и поставьте это правило первым, как показано ниже. Если всё, чем вы пользуетесь, публично, этот шаг можно пропустить.

🧱 Способ 1: ufw deny out

Убедитесь, что SSH остаётся доступным, и задайте политики по умолчанию. Входящие ответы на ваши SSH-сессии не затрагиваются исходящими правилами для частных диапазонов.

Bash
sudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing

Если нужно исключение, вставьте его в позицию 1, чтобы оно проверялось раньше запретов:

Bash
sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53

Теперь добавьте запреты, по одному на диапазон (UFW проверяет правила по порядку, срабатывает первое совпадение):

Bash
sudo ufw deny out to 10.0.0.0/8 sudo ufw deny out to 172.16.0.0/12 sudo ufw deny out to 192.168.0.0/16 sudo ufw deny out to 100.64.0.0/10 sudo ufw deny out to 169.254.0.0/16 sudo ufw deny out to 192.0.0.0/24 sudo ufw deny out to 198.18.0.0/15 sudo ufw deny out to fc00::/7 sudo ufw enable

ufw enable может предупредить, что способен прервать SSH-соединения; поскольку порт 22 разрешён, ответьте y. Проверьте порядок правил:

Bash
sudo ufw status numbered

📄 Способ 2: before.rules

Если вы предпочитаете один блок правил, применяемый до пользовательских, отредактируйте /etc/ufw/before.rules. Сначала сделайте резервную копию:

Bash
sudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules

В секции *filter, после строк, разрешающих loopback и уже установленные соединения, добавьте:

TEXT
1# Блокировка исходящего трафика в частные сети 2-A ufw-before-output -d 10.0.0.0/8 -j REJECT 3-A ufw-before-output -d 172.16.0.0/12 -j REJECT 4-A ufw-before-output -d 192.168.0.0/16 -j REJECT 5-A ufw-before-output -d 100.64.0.0/10 -j REJECT 6-A ufw-before-output -d 169.254.0.0/16 -j REJECT

У IPv6 свой файл, /etc/ufw/before6.rules, с цепочкой ufw-before-output:

TEXT
-A ufw-before-output -d fc00::/7 -j REJECT

Исключение для PRIVATE_DNS_IP поставьте прямо над этими строками: -A ufw-before-output -d PRIVATE_DNS_IP -j ACCEPT. Перезагрузите правила:

Bash
sudo ufw reload

REJECT сразу отвечает ошибкой, поэтому приложения падают быстро и не ждут таймаута. Если предпочитаете тишину, используйте -j DROP.

✅ Проверка

Правила должны быть загружены, заблокированные адреса должны быть недоступны, а публичные продолжать работать:

Bash
sudo ufw status verbose ping -c 1 10.0.0.1 # должен завершиться ошибкой ping -c 1 192.168.1.1 # должен завершиться ошибкой curl -m 5 http://10.0.0.1 # должен завершиться ошибкой ping -c 2 1.1.1.1 # должен пройти dig +short example.com # должен разрешиться curl -I https://www.debian.org

При ufw deny out неудачный ping обычно сообщает Operation not permitted. Счётчики пакетов подтверждают срабатывания:

Bash
sudo iptables -L ufw-user-output -n -v sudo iptables -L ufw-before-output -n -v

🛠️ Устранение неполадок

DNS перестал работать. Ваш резолвер находится в частном диапазоне. Поправьте порядок через sudo ufw status numbered, затем добавьте sudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53. Можно также перейти на публичный резолвер в сетевой конфигурации.

После изменения не работает IPv6. Вероятно, вы заблокировали fe80::/10 или шлюз внутри fc00::/7. Удалите правило командой sudo ufw delete deny out to fc00::/7 и добавьте заново только необходимое.

Пропал доступ к службе в частной сети (VPN, внутренний API). Добавьте разрешающее правило для этого точного адреса: ufw insert 1 allow out to PRIVATE_IP. Если вы потеряли сам SSH, воспользуйтесь любым консольным доступом к серверу и выполните sudo ufw disable.


🔒 Ваш VPS больше не сможет случайно сканировать частные сети: жалобы на злоупотребления такого рода должны прекратиться.

Следите за последними предложениями, скидками и специальными акциями.

Смотреть акции

Мы используем файлы cookie

Аналитические cookie улучшают работу сайта. Данные не продаются третьим лицам. Подробнее в политике конфиденциальности.