Брандмауэр для VPS нужен, чтобы уменьшить поверхность атаки и предсказуемо контролировать доступ к сервисам: сайт, админка, чат-бот, панель управления, внутренние API. Ошибки в настройке часто бьют не по “безопасности в целом”, а по конкретным вещам: доступ к серверу пропадает, приложение становится недоступным, логирование молчит, а исходящий трафик ломает обновления или интеграции.

Ниже — семь типичных ошибок при настройке брандмауэра для VPS молодежных проектов в Беларуси. Каждая — с признаками, последствиями и практичным способом исправить.

1) Включить deny и потерять доступ к серверу по SSH

Самая частая поломка выглядит одинаково: админ включает брандмауэр, выставляет запрет на входящие подключения, и в итоге SSH тоже закрывается. Дальше остаются две опции: долго ждать ответов, писать в поддержку хостера или пытаться зайти через резервный доступ, если он был настроен.

Как это обычно случается:

  • правила включаются сразу после изменения, без проверки с другого устройства;
  • “allow SSH” забывают или делают его слишком узким (например, только для одного IP, который со временем меняется);
  • открывают порт не для того протокола или не для той подсети.

Как проверить и исправить:

  1. Перед включением ограничений убедись, что у тебя уже есть открытый путь для администрирования. Минимум: разрешение на входящий TCP 22 (или ваш нестандартный SSH-порт).
  2. Если используешь UFW, порядок команд важен. Открывай SSH сначала, потом включай сам firewall.
  3. Делай изменения в две сессии: одна остаётся “на сохранение контроля”, вторая — для теста. Если что-то пошло не так, первая сессия позволит откатить.
  4. Добавь правило только для своего текущего внешнего IP (если он статический) или для подсети офиса/команды. Для динамических адресов лучше заранее продумать резервные варианты доступа.

Пример логики для UFW (смысл, а не точные значения):

  • разрешить SSH,
  • разрешить нужные веб-порты,
  • затем включить default deny для входящих.

Если SSH доступ должен быть только с конкретных IP, это хороший подход, но не делай его единственным. Для молодежных проектов часто команда небольшая, и потеря доступа блокирует работу на время.

2) Смешать порты приложения с правилами “на глаз” и оставить лишнее или недостающее

Вторая проблема — брандмауэр либо закрывает нужное, либо открывает слишком много. В обоих случаях страдает стабильность.

Типичные сценарии:

  • проект использует reverse proxy (например, Nginx), а правила сделаны “как будто приложение слушает напрямую 443”;
  • админка работает на одном порту, а в правилах открыт другой;
  • забывают об отдельном сервисе: WebSocket, админ-панель, API, метрики, очередь фоновых задач;
  • открывают “любой порт для входа” ради удобства, а потом забывают удалить.

Признаки ошибки:

  • сайт открывается, но функции ломаются: загрузки, чат, поиск, админка;
  • часть пользователей работает, часть нет (обычно из-за разных маршрутов или IPv6);
  • в логах веб-сервера видно, что соединения не доходят до приложения.

Как исправить правильно:

  1. Сначала зафиксируй, какие порты реально слушает сервер. Обычно это:
  2. 80/443 для HTTP/HTTPS,
  3. порт для SSH (если нужен),
  4. порт для админки/панели (если не спрятана за reverse proxy),
  5. порт для мониторинга (если он на сервере),
  6. специфические порты для WebSocket и API (часто они сидят на 443 за proxy).
  7. Затем сформируй “минимально необходимый список” разрешений входящего трафика.
  8. Не делай правила на уровне “открыть всё для этой подсети”, если можно точнее: разрешение только на нужные порты.

Небольшой лайфхак: составь таблицу “порт → сервис → кто использует → откуда разрешить”. Для молодежных проектов это удобно ещё и для передачи между участниками команды: правила становятся понятными, а не магическими.

3) Игнорировать IPv6: часть пользователей остаётся без доступа или получает неожиданный путь

IPv6 часто включён по умолчанию, особенно если сервер получает адреса автоматически. Если брандмауэр настроен только для IPv4, то:

  • часть пользователей через IPv6 может не получать доступ к сервисам (если входящий трафик блокируется),
  • или наоборот, может оказаться, что IPv6 доступ разрешён, хотя ты думал, что “всё закрыто”.

Как заметить проблему:

  • сайт открывается с одних устройств и не открывается с других;
  • в логах есть подключения по IPv6, а в правилах ты работал только с IPv4;
  • админка недоступна из части сетей, хотя “в IPv4 всё ок”.

