IP addressing (IPv4/IPv6, CIDR, RFC1918), routing (BGP between AS), NAT (SNAT/DNAT/PAT), anycast vs unicast — concept page for foundations curriculum. Demonstrates outbound NAT mapping, inbound DNAT vs P2P NAT-traversal failure, BGP route propagation with anycast routing к ближайшему DC, BGP hijack attack scenario. Includes ADRs on IPv4 exhaustion (NAT vs IPv6) and stateful NAPT-table memory pressure.
VPC, subnets, security groups, NAT gateways, IPv6, anycast, BGP — это не «cloud-фичи», а способ как 5 миллиардов устройств в интернете находят друг друга через 32-битное адресное пространство, которого хватает на 4.3 миллиарда. Без понимания трёх вещей — IP-адресации, routing, NAT — нельзя ни задизайнить VPC в AWS, ни понять почему «два контейнера в одном Docker могут говорить, а два за NAT — нет без port-forwarding», ни объяснить себе как один и тот же IP 1.1.1.1 (Cloudflare DNS) одновременно живёт в 300+ дата-центрах.
Это базовый слой системного дизайна. Когда product manager спросит «почему мы не можем дать клиенту прямой IP сервера», ответ начинается с RFC 1918. Когда SRE сказал «у нас port exhaustion на NAT gateway», нужно понимать NAPT-таблицу. Когда WebRTC-видеозвонок «не соединяется через корпоративный proxy», корень — Symmetric NAT и отсутствие hole punching.
IP — это адрес. Routing — как пакет туда добирается. NAT — фальшивишь свой адрес чтобы экономить адреса или скрыть topology.
Три уровня, которые надо держать в голове одновременно:
10.x, 172.16-31.x, 192.168.x) — внутри LAN, в интернете не маршрутизируется. CIDR (10.0.0.0/24) — компактная запись «вот этот префикс из стольки-то бит».10.0.0.0/24 бьёт 10.0.0.0/16 если оба подходят.Парадокс, который объясняет половину архитектурных решений: NAT случайно стал firewall. Без явного port-mapping inbound-пакеты дропаются — у них нет записи в conntrack. Это бесплатная безопасность для homerouters и одновременно главная боль для P2P (WebRTC, BitTorrent, SIP).
Четыре зоны слева направо, отражающие путь пакета из дома в интернет и обратно:
10.0.0.10, host-B 10.0.0.11, мобильный host-C 10.0.0.12). Эти адреса не маршрутизируются ни одним ISP. У вас в офисе и у соседа в квартире могут быть одинаковые 10.0.0.10 — никто не «столкнётся», потому что наружу никто этот адрес не видит.203.0.113.5. Единственная точка с глобальным адресом. Внутри — NAPT-таблица (Network Address Port Translation, она же PAT), которая мультиплексирует тысячи внутренних соединений в один external IP через разные TCP/UDP-порты.198.51.100.10 в трёх DC. Frankfurt, Ashburn, Singapore — все три одновременно объявляют один и тот же /32 префикс по BGP. Клиент попадает в ближайший по AS-path, не подозревая что IP «один и тот же».8.8.8.8 — обычный unicast endpoint для сравнения с anycast.На nat-gw закреплены два ADR: про выбор NAPT vs IPv6 миграции (ADR-001) и про stateful conntrack memory pressure (ADR-002).
Четыре сценария на диаграмме показывают разные срезы — от happy path до атаки на сам протокол.
1. Outbound NAT (SNAT/PAT). 95% домашнего и офисного трафика. Браузер на host-A открывает TCP к 8.8.8.8:443, выбирает random ephemeral port 50001. NAT-gateway видит «dst не в LAN → default route», аллоцирует external port 60001, записывает в conntrack mapping (10.0.0.10:50001) <-> (203.0.113.5:60001), переписывает src и шлёт наружу. Origin отвечает на 203.0.113.5:60001. NAT смотрит таблицу — переписывает dst обратно на 10.0.0.10:50001. Браузер прозрачно получает ответ.
2. Inbound DNAT + почему P2P не работает. Два кейса параллельно. Кейс A: admin pre-configured DNAT rule 203.0.113.5:22 → 10.0.0.11:22 — SSH из интернета работает. Кейс B: host-C хочет принять WebRTC video call. Другой peer пытается dial in на 203.0.113.5:<random port> — пакет дойдёт до NAT и будет дропнут, потому что в conntrack нет записи. Решения: STUN (peer спрашивает «какой у меня external IP?»), hole punching (оба одновременно шлют UDP — создают outbound mapping, inbound становится «связанным»), TURN (relay через сервер если ничего не помогло). Реальный WebRTC делает ICE candidate gathering: host → server-reflexive (STUN) → relayed (TURN), выбирает лучший.
3. Anycast BGP routing. Три DC одновременно объявляют 198.51.100.10/32 со своим AS-path. Каждый ISP получает три копии анонса, выбирает кратчайший AS-path (BGP best-path algorithm). ISP-A в Германии ставит в FIB DC-EU (~5ms через Frankfurt IX), Tier-1 ставит DC-US, ISP-C ставит DC-Asia. host-A в Германии делает GET к 198.51.100.10 — попадает в Frankfurt. Американский клиент с тем же запросом — попал бы в Ashburn. Один IP — три разных физических сервера, разруливается на уровне BGP. Built-in failover: если DC-EU упадёт, BGP withdrawal → ISP-A пересчитает за ~30 секунд → host-A автоматически попадёт в DC-US.
4. BGP hijack. Misconfigured (или malicious) router в ISP-C объявляет более specific префикс или поддельный AS-path для 198.51.100.0/24. Соседи поверят — BGP без RPKI не имеет встроенной аутентификации. Трафик 198.51.100.10 начинает идти в ISP-C вместо легитимного DC-EU. ISP-C может дропать (DoS, как Pakistan Telecom с YouTube в 2008), логировать (sniff), или MITM с поддельным TLS если есть rogue CA (Rostelecom + Mastercard/Visa, 2017). Detection: BGP-monitor (BGPmon, RIPEstat) — минуты. Fix — часы. Митигации: RPKI (origin AS подписывает свои префиксы — в 2026 покрыто ~50% prefixes), BGPsec (подпись каждого hop), пассивный monitoring (Cloudflare Radar, ThousandEyes).
ADR-001: NAPT (PAT) vs миграция на IPv6. IANA исчерпала свободные /8 блоки в феврале 2011, RIRs (APNIC, RIPE) — в 2011-2019. Покупка IPv4 на вторичном рынке: $40-60 за адрес (2026), /24 (256 адресов) ~$10K. У типичного офиса/телекома сотни тысяч устройств — покупать публичные IP для каждого экономически невозможно. Три альтернативы: (a) NAPT — один публичный IP на тысячи внутренних через мультиплексирование портов; (b) IPv6 — 2^128 адресов; (c) Carrier-Grade NAT у ISP — два уровня NAT для абонентов.
Выбор индустрии: NAPT как primary, IPv6 — dual-stack параллельно без принуждения. Причины: обратная совместимость (70% интернета 2026 всё ещё IPv4-only), zero-touch для legacy приложений, бесплатный firewall side effect. Цена: breaks end-to-end principle — P2P требует STUN/TURN/ICE; shared rate-limits — Cloudflare CAPTCHA на всех пользователей за одним IP; port exhaustion — NAPT-таблица ограничена 65K портов на (public IP, protocol), ~600 одновременных активных пользователей на один public IP при типичной нагрузке.
ADR-002: Stateful conntrack — TCP timeout и memory pressure. Каждое NAT-mapping = запись в таблице ядра. У Linux netfilter conntrack default = 65K записей, RAM ~300 байт/запись. При 10K пользователей и 50 connections каждый = 500K записей → table full → новые соединения дропаются с silent fail (самый поганый failure mode — приложение получает таймаут вместо понятной ошибки). TCP-сессия может жить часами (long-poll, websockets, keep-alive), а NAT не знает когда release mapping без явного FIN.
Tunables: поднять net.netfilter.nf_conntrack_max до миллионов; aggressive TCP timeouts (default 5 days → 1 hour для idle); bigger NAT pool (несколько public IPs + ECMP для horizontal scaling); hairpin NAT (NAT loopback) для intra-LAN доступа через external IP. В облаке: AWS NAT Gateway — managed, до 55K одновременных соединений на destination, $0.045/час + $0.045/GB, обязательно multi-AZ (single AZ = SPOF для всего outbound).
10.0.0.0/16), subnets (public с Internet Gateway, private с NAT Gateway), route tables на уровне subnet, Security Groups (stateful firewall на уровне instance), NACL (stateless на уровне subnet), VPC peering для cross-region.100.64.0.0/10 (RFC 6598 «shared address space»). Поэтому ваш phone никогда не имеет публичного IP, и почему OpenVPN с сервером дома часто не работает с мобильного интернета.0.0.0.0/0 на DB. Postgres на 5432 открыт всему интернету «временно для миграции данных», осталось навсегда. Сканеры найдут за минуты. Никогда не открывайте dbport наружу — ходите через bastion или VPN.db.address = "10.0.5.42" в коде. Replica failover меняет IP — приложение не находит БД. Используйте DNS (db.internal.example.com) или service discovery.Не использовать NAT когда:
Не использовать anycast когда:
Не использовать 0.0.0.0/0 egress без фильтрации. Если ваш контейнер скомпрометирован, attacker получит выход в любой интернет-эндпоинт (C&C, exfiltration). Egress firewall (allowlist API доменов, например *.stripe.com, *.googleapis.com) — минимальная гигиена для production.
connect() после того как пакет нашёл путь через routing/NAT.cloud-arch.ru превращается в 203.0.113.5 до того как сработает routing.