Колба Питона с STUN
Я разрабатываю простой сервер на основе Flask, который может взаимодействовать с одноранговыми приложениями (другими подобными серверами) в Интернете. Приложение может быть за NAT. Поэтому я пытаюсь разрешить внешний IP-адрес и порт через stun-сервер с помощью pystun.
import stun
nat_type,external_ip,external_port=stun.get_ip_info()
Возвращен порт 54320. Проблема в том, что при попытке http://external_ip:54320/ запрос не достигает приложения Flask. http://external_ip:5000/ также не работает, 5000 используется как внутренний порт (я знаю, что это не должно работать, но все равно попробовал). Там нет брандмауэров. Я запустил Flask с host="0.0.0.0". добавить.. я не хочу делать явное сопоставление портов в маршрутизаторе.. есть ли способ, что колба может слушать порт, который доступен с внешних адресов и выяснить внешний порт через stun?
1 ответ
Очень сложно разместить сервер за NAT без явного сопоставления портов. NAT также действует как межсетевой экран. Узел за NAT может устанавливать исходящие соединения TCP, но NAT будет блокировать любые входящие соединения.
STUN здесь не помогает, потому что он только помогает узлам за NAT обнаруживать свои собственные сопоставления портов. Чтобы разрешить установление соединения после STUN, обычно необходимо выполнить шаг перфорации, при котором обе конечные точки одновременно пытаются соединиться друг с другом.
Одна из идей, которую вы можете попробовать, - это использовать UPNP, который является протоколом, который поддерживается многими NAT для динамического создания сопоставлений портов. Есть некоторые библиотеки с открытым исходным кодом, которые могут работать.
Но самое простое решение - просто настроить NAT для явного отображения портов. (например, порт 50000 сопоставляется с внутренним IP-адресом вашего компьютера через определенный порт).