Сегментация сети на VPS нужна, чтобы приватные сервисы не были доступны напрямую из интернета и не «перетекали» друг в друга слишком широко. Проще говоря: вы разделяете трафик на зоны, а правила фаервола решают, кто с кем может общаться и через какие порты.

На практике сегментация сводится к двум задачам. Первая — сделать так, чтобы у сервиса не было прямого маршрута/доступа с публичной стороны. Вторая — закрепить доступ правилами фаервола по принципу минимальных разрешений: всё запрещено по умолчанию, разрешаем только нужное.

Дальше разберём, как спроектировать зоны, как сформировать правила фаервола для приватных сервисов и как проверить, что модель реально работает.

Модель сети: зоны, адреса и маршрутизация

Перед настройкой фаервола удобно описать, какие зоны у вас будут и какой трафик в них допустим. Даже если всё крутится на одной VPS, полезно мыслить «как в облачной сети»: есть публичная часть, приватная часть и отдельная зона для администрирования.

Типовые зоны для приватных сервисов

  • Публичная зона (Internet-facing)
  • туда попадают сервисы, которые должны быть доступны извне: web (80/443), иногда API.
  • у этих сервисов обычно внешний IP или публичный интерфейс.
  • Приватная зона (Service-private)
  • туда вы размещаете базы данных, внутренние API, очереди, админские endpoints, которые не должны открываться в интернет.
  • обычно у приватных сервисов нет прямого доступа с публичной стороны.
  • Зона администрирования (Management)
  • доступ к SSH, панелям мониторинга, репозиториям, консольным сервисам.
  • обычно это либо отдельный IP, либо ограничение по списку доверенных адресов, либо доступ через jump host/ VPN.

Как выглядит адресация и доступы

Есть два рабочих варианта:

  • На уровне провайдера: вы используете отдельную приватную сеть (VPC/VNet) или private IP и правила провайдера (security groups/ACL) дополняете фаерволом на хосте.
  • На уровне ОС: на одной VPS вы делите сеть на сегменты логически (интерфейсы/бриджи) или технически (network namespaces/контейнерные сети), а фаерволом ограничиваете потоки между ними.

В обоих случаях принцип один: приватные сервисы должны быть доступны только из нужных источников. Если вы рассчитываете «на то, что порт не открыт», это часто ломается при рефакторинге или ошибке в правилах. Фаервол должен оставаться последней линией защиты.

Маршрутизация как точка риска

Сегментация теряется, если маршруты позволяют обойти ограничения. Например, вы разрешили доступ к сервису с приватной зоны, но забыли запретить форвардинг между интерфейсами или ошибочно включили проброс портов.

Поэтому перед правилами уточните:

  • какие интерфейсы у VPS (например, eth0 публичный, eth1 приватный/внутренний мост);
  • включён ли IP forwarding (и зачем);
  • какие порты реально слушает сервис (на адресе 127.0.0.1, на приватном IP, на 0.0.0.0).

Зачастую уже выбор listen-адреса уменьшает нагрузку на фаервол и снижает шанс утечки.

Базовые правила фаервола для приватных сервисов

Дальше — ядро. Хорошая модель фаервола для приватных сервисов строится вокруг трёх принципов: default deny, явные allow по источникам и учёт состояний соединений.

Принцип default deny: всё запрещено, кроме разрешённого

Начинайте с того, что запрещаете входящий и форвардируемый трафик, а затем разрешаете точечно.

Для INPUT цепочки (вход на саму VPS) это означает:

  • по умолчанию DROP или REJECT;
  • разрешаем только то, что действительно нужно: SSH из доверенных IP, 80/443 на web, и доступ к приватным портам только с конкретных подсетей/адресов.

Если у вас есть форвардинг (например, VPS маршрутизирует трафик между сегментами), то аналогично:

  • FORWARD по умолчанию запрещён;
  • разрешаем только конкретные направления.

Statefull-подход: учитывайте существующие соединения

Большинство сетевых атак используют необычные пакеты и попытки «вписаться» в неочевидные этапы сессии. Statefull-фильтрация решает часть проблем проще и быстрее.

В терминах практики:

  • разрешайте входящие пакеты в рамках уже установленного/связанного соединения;
  • новые соединения разрешайте только через чётко заданные правила.

Это снижает количество «дыр» от случайно открытых портов.

Allow по минимальным источникам

Для приватных сервисов вам почти всегда нужны правила в формате:

  • разрешить доступ к порту сервиса только с адреса(ов) reverse proxy, jump host или VPN;
  • запретить доступ к этому же порту из интернета.

