Сети: IP, подсети, порты, NAT, firewall
↑ Этап 1 · Фундамент: Linux, Bash, сети
Зачем это на собесе
IP-адресация и NAT — основа проектирования VPC, Kubernetes и докера. Часто просят посчитать подсети.
IP-адресация (IPv4)
32 бита, 192.168.1.10. Маска определяет сеть и хост: /24 = 255.255.255.0 (24 бита сеть, 8 бит хосты).
| CIDR | Маска | Адресов | Хостов |
|---|---|---|---|
| /32 | 255.255.255.255 | 1 | 1 (один хост) |
| /30 | 255.255.255.252 | 4 | 2 (точка-точка) |
| /28 | 255.255.255.240 | 16 | 14 |
| /24 | 255.255.255.0 | 256 | 254 |
| /16 | 255.255.0.0 | 65 536 | 65 534 |
| /8 | 255.0.0.0 | 16 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на шлюзе.
Вопросы с ответами
Сколько хостов в /26?
2^(32−26) − 2 = 62 хоста (64 адреса минус сеть и broadcast).
Чем SNAT отличается от DNAT?
SNAT подменяет адрес источника (выход из частной сети наружу), DNAT — адрес назначения (проброс внешних запросов на внутренний хост).
Почему важно не пересекать CIDR в разных сетях?
Маршрутизатор не сможет определить, куда направлять пакеты; возникают конфликты при VPN, peering и в Kubernetes.