Ваш маршрутизатор работает под управлением Linux, и это поведение легко реализовать в любом стандартном дистрибутиве Linux. Я могу предположить, какие правила должны присутствовать в брандмауэре вашего маршрутизатора, чтобы он работал так. Но имейте в виду, что это всего лишь предположение, мы не знаем, как именно правила выглядят на самом деле.
Когда вы перенаправляете порт на свой веб-сервер, он добавляет определенное правило DNAT, которое, вероятно, выглядит так:
iptables -t nat -A PREROUTING -p tcp -d <ваш-внешний-адрес> --dport 443 -j DNAT --to-destination <raspberry-pi-address>
На словах это означает: «прежде чем решить, предназначен ли этот пакет для устройства или должен быть перенаправлен, проверьте, является ли адрес назначения пакета вашим внешним адресом, а порт назначения — 443. Если он совпадает, измените адрес назначения на локальную сеть Raspberry Pi. адрес". Обратите внимание, это правило не фильтрует по интерфейсу.
Также у него определенно есть правило типа SNAT (для предоставления доступа в интернет для локальной сети), возможно, оно выглядит так:
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -j MASQUERADE
Другими словами, после того, как маршрутизатор решает, куда должен идти пакет, перед отправкой пакета он изменяет свой исходный адрес на любой адрес исходящего интерфейса (если пакет был отправлен из локальной сети). Опять же, интерфейс ничего не фильтрует.
Теперь рассмотрим ваше HTTPS-соединение. Вы указываете имя хоста в браузере, верно? Вы настраиваете его так, чтобы он разрешался во внешний адрес вашего маршрутизатора, который становится адресом назначения. Ваш исходный адрес находится внутри локальной сети. Итак, кажется, что оба эти правила применимы к пакетам вашего соединения.
Обрабатывая их, маршрутизатор сначала сталкивается с правилом DNAT, проверяет адрес и порт назначения и решает изменить адрес назначения на адрес raspberry pi.Затем он обнаруживает, что интерфейс, через который должен выйти пакет, — это LAN. Затем он проверяет частично транслированный пакет на соответствие второму правилу и выясняет, что исходный адрес находится в локальной сети. Таким образом, он заменяет исходный адрес пакета адресом LAN-интерфейса 192.168.1.1. Это то, что видит ваш Raspberry Pi.
Операция NAT имеет состояние, то есть она также поддерживает запись в таблице, в которой говорится, что было заменено чем и как обнаруживать последующие пересылаемые и ответные пакеты, поэтому все они преобразуются правильно. Да, оказывается, Linux может выполнять DNAT и SNAT одновременно в одном потоке.
Можно ли доверять такому поведению? Я не знаю. Если прошивка маршрутизатора была с открытым исходным кодом, у нас была возможность проверить. Без источника мы не можем быть уверены. Это всегда так, когда исходный код закрыт, поэтому следует избегать продуктов с закрытым исходным кодом, если вы беспокоитесь о безопасности.