Хорошее правило звучит так: «разрешаем порт БД только с подсети, где живут приложения, и только с нужных интерфейсов».

Если у вас несколько приложений, не открывайте порт всем. Лучше перечислить подсети/адреса приложений, а не «разрешить всё внутри приватной сети», если внутри сети много сущностей.

Логирование: меньше шума, больше смысла

Логирование не должно превращаться в поток гигабайтов. Делайте так:

  • логируйте DROP только в ограниченном режиме или с префиксами/фильтрами;
  • логируйте отдельные важные политики (например, попытки доступа к портам БД из публичной зоны).

Если вы настраиваете фаервол впервые, логирование поможет понять, какие правила на самом деле попадут в реальный трафик.

nftables vs iptables: логика одинаковая, синтаксис разный

В современных системах чаще встречается nftables, но принципы те же.

  • nftables хорошо подходит для структурирования правил по таблицам/цепочкам и работе с наборами адресов.
  • iptables подходит, если у вас уже есть готовая схема и привычные шаблоны.

Важно не то, чем вы режете трафик, а то, что вы придерживаетесь модели «разрешаем только нужное». Ниже примеры будут в стиле nftables/универсальной логики, но вы сможете перенести смысл на ваш стек.

Сценарий 1: приватный сервис за reverse proxy или балансировщиком

Самая частая схема: приватный сервис не открывается в интернет, а общается с приватной сетью через proxy. В интернете остаётся только точка входа: proxy (или load balancer), а правила фаервола блокируют прямые подключения к приватному сервису.

Приватный сервис доступен только прокси: правила по источнику

Допустим:

  • публично доступен Nginx/Envoy на VPS по 80/443;
  • приватный сервис (внутренний API) слушает порт 8080 только на приватном интерфейсе;
  • БД слушает порт 5432 на приватном интерфейсе.

Тогда правила выглядят концептуально так:

  • INPUT: разрешить 80/443 с интернета;
  • INPUT: разрешить SSH только из списка доверенных IP;
  • INPUT: запретить 8080/5432 с публичной стороны;
  • INPUT или FORWARD: разрешить 8080/5432 только от IP proxy (или из приватной подсети приложения).

Если proxy и приватный сервис на одной VPS, «источник» может быть не внешний адрес, а интерфейс/loopback. Тут важно, чтобы приватный сервис слушал правильный адрес и чтобы вы не открывали порт на публичном интерфейсе.

Практический чек: listen-address и bind на интерфейс

Очень частая ошибка — сервис БД или внутреннего API случайно слушает 0.0.0.0. Тогда даже при правильном фаерволе вы повышаете риск ошибок при будущих правках.

Минимизация:

  • БД слушает только приватный адрес (или вообще 127.0.0.1, если доступ только через локальный socket/туннель).
  • внутренний API слушает только приватный адрес или интерфейс.
  • proxy слушает публичный интерфейс, а к приватным портам подключается по приватному IP.

Когда эти слои согласованы, фаервол становится проще и надёжнее.

Проверка: прямые запросы должны падать, запросы через proxy — работать

После настройки сделайте две проверки:

  • С публичного хоста попробуйте подключиться напрямую к приватному порту (8080/5432). Должно быть соединение отклонено или таймаут.
  • Тот же функционал попробуйте через proxy: обращение к API через 80/443 должно пройти.

Если первый сценарий проходит, а второй тоже проходит — значит, приватный порт оказался доступен не так, как задумано. Тогда нужно возвращаться к правилам и проверять интерфейсы/цепочки.

Сценарий 1.2: приватные сервисы через VPN (WireGuard/OpenVPN)

Иногда нужен доступ к приватным сервисам не через web-proxy, а через VPN. Например, вы хотите админку или внутренний API отдавать только сотрудникам/системам, у которых есть ключи VPN.

Правило фаервола: разрешаем приватные порты только из VPN-интерфейса

С точки зрения фаервола это похоже на «allow только от proxy», только вместо IP proxy источником становится интерфейс VPN (wg0, tun0) или подсеть VPN клиентов.

Концептуально:

  • INPUT: разрешить доступ к приватным портам только с vpn-интерфейса или vpn-подсети.
  • INPUT: запретить эти порты на публичном интерфейсе.
  • INPUT: SSH не обязательно должен быть открытым в интернет — его можно оставить доступным только из VPN или по отдельным доверенным IP.

Такая модель хорошо работает для администрирования: вы не зависите от статических IP сотрудников и можете отзывать доступ ключами.

