This commit is contained in:
Dmitry Zuikov 2023-02-24 06:18:59 +03:00
parent 9c5d9e01f8
commit 0764bbca44
2 changed files with 74 additions and 0 deletions

View File

@ -1,4 +1,76 @@
## 2023-02-24
TODO: libpcp-gateway-detection
Посмотреть, как libpcp ищет шлюз.
TODO: gateway-detection
Пытаться обнаружить UPnP gateway что бы просить у него пробросить
порт.
Обычно это SOHO роутер, где может функционировать NAT-PMP или
UPnP.
Если это модный домашний роутер типа Keenetic, там, скорее всего,
будет и то, и другое.
Если это что-то не очень модное (Mac), то там может быть только NAT-PMP
и мы не найдем сам gateway методом UPnP.
Что нам остаётся:
1. Пытаться обнаружить его через PCP Discovery
2. Взять системный Gateway из выхлопа команд (ifconfig, ipconfig и т.п)
3. Взять адрес gateway из конфига
4. Задавать команду поиска Gateway тоже в конфиге (может быть проблематично)
В случае поиска через UPnP да и в любом вообще случае --- мы не можем быть
уверены, что это вообще наш gateway, через который мы ходим в интернет.
Это может быть какая-то L3 топология с цепочкой роутеров, тогда нас, скорее
всего, ждёт провал. Мы видим, однако, что узел каким-то образом всё равно
в таком случае работает, только почему-то не добавляется в PEX (расследовать).
Вероятно, алгоритмы NAT приоткрывают дырку очень ненадолго.
Таким образом, мы видим, что задача поэтапная и хорошего решения нет, любое вызывает
какие-то проблемы.
Таким образом, в первом приближении предлагается пойти по пути Syncthing:
1. Найти какой-то роутер по SSDP:
```
M-SEARCH * HTTP/1.1
HOST: 239.255.255.250:1900
MAN: "ssdp:discover"
MX: 2
ST: urn:schemas-upnp-org:device:InternetGatewayDevice:1
```
2. Попросить его открыть порты (по NAT-PMP)
Если мы попросим открыть порты по NAT-PMP и он это сделает,
скорее всего, это наш роутер.
Первый этап: нахождение роутера
1. Взять из конфига, если есть
2. Разослать SSDP запрос, посмотреть, кто откликнется
Без рутовых прав мы не можем: сами пользоваться ICMP, слушать
сетевые интерфейсы / переводить их в промискуитетный режим.
Не зная на какой мы системе, мы не можем вызывать команды типа
ipconfig/ifconfig/ip addr (хотя можем попытаться перебрать их все)
(Посмотреть, как сделать в libpcp --- оно каким-то образом пытается
найти default gateway сначала).
## 2023-02-23
TODO: http-cache-protocol

View File

@ -0,0 +1,2 @@
```
```