9.7. Частные сети и NAT¶
IPv4 был разработан с расчётом на четыре миллиарда адресов, что в то время казалось достаточным. Это оказалось не так. Каждому подключённому к интернету дому, офису и заводу нужен собственный блок адресов для внутренних устройств, и если добавить все камеры, телефоны и бытовые приборы мира, четырёх миллиардов на всех не хватит.
Решением, на котором остановился интернет, стали частные сети: большинство устройств в локальной сети используют адреса, которые уникальны не глобально, а только внутри этой сети, а единственное устройство на границе сети выполняет трансляцию между двумя мирами. Камера почти всегда находится в одной из таких частных сетей.
9.7.1. Диапазоны частных адресов¶
Три диапазона IPv4 зарезервированы как не маршрутизируемые в публичном интернете. Любая локальная сеть может свободно использовать адреса из этих диапазонов без согласования с кем-либо, потому что ни один маршрутизатор за пределами локальной сети никогда не попытается доставить пакет на них:
10.0.0.0–10.255.255.255(16 миллионов адресов; распространён в крупных корпоративных сетях).172.16.0.0–172.31.255.255(около миллиона адресов; встречается реже).192.168.0.0–192.168.255.255(65 тысяч адресов; вариант по умолчанию почти для каждого домашнего маршрутизатора).
В типичной домашней сети и камера, и взаимодействующий с ней ноутбук находятся на адресах 192.168.x.x, потому что именно этот диапазон выбирает домашний маршрутизатор для создаваемой им сети.
9.7.1.1. Как используется маска подсети¶
На странице IP-адреса была введена запись /24. Она важна здесь потому, что маска подсети — это то, что каждое устройство использует для определения, куда отправить пакет дальше. Каждый раз, отправляя пакет, камера применяет свою маску подсети к адресу назначения и смотрит на результат:
Если адрес назначения совпадает по сетевым битам с собственным адресом камеры, значит, назначение находится в той же локальной сети. Камера отправляет пакет напрямую.
Если адрес назначения не совпадает по сетевым битам, он должен находиться в какой-то другой сети. Камера отправляет пакет своему шлюзу по умолчанию (маршрутизатору, настроенному автоматически при установлении связи) и предоставляет шлюзу обработать остальное.
Эта единственная проверка — «совпадают ли у нас сетевые биты?» — и есть назначение маски подсети. Это также причина, по которой домашние сети по умолчанию используют /24: предел в 254 устройства с запасом подходит для домохозяйства и сохраняет сеть простой.
9.7.2. Трансляция сетевых адресов (NAT)¶
Камера на 192.168.1.50 не может просто отправить пакет серверу в публичном интернете — публичный интернет не маршрутизирует к 192.168.x.x. Домашний маршрутизатор решает это с помощью трансляции сетевых адресов, или NAT, и делает это прозрачно.
NAT переписывает адрес источника исходящих пакетов на публичный адрес маршрутизатора и выполняет обратную замену для входящих ответов, так что частные устройства выглядят как разделяющие один публичный адрес.¶
У маршрутизатора два адреса: частный в локальной сети (обычно 192.168.1.1) и публичный, назначенный интернет-провайдером. Когда камера отправляет пакет на публичный адрес, маршрутизатор
записывает частный адрес камеры и порт и связывает их с собственным временным исходящим портом;
переписывает адрес источника в пакете на собственный публичный адрес (а порт источника — на выбранный исходящий порт);
отправляет переписанный пакет через публичную сторону.
Когда ответ приходит обратно на публичный адрес маршрутизатора и порт, маршрутизатор находит сопоставление, переписывает адрес назначения обратно на частный адрес камеры и порт и доставляет пакет на локальной стороне. Камера никогда не узнаёт о том, что произошла замена; сервер никогда не узнаёт исходный источник.
Именно NAT делает домашние сети практичными. У него также есть два следствия, о которых стоит знать.
9.7.3. Что меняет NAT¶
Исходящие соединения просты. Камера в частной сети может свободно общаться наружу. Каждый раз, когда она открывает TCP-соединение или отправляет UDP-пакет удалённому серверу, NAT автоматически устанавливает сопоставление. Большинство приложений для камеры работают именно в этом направлении: захватить изображение, отправить его на какой-то сервер, получить ответ.
Входящие соединения сложны. Устройство в публичном интернете не может напрямую подключиться к камере в частной сети. Когда непрошеный пакет приходит на публичный адрес маршрутизатора, у него нет сопоставления для поиска, поэтому пакету некуда идти. Маршрутизатор либо отбрасывает его, либо передаёт службе, работающей на самом маршрутизаторе.
Для случая входящих соединений распространены три обходных пути, примерно в порядке возрастания практичности:
Проброс портов. Настройте маршрутизатор так, чтобы он направлял все входящие пакеты на выбранном публичном порту к конкретному частному устройству. Требует административного доступа к маршрутизатору; ненадёжен при изменении публичного адреса маршрутизатора.
VPN. Запустите виртуальную частную сеть, которая помещает камеру в ту же логическую сеть, что и тот, кому нужно до неё добраться. Тяжеловесно; выходит за рамки большинства развёртываний камеры.
Соединение, инициируемое изнутри. Камера подключается наружу к известному серверу где-то в публичном интернете и держит это соединение открытым; сервер использует существующее соединение, чтобы отправлять сообщения обратно. Именно так работают push-уведомления и большинство протоколов облачно-подключённых устройств, и это шаблон, к которому в итоге приходит большинство приложений для камеры.
NAT невидим для кода Python на камере. Скрипт просто общается с тем назначением, которое ему нужно; маршрутизатор выполняет трансляцию за кулисами. Но направление соединения действительно важно, и NAT — это причина, по которой «камера тянется к облачному серверу» гораздо более простая схема, чем «облачный сервер тянется к камере».