Не смешивайте VPN-туннель и «внутреннюю сеть» без политики

Есть тонкость: VPN даёт сетевую связность, но это не значит, что все клиенты должны видеть все приватные сервисы. Поэтому:

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

VPN упрощает логистику доступа, но не заменяет сегментацию и правила.

Сценарий 2: микросервисы на одной VPS и сегментация внутри хоста

На одной VPS часто живут несколько приложений и БД. Даже без нескольких интерфейсов можно построить сегментацию на уровне сети/процессов: через контейнеры, отдельные namespaces или хотя бы через разные подсети контейнеров и правила для них.

Контейнеры и сети: ограничивайте доступ между подсетями

Если вы используете контейнеры, сеть контейнеров часто создаётся автоматически. Тогда фаервол должен понимать:

  • какие подсети контейнеров считаются приложениями;
  • где находится БД;
  • с каких подсетей должны приходить соединения к БД.

Типичная ошибка — разрешить контейнерам «всё ко всем», потому что «так быстрее». Ускорение обычно быстро заканчивается инцидентом, когда один сервис становится точкой входа и получает доступ к внутренним данным.

Network namespaces и межсегментные правила

Если вы не ограничиваетесь контейнерами и используете Linux network namespaces, то сегментация становится ещё ближе к «настоящей сетевой архитектуре». Правила фаервола можно привязать к интерфейсам namespaces или к правилам на границе.

Тут важно не усложнить: начните с понятной схемы «одно направление — один набор правил». И только потом добавляйте более тонкие политики.

Если сервисы на одном хосте: не открывайте приватные порты наружу

Самая простая сегментация внутри VPS — это не публиковать сервисы на публичный интерфейс.

  • БД и внутренние API слушают только приватный адрес.
  • Внешний интерфейс (публичный) видит только proxy, web и, возможно, мониторинг с ограничениями.

Тогда даже при ошибках в правилах доступа вы получите «меньше поверхности атаки» изначально.

Порталы администрирования: SSH, панели и ограничение доступа

Администрирование — самая частая точка компрометации. Сегментация сети на VPS здесь особенно важна, потому что админка и SSH часто живут рядом с приложениями.

SSH: ограничьте источники и уберите лишнюю открытость

Практическая политика:

  • открыть SSH только с доверенных IP или только из VPN;
  • если нужен доступ с разных сетей — используйте VPN, а не «широкие allow from».

Также полезно:

  • включать rate limiting на попытки подключения (на уровне SSH и/или фаервола);
  • блокировать явный перебор (например, через fail2ban, если он у вас уже принят в операционном процессе).

Фаервол должен оставаться источником первичной фильтрации, а fail2ban — дополнительным слоем.

Панели мониторинга и управления: не делайте их “случайно публичными”

Инструменты вроде веб-панелей мониторинга или очередей нередко поднимаются «по умолчанию» на 0.0.0.0. Даже если это «для удобства», они почти всегда оказываются мишенью.

Если панель нужна только админам:

  • не публикуйте порт наружу;
  • разрешайте доступ только из management-зоны: доверенные адреса или VPN;
  • если панель доступна через web (reverse proxy), ограничьте путь и источники на уровне proxy и фаервола.

Сочетание двух уровней делает ошибку менее критичной.

Как спроектировать правила фаервола: рабочий чек-лист

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

  • Зафиксируйте список приватных сервисов
  • порт, протокол (TCP/UDP), откуда должен приходить трафик (proxy, приложение, VPN-клиенты, batch-задачи).
  • где слушает сервис: 127.0.0.1, приватный IP, публичный IP, 0.0.0.0.
  • Определите сетевые зоны
  • публичная зона (интернет/публичный интерфейс);
  • приватная зона (подсети приложений, где живут клиенты приватных сервисов);
  • management зона (VPN/доверенные IP).
  • Настройте политики по умолчанию
  • INPUT/FORWARD по умолчанию DROP.
  • Разрешения только явными правилами.
  • Добавьте stateful правила
  • разрешите пакеты по существующим соединениям;
  • новые соединения разрешайте точечно.
  • Разведите правила для разных направлений
  • INPUT на хост (доступ к сервисам, которые слушают на самой VPS);
  • FORWARD для маршрутизируемого/проксируемого трафика между интерфейсами/сетями.
  • Начните с минимального набора и только потом расширяйте
  • сначала разрешите то, без чего система не поднимется: SSH по нужным источникам и web через proxy;
  • затем добавьте приватные порты приложений и БД.
  • Добавьте логирование для “лишних” попыток
  • логируйте DROP на наиболее чувствительные порты (например, БД, очереди, admin endpoints) с лимитом по частоте.
  • Проверьте с внешних и внутренних источников
  • с публичной стороны: приватные порты должны быть недоступны;
  • с приватной стороны: доступ должен работать;
  • проверьте не только функциональность, но и базовые сетевые эффекты (таймауты vs явные отказы — это тоже диагностический сигнал).

