Урок 08 из 8 · 2 минуты чтения

Сети на сервере — подсети, firewall, reverse proxy и диагностика

Как читать CIDR и планировать подсети, как ограничивать сетевой доступ, зачем nginx перед приложением и как искать, почему сервис A не видит сервис B.

CIDR и подсети

Запись 10.0.0.0/16 — адрес и число бит префикса сети. Первые 16 бит фиксированы, оставшиеся 16 — под адреса, то есть 65 536 адресов от 10.0.0.0 до 10.0.255.255. Каждый шаг префикса делит сеть пополам:

ПрефиксАдресов
/1665 536
/24256
/2816
/321

Частные диапазоны: 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16. В каждой подсети первый адрес — адрес сети, последний — broadcast, облака резервируют ещё несколько. Диапазоны планируют заранее: пересекающиеся сети не соединить через VPN или пиринг, а Kubernetes заберёт отдельные диапазоны под поды и сервисы. 0.0.0.0/0 в правиле означает «весь интернет».

Запрещено всё, что не разрешено

Сетевой доступ ограничивают слоями:

  • файрвол хоста — nftables, iptables, ufw;
  • security groups в облаке у каждой машины;
  • сетевые ACL подсетей;
  • NetworkPolicy в Kubernetes.

Типичная схема: наружу открыты только 80 и 443 балансировщика; база, кэш и брокер доступны только из подсети приложений; SSH — только с bastion или через VPN.

Сервис, слушающий 0.0.0.0 без файрвола, доступен всему интернету — частая причина утечек баз. Docker при публикации портов правит iptables напрямую и обходит ufw — это стоит проверять отдельно.

Reverse proxy

Reverse proxy стоит перед приложением и принимает запросы от его имени. Задачи nginx:

  • терминация TLS — сертификаты в одном месте;
  • балансировка между экземплярами и маршрутизация по домену и пути;
  • статика, сжатие, кэширование;
  • лимиты — частота запросов, размер тела;
  • таймауты и буферизация, которые защищают приложение от медленных клиентов.
server {
    listen 443 ssl;
    server_name shop.example.ru;
    location / {
        proxy_pass http://127.0.0.1:8080;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Заголовки X-Forwarded-* сообщают приложению реальный IP клиента и схему. 502 — upstream недоступен или оборвал соединение, 504 — не ответил вовремя. В Kubernetes ту же роль играет ingress-контроллер.

Сервис A не видит сервис B

Идут по уровням снизу вверх:

dig b.internal                 # резолвится ли и в тот ли адрес
mtr b.internal                 # маршрут и потери
nc -zv b.internal 8080         # открыт ли порт
openssl s_client -connect b.internal:443   # TLS
curl -v http://b.internal:8080/health      # HTTP

Характер ошибки подсказывает уровень:

  • connection refused — хост доступен, но порт никто не слушает;
  • timeout — пакеты теряются, чаще всего виноват файрвол или маршрут.

На стороне B ss -tlnp показывает, слушает ли сервис и на каком адресе: 127.0.0.1 доступен только локально. Ping может быть запрещён, а TCP — работать, поэтому выводов по одному ping не делают. Последний аргумент — tcpdump: видно, доходят ли пакеты вообще.

Что запомнить

  • /24 — 256 адресов, каждый шаг префикса делит сеть пополам.
  • Наружу — только балансировщик, базы — только из своей подсети.
  • Приложение прячут за reverse proxy с TLS и лимитами.
  • refused — порт не слушают, timeout — файрвол или маршрут.

Проверка урока

Войдите, чтобы проверить себя: сданные проверки всех уроков курса отмечают его темы пройденными на карте и в ИПР.

Вопросы по теме

Читайте также

Партнёр платформы

Разбор собеседования с sotto

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

Разбор собеседования