WebUI за reverse proxy

Приветствую!

Подскажите, вдруг кто брался за такую задачу, и нашёл решение: нужно закрыть доступ к WebUI с помощью reverse proxy (c HTTPS и аутентификацией).

Сам контроллер стоит в закрытой сети, доступ к которой есть только через VPN. Собственно, сейчас посмотреть WebUI можно, только подключившись к этой VPN. Хочется дать такую возможность без подключения к VPN, но соблюдая определённый уровень безопасности (т.е. логин/пароль и зашифрованное соединение). Решение “в лоб” не работает, т.к. помимо доступа к обычным ресурсам (по URL сайта), которые номально проксируются, тонкий клиент из браузера напрямую (через websockets) обращается к mqtt на WB (т.е. по другому порту и без HTTPS). Может быть есть какой-нибудь трюк, чтобы это дело тоже завернуть в основной reverse proxy с теми же самыми credentials, что и для сессии по основному URL?

И этот же WS можно получить через тот же 80 порт контроллера, в котором nginx его проксит.
посмотрите на конфиг /etc/nginx/sites-enabled/default в конце.

Не прокатило :frowning:

Try to connect to MQTT Broker on my.server.com:80 with username undefined and clientid contactless-jWilSGay3k main.20abb7d89361a250e473.js:1:1414
Uncaught DOMException: The operation is insecure. libs.e44a515bb30ccc6a7224.js:1

Это даже если оставить в стороне тот факт, что сама страница настроект порта Settings->WebUI не открывается, если оно не может достучаться по websocket туда, куда хочет, а стучится оно, по умолчанию, по порту 18883, который прибит гвоздями в коде…

“Прибит”?
Screenshot from 2022-02-09 17-02-11

Я, похоже, не вполня ясно описал проблему :frowning: Страница конфигурации где можно поменять значение этого порта, в WebUI действительно есть, но эта страница (у меня) не открывается, если этот порт изначально не тот, что нужен. Получается замкнутый круг.
Но даже не в этом главная проблема. Если я открываю https://rev.proxy.com:1234 который проксирует запрос на WB на my.server.com:80, то клиент (судя по всему) пытается открыть ws://rev.proxy.com:80 вместо wss://rev.proxy.com:1234, чего современные браузеры не могут допустить из соображений безопасности.

P.S. А ‘80’ - да, берется из localStorage, где его можно отредактировать, если открывается соответствующая страница редактирования конфигурации (а она не открывается)

Страница работает на htttp, без WS. Перепроверил. И на ней же можно указать адрес и порт именно WS.

Прошу прощения, “был не прав, вспылил”… Настройки порта действительно открываются без доступа к websocket. Не открываются дэшборды. У меня, похоже, проблема была в чём-то другом.

Хочу понять, в чём. Помогите, пожалуйста, со сборкой.
Я поставил себе nodejs (12.22.10), поставил grunt-cli bower yo generator-karma generator-angular, сгрузил https://github.com/wirenboard/homeui
Но при попытке его собрать (как написано в README.md - командой ‘grunt’) получаю “Fatal error: Unable to find Gruntfilė”. И таки да, в репозитарии Gruntfile нету.

P.S. В nodejs angular и пр. я почти полный профан, так что могу упускать что-то, для всех очевидное…

Одолел я, хвала аллаху, этого монстра… Если кому интересно - прикладываю патч, который позволяет делать именно то, про что я спрашивал: устраивать внешний reverse proxy с SSL и аутентификацией для доступа из интернета к WB во внутренней сети.
Идея в том, что теперь, в зависимости от того, по какому протоколу (http/https) открыта страница homeui, подключение идёт через ws или через wss. И плюс к этому стало допустимо оставлять в настройках поле port/порт пустым. В этом случае подключение по websockets устанавливается с тем же портом, что и основная страница (что позволяет использовать https-сессию с той же авторизацией).

Конфигурация reverse proxy получается простейшая. Для apache она будет, в общих чертах, выглядеть так:

<VirtualHost _default_:4443>
	SSLEngine on
    ProxyPreserveHost On
    ProxyPass /mqtt ws://ip.internal.srv:18883
    ProxyPassReverse /mqtt ws://ip.internal.srv:18883
    ProxyPass / http://ip.internal.srv:80/
    ProxyPassReverse / http://ip.internal.srv:80/

    ServerName ip.external.srv

    <Proxy *>
            Order deny,allow
            Allow from all
            Authtype Basic
            Authname "Password Required"
            AuthUserFile /etc/apache2/.htpasswd
            Require valid-user
    </Proxy>
<VirtualHost _default_:4443>

это в предположении, что apache слушает на порту 4443 вашего сервера ip.external.srv, который одним концом смотрит в интернет, а другим - во внутреннюю сеть, где по адресу ip.internal.srv доступен WirenBoard

homeui.patch (3.6 КБ)

2 Likes

Прямо хорошо.
То есть можно использовать “снаружи” произвольный порт и SSL.

Добрый день, подскажите как и куда установить патч.

Здравствуйте!
Это изменения показанные системой контроля версий git для файлов из репозитория https://github.com/wirenboard/homeui, которые внес пользователь.

Эта тема была автоматически закрыта через 7 дней после последнего ответа. В ней больше нельзя отвечать.