Типичные ошибки при сегментации сети на VPS

Эти ошибки встречаются регулярно, потому что кажутся «мелочью», пока не становится поздно.

  • Приватный сервис слушает 0.0.0.0

Даже лучший фаервол уязвим к ошибкам в будущих правках. Всегда согласуйте listen-адрес с моделью сегментации.

  • Разрешили доступ к приватному порту “из приватной сети” слишком широко

Если в приватной сети много сущностей, вы фактически отдаёте доступ всему сегменту. Разрешайте конкретные адреса/подсети приложений.

  • Упустили различие INPUT и FORWARD

Часть сервисов доступна через маршрутизацию, и вы настроили INPUT, но трафик проходит по FORWARD. Итог — правила вроде бы есть, но эффект отсутствует.

  • Не учли интерфейсы и адреса источника

При proxy/VPN источником может быть адрес VPN, адрес прокси, или адрес внутреннего интерфейса. Если привязываться к “не тому” источнику, правило не срабатывает или, наоборот, открывает лишнее.

  • Слишком агрессивные REJECT вместо DROP

REJECT может быстрее «разоблачать» сервис для сканеров и давать полезную информацию атакующему. DROP обычно тише. Выбор зависит от вашей операционной модели, но осознанно.

  • Открыли SSH на интернет “временно”

Даже временное открытие часто живёт месяцами. Если нужен доступ — лучше VPN или строго ограниченные доверенные IP.

  • Нет проверки после изменений

Самая дорогая ошибка — поменять фаервол и не протестировать снаружи. Делайте проверку “на два конца”: публичная сторона не должна видеть приватное, приватная — должна.

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

Сегментация — это не разовая настройка. Нужно закрепить её процессом: тестами, мониторингом и аккуратными обновлениями.

Базовые проверки после настройки правил

  • Просмотрите активные правила
  • убедитесь, что нужные цепочки не перезаписаны;
  • проверьте порядок правил: в nftables/iptables порядок имеет значение, особенно для матчей.
  • Тестируйте доступ по схеме “публично/приватно”
  • публичный хост: приватные порты должны не отвечать или быть отклонены;
  • приватный хост (с правильным источником): соединение должно устанавливаться.
  1. Тестируйте не только порты, но и протокол

Если сервис использует HTTP поверх TCP, достаточно проверить TCP-подключение и HTTP-ответ. Если UDP — убедитесь, что правила для UDP действительно включены.

Логирование как инструмент диагностики

Логирование полезно, когда оно:

  • ограничено по частоте;
  • направлено на ключевые политики;
  • позволяет быстро понять источник и порт.

Например, если вы логируете DROP для приватного порта, вы увидите, что именно пытается достучаться. Часто это не атака, а кривой health-check или мониторинг с неправильной сети. Тогда проблема решается настройкой источника, а не “расширением доступа”.

Обновления: не сломайте правила при деплое

Самая частая причина поломок — обновления приложений и конфигурации сетевого слоя:

  • приложение начинает слушать на 0.0.0.0 вместо приватного адреса;
  • reverse proxy меняет Upstream на другой порт/адрес;
  • добавляется новый контейнер в подсеть и ему внезапно нужны порты.

Чтобы это не превращалось в хаос:

  • храните правила фаервола в конфиге или в инфраструктурном репозитории;
  • перед релизом сверяйте сетевые зависимости: какие порты добавляются, откуда к ним должен идти трафик.

Итоги и план внедрения

Сегментация сети на VPS для приватных сервисов — это сочетание архитектуры и дисциплины правил фаервола. Архитектура задаёт границы зон, а фаервол фиксирует минимальные разрешения, чтобы приватные сервисы не становились доступными “по умолчанию”.

Практичный план на один день:

  1. Составьте список приватных сервисов и их портов, а также источники (proxy/VPN/подсети приложений).
  2. Проверьте listen-адреса: приватные сервисы не должны слушать публичный интерфейс.
  3. Включите default deny и stateful-подход.
  4. Добавьте точечные allow по источникам для приватных портов.
  5. Сделайте тесты “снаружи и изнутри” и добавьте ограниченное логирование на чувствительные DROP.

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