Как исправить:

  1. Проверь, слушают ли сервисы IPv6 (например, Nginx может слушать на [::]:443).
  2. Проверь, есть ли правила для inet/ipv6 chains (в зависимости от инструмента).
  3. Прими решение заранее: либо полностью закрываешь IPv6 так же, как IPv4, либо симметрично разрешаешь нужные порты.

Если используешь nftables, обычно удобно работать в семействе inet, чтобы правила охватывали и IPv4, и IPv6. В UFW это зависит от того, включал ли ты IPv6-режим. Главное — не полагаться на “я же настроил, значит должно работать”.

В контексте Беларуси это особенно заметно для молодежных проектов, где аудитория может быть распределена между мобильными сетями и Wi‑Fi. Разные сети по-разному используют протоколы, и “сюрпризы” чаще всплывают именно на границе IPv4/IPv6.

4) Забыть про исходящий трафик: ломаются DNS, обновления, интеграции и бэкапы

Чаще всего люди думают только о входящих соединениях: “кто может зайти на сервер”. Но у проектов есть жизненно важные исходящие потоки:

  • DNS-запросы для резолвинга доменов,
  • получение обновлений пакетов,
  • отправка событий в мониторинг,
  • обращение к внешним API (боты, вебхуки, аналитика),
  • репликация/бэкапы на внешнее хранилище.

Если включить строгий deny на outbound или случайно создать правила, которые ограничивают исходящие соединения, приложение начинает вести себя странно:

  • внешние зависимости “то работают, то нет”,
  • фоновые задачи не выполняются,
  • сертификаты не обновляются (если используется ACME),
  • сервер перестаёт отправлять метрики.

Как исправить:

  1. Проверь, используется ли default deny для исходящего трафика. Для многих сценариев удобнее оставлять исходящее разрешённым и ограничивать только критичные направления.
  2. Минимизируй лишние ограничения на DNS: обычно UDP/TCP 53 к резолверам, которые ты указываешь, должен быть разрешён.
  3. Разреши базовые исходящие протоколы, необходимые проекту: HTTP/HTTPS к доверенным внешним сервисам, NTP для точного времени (если сервер теряет время, сертификаты и токены ведут себя хуже).
  4. Если хочешь строгость, делай allowlist для конкретных доменов/сетей, но тогда приготовься к регулярной актуализации: внешние сервисы могут менять инфраструктуру.

Уточнение для реальности: “домен → IP” может меняться. Поэтому строгие allowlist по IP без автоматизации часто превращаются в постоянные инциденты. Для молодежных проектов, где команда маленькая, это может быть дороже самой безопасности.

5) Неправильно обработать доверенный трафик: reverse proxy, CDN, балансировщики и IP-адреса админов

Многие “брандмауэрные” проблемы на самом деле не про порты, а про то, что считается доверенным источником. Типичная ситуация:

  • перед приложением стоит reverse proxy,
  • или используется CDN/балансировщик,
  • или админка доступна только по списку IP.

И вот здесь легко ошибиться:

  • открыть 443 снаружи, но забыть учесть реальный источник трафика за балансировщиком;
  • настроить allowlist по IP, который со временем меняется (например, у облачных CDN);
  • заблокировать WebSocket, хотя он идёт по тому же порту, но требует корректных условий на уровне proxy и фаервола.

Как сделать предсказуемо:

  1. Определи, кто реально “подходит” к серверу: прямые клиенты или промежуточные сервисы.
  2. Если перед сервером стоит прокси, обычно на брандмауэре проще разрешить входящие на нужные порты без привязки к конкретному клиентскому IP, а доверие переносить на уровень proxy (через правильные заголовки и проверку источника).
  3. Если же ты действительно ограничиваешь админку по IP, убедись, что источник не меняется. Для команды это часто решается тем, что вход админов идёт через статические офисные адреса или VPN с фиксированной подсетью.

Мини-подход для команд: раздели правила на два слоя логики:

  • “публичный слой”: что разрешено всем на уровне портов,
  • “админский слой”: что разрешено только с проверенных адресов/каналов.

Тогда при изменениях в архитектуре (например, добавили CDN) будет ясно, какие правила трогать.

6) Не включить логирование и не настроить защиту от повторяющихся попыток

Брандмауэр без логов — это как камера без записи: ты не узнаешь, что именно происходило. Для молодежных проектов это быстро приводит к ситуации “сервер иногда падает”, но никто не понимает причины.

