Nginx и SSH на одном порте.

Настраиваем возможность подключения к серверу по 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 (разумеется, он должен быть настроен там):

nginx https ssh

  • При попытке соединиться на 1.1.1.1:443 по SSH, мы получаем приглашение для ввода пароля:
$ ssh root@1.1.1.1 -p443
Enter passphrase for key '/home/user/.ssh/id_rsa':

Таким образом, мы очень легко настроили возможность получения доступа на сервер по ssh через 443 порт.

4 thoughts on “Nginx и SSH на одном порте.

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

      Но кейс редкий, да. Так что для повседневного использования на обычных серверах он конечно же не обязателен.

  1. Nифига не редкий кейс!
    у меня опенвпн 443 висит, вот думаю как бы устроить комбайн на 443, https+ssh+ovpn.

  2. А если стопануть nginx, то отвалится ssh? ну отлично, спасибо.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *