Я создаю веб-приложение (сервер A), которое взаимодействует с удаленным сервером (сервер B), подключенным к Интернету.
Сервер B находится за NAT и прослушивает обмен данными через 3 нестандартных порта.
В типичном сценарии, чтобы я мог развернуть несколько удаленных серверов в разных сетях и обеспечить его связь с родительским веб-приложением (сервером A), на каждом из этих серверов должны быть вручную настроены маршрутизаторы для перенаправления соответствующих портов на статический ip, в котором настроен Сервер Б.
Я ищу способ решить эту проблему, заключающуюся в необходимости настраивать каждый маршрутизатор индивидуально и вручную для каждого развертывания. Переадресация портов должна выполняться, потому что сервер A должен взаимодействовать с сервером B и должен инициировать диалог.
Я спрашиваю, есть ли способ для сервера B инициировать связь, а не наоборот, чтобы переадресация портов не происходила.
Серверу B просто нужно будет позвонить домой, обязательно открыть все сокеты / порты (именно здесь мне нужна ваша помощь для получения информации), и вся связь будет осуществляться через эти открытые порты, при этом серверу A никогда не понадобится знать IP-адрес сервера B , и необходимость взаимодействия с маршрутизатором для обработки пересылки.
Возможен ли такой сценарий?
Редактировать: Добавлены некоторые подробности:
По сути, я создал веб-приложение (сервер A), которое общается с несколькими серверами 3D-печати, на которых открыт REST API. Все серверы API сервера печати прослушивают нестандартный порт 8721.
Прямо сейчас в моем веб-приложении вручную я настраиваю вручную, чтобы указывать на каждый сервер печати через их внешний IP-адрес и порт с переадресацией портов. Как вы, вероятно, можете сказать, это создаст кучу проблем, так как большинство этих внешних IP-адресов будут изменены из-за того, что большинство домашних / потребительских сетей не имеют статического IP-адреса.
Это означает, что я должен узнавать каждый раз при изменении IP-адреса и вручную изменять свои записи в моем веб-приложении.
Я предполагаю (и предполагаю), что один из лучших способов решить эту проблему - не позволять веб-приложению беспокоиться о том, где находится каждый из этих серверов печати, а позволить самим серверам печати сообщать веб-серверу, где они находятся.
Пытаюсь решить 2 проблемы:
Извините за длинный пост. Я, все еще относительно новичок во всей части программирования сокетов, и я надеюсь, что кто-то сможет указать мне, где я должен искать, чтобы узнать больше информации о том, как это сделать.
Предполагая, что вы управляете кодом сервера печати, конечно, вы можете подключить сервер печати к вашим серверам, что избавит вас от необходимости беспокоиться о NAT в удаленных сетях. Так работают, например, GoToMyPC и LogMeIn - постоянные исходящие соединения на серверы через брандмауэр.
Там являются протоколы, которые могут позволить вам «пробивать» NAT, но, честно говоря, если обе конечные точки не находятся за NAT, которым вы не можете управлять, я бы сказал, что эти протоколы (STUN и т. д.) слишком трудоемки для слишком малой отдачи.
Вы захотите подумать о том, как ваши серверы печати определяют местонахождение центрального сервера. Заманчиво просто использовать DNS-имена, но вы должны подумать об изменениях, которые вы можете внести позже в инфраструктуру вашего сервера (например, в масштабировании). Я бы указал вам на Записи SRV как механизм, позволяющий серверам печати находить свой центральный сервер. Запись SRV уже имеет встроенную абстракцию для обеспечения высокой доступности и взвешивания приоритетов.
Да, это возможно. Это можно легко автоматизировать с помощью Перенаправление портов UPnP, если включено на хосте / устройстве NAT, безопасность не важна. Если вы не хотите использовать UPnP, например, из-за соображений безопасности, вы можете добиться этого, используя другой API для доступа к вашим устройствам NAT. UPnP очень распространен в домашних маршрутизаторах.
Возможно, вы захотите использовать другой сервер для передачи IP-адресов и номеров портов серверов A и B по статическому IP-адресу или полному доменному имени, которое напрямую доступно через статический порт. Это можно сделать, например, сохранив данные в текстовом файле.
Как сказал @Evan, без конкретики того, чего вы действительно пытаетесь достичь, это все, что я могу сказать.