Настраиваем возможность подключения к серверу по ssh на порт 443, при этом оставляем https работать в обычном режиме. Для реализации, используем переменную $ssl_preread_protocol, которая была добавлена в Nginx 1.15.2.
Допустим у нас есть сервер, на нём добавлено два IP адреса 1.1.1.1 и 2.2.2.2. На IP 2.2.2.2 у нас работают сайты, на первый же адрес мы разместим stream, который и будет обрабатывать наши подключения. SSH у нас работает на 2222 порте. Итоговый конфиг будет выглядеть так:
... stream { upstream ssh { server 2.2.2.2:2222; } upstream web { server 2.2.2.2:443; } map $ssl_preread_protocol $upstream { "" ssh; "TLSv1.2" web; default 2.2.2.2:443; } server { listen 1.1.1.1:443; proxy_pass $upstream; ssl_preread on; } } http { ...
В конфие мы обозначили два бекенда — ssh и web. Далее, с помощью map и $ssl_preread_protocol мы описываем как Nginx должен обработать трафик. При инициации соединения выполняется проверка — если нам прилетело TLSv1.2 соединение, то мы сразу же перенаправляем его в web upstream. Если при инициации соединения видно, что не используется никакая версия SSL или TLS, то соединение перенаправляется в ssh upstream. По умолчанию же, установлено перенаправление на 2.2.2.2:443.
Сам stream мы размещаем на 1.1.1.1:443. Убеждаемся что конфиг nginx не содержит ошибок (nginx -t), перезапускаем его и проверяем работу:
- При попытке открыть адрес https://1.1.1.1 в браузере, мы попадаем на сервер по https (разумеется, он должен быть настроен там):
- При попытке соединиться на 1.1.1.1:443 по SSH, мы получаем приглашение для ввода пароля:
$ ssh root@1.1.1.1 -p443 Enter passphrase for key '/home/user/.ssh/id_rsa':
Таким образом, мы очень легко настроили возможность получения доступа на сервер по ssh через 443 порт.
а смысл ? спрятать ssh порт за 443-им ?
Да, например, для случаев, когда доступ к серверу нужно получить из места, где всё, кроме нескольких портов нужных для работы с сайтами в сети, закрыто фаерволом.
Но кейс редкий, да. Так что для повседневного использования на обычных серверах он конечно же не обязателен.
Nифига не редкий кейс!
у меня опенвпн 443 висит, вот думаю как бы устроить комбайн на 443, https+ssh+ovpn.
А если стопануть nginx, то отвалится ssh? ну отлично, спасибо.