Безопасные запросы к приложению Windows за NAT

У меня есть приложение Windows, которое будет развернуто на нескольких компьютерах в разных сетях. Эти приложения должны запускать некоторые действия при получении соответствующего запроса от внешнего сервиса.

Для этого я получил HttpListener, который ждет запросов и выполняет необходимые действия.

Проблема с NAT и безопасностью. Когда приложение Windows запускается, оно должно сообщить внешней службе, что оно работает и как к нему можно добраться (находясь за NAT, это не так тривиально, требуется какое-то туннелирование?). Когда внешней службе нужно что-то выполнить в приложении Windows, она отправляет ему запрос, и приложение должно продолжить действия и отправить ответ на сервер.

Как лучше всего открыть мое приложение Windows за NAT для внешней службы (туннелирование?) и как сделать его безопасным (HTTPS?)? Или, может быть, есть лучшее решение для такого рода удаленных вызовов (RPC?)?


person WhiteAngel    schedule 13.10.2020    source источник


Ответы (1)


Отправка http-запросов клиентам за NAT означает, что вам необходимо вручную создать маршрут в вашем NAT-маршрутизаторе для каждого клиента, который перенаправляет порт с внешнего IP-адреса на фиксированный внутренний IP-адрес.

Чтобы сделать его безопасным, у вас есть два варианта:

  • Используйте TLS (https) = каждому клиенту нужен сертификат и он принимает https
  • Оставьте запросы незащищенными, но храните их в безопасной среде. Это можно сделать с помощью VPN-подключения между вашим сервером и сетью NAT (при этом локальная сеть определена как безопасная).

Такая установка отлично работает, если вы хотите запустить серверное приложение (один хост) и готовы потратить некоторое время. Обычно это сокращает вашу жизнь, если вы хотите сделать это с большим количеством клиентских приложений в сети компании.

Существуют технологии, позволяющие отправлять сообщения клиентам без необходимости что-либо настраивать на маршрутизаторах. Для .Net у нас есть SignalR, который сочетает в себе несколько подходов и использует наилучшие из возможных: https://dotnet.microsoft.com/apps/aspnet/signalr

person Christoph Lütjen    schedule 13.10.2020
comment
Спасибо за ответ, Кристоф. Я хотел бы иметь решение без переадресации портов, если это возможно. Разве нельзя сделать туннелирование, как это делается, например, с помощью ngrok который не требует открытия портов или настройки NAT? - person WhiteAngel; 13.10.2020
comment
Да, вы также можете создать туннель к какому-либо серверу (если ИТ-отдел позволит вам это сделать), но я не знаю ни одной библиотеки, которая упростила бы это. - person Christoph Lütjen; 14.10.2020