Что обычно пропускают:

  • нет логов для блокированных соединений;
  • логи включены, но не читаются (нет настройки ротации, нет фильтрации);
  • отсутствует защита от brute-force по SSH (или она “есть”, но не привязана к реальным попыткам);
  • трафик блокируется слишком агрессивно, а потом отсекает легитимных пользователей при смене IP.

Как исправить:

  1. Включи логирование блокировок хотя бы для критичных входных точек: SSH и админские порты.
  2. Настрой ротацию логов, чтобы диск не заполнился (это частая “вторая” авария после первой).
  3. Рассмотри fail2ban или аналогичный механизм для SSH и других сервисов с авторизацией.
  4. Логи делай пригодными к чтению: лучше разумный уровень детализации, чем “всё подряд каждую минуту”.

Если у проекта есть дежурный участник, добавь простую рутилизацию: “раз в день посмотреть последние блоки по SSH и админке”. Это занимает пару минут, но снижает время реакции в разы.

В белорусском контексте особенность чаще не в законе и не в технологиях, а в организационной реальности: проекты нередко держатся на небольших командах и нерегулярном дежурстве. Поэтому прозрачность (логи + понятные правила) становится частью безопасности.

7) Не сохранять правила и не проверять их после перезагрузки

Последняя ошибка кажется мелкой, но она дорогая: правила брандмауэра применяются “вручную” и исчезают после ребута. В результате:

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

Признаки:

  • проблема появляется после обновлений или перезагрузок;
  • “раньше работало”, но теперь доступ сломан;
  • в истории команд есть “включили firewall”, но нет признаков сохранения состояния.

Как исправить:

  1. Убедись, что выбранный инструмент сохраняет правила после перезагрузки.
  2. Делай “контрольный выстрел”: после настройки выполни проверку с внешней машины.
  3. После перезагрузки заново проверь фактическое состояние.
  4. Добавь документирование: что изменяли, где хранятся правила, какая команда применяется для проверки.

Если используешь систему уровня операционной системы (UFW, firewalld), обычно есть штатные механизмы сохранения. Если используешь nftables/iptables вручную — убедись, что правила добавляются через сервис, а не только через интерактивную команду.

Небольшая дисциплина для команды: один раз сделайте скрипт проверки доступности портов (например, HTTP/HTTPS и SSH) и запускайте его после любых изменений. Это экономит часы отладки в момент, когда проект должен быть онлайн.

Практический чек-лист перед включением брандмауэра на VPS

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

  • Определены порты и сервисы, которые слушает сервер (HTTP/HTTPS, SSH, админка, WebSocket, API, метрики).
  • Разрешение на SSH сделано заранее, и есть план B (например, резервный доступ через панель провайдера или отдельный доверенный IP/сеть).
  • Учтены IPv4 и IPv6: правила симметричны или осознанно разделены.
  • Исходящий трафик не ломает DNS, обновления, сертификаты и фоновые задачи.
  • Reverse proxy/балансировщик учитывают реальные точки входа и доверенные адреса.
  • Включены логирование блокировок и защита от повторяющихся попыток для авторизованных сервисов.
  • Правила сохраняются после перезагрузки, а после обновлений/ребута выполняется проверка.

Как безопасно тестировать настройки брандмауэра

Хорошая проверка похожа на проверку замков перед походом: ты не доверяешь словам, ты проверяешь на практике.

  1. Запусти проверку с внешнего устройства, которое не сидит в той же сети, что и сервер.
  2. Проверь не только “открывается ли сайт”, а функции, которые зависят от сети: авторизация, загрузка файлов, WebSocket/чат, админка.
  3. Посмотри, что происходит в логах брандмауэра и в логах приложения, если соединения не доходят.
  4. Тестируй изменения поэтапно: сначала “минимально безопасно”, потом ужесточай.

Если в команде два человека, лучше распределить роли: один меняет правила, второй проверяет доступ с другого места. Это уменьшает шанс “закрыть всё и остаться без доступа” до нуля.

Итог: из семи ошибок обычно получается одна понятная схема

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

  • Сначала не потеряй SSH и доступ к управлению.
  • Затем открой только нужные порты и правильно учти reverse proxy.
  • Потом симметризируй IPv4/IPv6.
  • Потом не сломи исходящий трафик.
  • Включи логи и защиту от повторяющихся атак.
  • Закрепи правила, проверь после перезагрузки.

Для молодежных проектов в Беларуси это особенно практично: команда небольшая, перезапуски происходят, а пользователи ждут стабильной работы. Брандмауэр тогда становится не источником инцидентов, а тем самым “тихим слоем”, который защищает без сюрпризов.

От mpns_by