Сети: IP, подсети, порты, NAT, firewall

↑ Этап 1 · Фундамент: Linux, Bash, сети

Желательно~4 мин чтенияУровень: junior

Зачем это на собесе

IP-адресация и NAT — основа проектирования VPC, Kubernetes и докера. Часто просят посчитать подсети.

IP-адресация (IPv4)

32 бита, 192.168.1.10. Маска определяет сеть и хост: /24 = 255.255.255.0 (24 бита сеть, 8 бит хосты).

CIDRМаскаАдресовХостов
/32255.255.255.25511 (один хост)
/30255.255.255.25242 (точка-точка)
/28255.255.255.2401614
/24255.255.255.0256254
/16255.255.0.065 53665 534
/8255.0.0.016 777 216~16,7 млн

Хостов = 2^(32−prefix) − 2 (минус адрес сети и broadcast).

Расчёт: 10.0.5.77/26 → размер блока 64; сети: .0, .64, .128, .192 → адрес сети 10.0.5.64, broadcast 10.0.5.127, хосты .65–.126.

Частные (RFC 1918): 10.0.0.0/8, 172.16.0.0/12, 192.168.0.0/16; loopback 127.0.0.0/8; link-local 169.254.0.0/16 (метаданные облаков 169.254.169.254); CGNAT 100.64.0.0/10; multicast 224.0.0.0/4.

ip -br a; ip route; ip -4 addr show eth0
ipcalc 10.0.5.77/26          # или python3 -c "import ipaddress; ..."

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

  • разделение сети на сегменты: public / private / data; разные подсети по зонам доступности;
  • не пересекайте адреса VPC, VPN, Kubernetes (pod/service CIDR), Docker (172.17.0.0/16): пересечения ломают маршрутизацию;
  • закладывайте запас: поды Kubernetes требуют большие блоки (/16 на кластер типичный).

Шлюз и маршрутизация

Шлюз по умолчанию (default gateway) — куда отправлять трафик для всех сетей, которых нет в таблице маршрутов.

ip route
# default via 10.0.0.1 dev eth0
# 10.0.0.0/24 dev eth0 proto kernel scope link src 10.0.0.15
sudo ip route add 10.20.0.0/16 via 10.0.0.254
ip route get 8.8.8.8                   # как пойдёт пакет
sysctl net.ipv4.ip_forward             # включить маршрутизацию (1)

Выбор маршрута: самый длинный префикс (наиболее специфичный).

Порты

Порт идентифицирует приложение на хосте. 22 SSH, 53 DNS, 80/443 HTTP(S), 5432 PostgreSQL, 3306 MySQL, 6379 Redis, 9000 MinIO/ClickHouse native, 8123 ClickHouse HTTP, 6443 Kubernetes API, 9090 Prometheus, 3000 Grafana.

ss -tulpn                # слушающие порты (-t TCP, -u UDP, -l listen, -p процесс, -n числа)
nc -vz host 5432         # проверка доступности порта

Слушает 127.0.0.1 — только локально; 0.0.0.0 / :: — на всех интерфейсах.

NAT

Network Address Translation — подмена адресов при прохождении через маршрутизатор.

ВидЧто меняетсяПрименение
SNAT / Masqueradeадрес источникавыход в интернет из частной сети (домашний роутер, NAT Gateway в облаке, Docker)
DNAT / Port Forwardingадрес назначенияпроброс порта внутрь (-p 8080:80 в Docker, NodePort, публикация сервиса)
PAT (NAPT)+ портымного хостов за одним внешним IP
sudo iptables -t nat -A POSTROUTING -s 10.0.0.0/24 -o eth0 -j MASQUERADE        # SNAT
sudo iptables -t nat -A PREROUTING -p tcp --dport 8080 -j DNAT --to 10.0.0.5:80 # DNAT
sudo iptables -t nat -L -n -v

Соединения отслеживает conntrack (conntrack -L); переполнение таблицы — потеря пакетов (nf_conntrack_max). В облаке приложения в приватной подсети выходят наружу через NAT Gateway; входящий трафик — через балансировщик/bastion.

Broadcast, multicast, ARP

Broadcast — всем в сети (.255), ограничен широковещательным доменом (VLAN). ARP резолвит IP→MAC в пределах подсети.

IPv6

128 бит, 2001:db8::1; /64 — стандартная подсеть; нет NAT (обычно), SLAAC для автоконфигурации; dual-stack. Не отключайте IPv6 без понимания: многие сервисы используют ::1.

Типовые проблемы

  • нет доступа к сервису: слушает 127.0.0.1, а не 0.0.0.0; firewall; неверная подсеть;
  • пересекающиеся подсети между Docker и VPN;
  • MTU в туннелях — «ping есть, большие пакеты не идут»;
  • асимметричная маршрутизация и rp_filter;
  • нехватка эфемерных портов/conntrack под нагрузкой (NAT, исходящие соединения);
  • ip_forward = 0 на шлюзе.

Вопросы с ответами