CIDR и подсети
Запись 10.0.0.0/16 — адрес и число бит префикса сети. Первые 16 бит фиксированы, оставшиеся 16 — под адреса, то есть 65 536 адресов от 10.0.0.0 до 10.0.255.255. Каждый шаг префикса делит сеть пополам:
| Префикс | Адресов |
|---|---|
| /16 | 65 536 |
| /24 | 256 |
| /28 | 16 |
| /32 | 1 |
Частные диапазоны: 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 — файрвол или маршрут.