Когда взломанный скрипт или неверно настроенное приложение начинает опрашивать адреса 10.x или 192.168.x, трафик уходит с вашего сервера и нередко вызывает жалобы на злоупотребления со стороны сети. Блокировка исходящих соединений в частные диапазоны — простая мера защиты для любого VPS Linux Infrawire. В этом руководстве показано, как сделать это через UFW, не сломав DNS и собственную связь.
📋 Требования
- VPS с SSH-доступом root под Ubuntu 24.04 или Debian 12 (UFW доступен в обоих).
- Базовое знание UFW. Если он ещё не установлен:
Bashsudo 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/10 | NAT операторского уровня (RFC6598) |
169.254.0.0/16 | Link-local IPv4 |
192.0.0.0/24 | Назначения протоколов IETF |
198.18.0.0/15 | Тестирование производительности |
fc00::/7 | Уникальные локальные адреса IPv6 |
Не блокируйте fe80::/10: IPv6 использует link-local адреса для обнаружения соседей и часто для шлюза по умолчанию, так что их блокировка полностью отключает IPv6.
🔍 Сначала узнайте, что действительно нужно вашему VPS
Если шлюз или DNS-резолвер находится в частном диапазоне, общая блокировка оборвёт сеть. Прежде чем добавлять правила, изучите конфигурацию:
Baship route ip -6 route cat /etc/resolv.conf resolvectl status | grep -E 'DNS Servers|Link'
Если резолвер или нужная вам служба имеет частный адрес (PRIVATE_DNS_IP), явно разрешите его и поставьте это правило первым, как показано ниже. Если всё, чем вы пользуетесь, публично, этот шаг можно пропустить.
🧱 Способ 1: ufw deny out
Убедитесь, что SSH остаётся доступным, и задайте политики по умолчанию. Входящие ответы на ваши SSH-сессии не затрагиваются исходящими правилами для частных диапазонов.
Bashsudo ufw allow 22/tcp sudo ufw default deny incoming sudo ufw default allow outgoing
Если нужно исключение, вставьте его в позицию 1, чтобы оно проверялось раньше запретов:
Bashsudo ufw insert 1 allow out to PRIVATE_DNS_IP port 53
Теперь добавьте запреты, по одному на диапазон (UFW проверяет правила по порядку, срабатывает первое совпадение):
Bashsudo 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. Проверьте порядок правил:
Bashsudo ufw status numbered
📄 Способ 2: before.rules
Если вы предпочитаете один блок правил, применяемый до пользовательских, отредактируйте /etc/ufw/before.rules. Сначала сделайте резервную копию:
Bashsudo cp /etc/ufw/before.rules /etc/ufw/before.rules.bak sudo nano /etc/ufw/before.rules
В секции *filter, после строк, разрешающих loopback и уже установленные соединения, добавьте:
TEXT1# Блокировка исходящего трафика в частные сети 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. Перезагрузите правила:
Bashsudo ufw reload
REJECT сразу отвечает ошибкой, поэтому приложения падают быстро и не ждут таймаута. Если предпочитаете тишину, используйте -j DROP.
✅ Проверка
Правила должны быть загружены, заблокированные адреса должны быть недоступны, а публичные продолжать работать:
Bashsudo 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. Счётчики пакетов подтверждают срабатывания:
Bashsudo 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 больше не сможет случайно сканировать частные сети: жалобы на злоупотребления такого рода должны прекратиться.