SSLH: Прячем SSH/HTTPS/OpenVPN/Telegram за единым портом 443

Справочник системного администратора

Иногда может возникнуть ситуация, когда на сервере необходимо развернуть несколько сервисов, которые должны работать на одному порту, например 443.  Здесь на помощь приходит SSLH – мультиплексор SSL / SSH. Он будет прослушивать входящие соединения через порт 443 и на основе первого полученного от клиента сетевого пакета, будет перенаправлять запрос на нужный сервис.

Проще говоря, SSLH позволяет нам запускать несколько программ / служб через порт 443 в системе Linux.

Для начала установим сам пакет SSLH:

sudo apt install --no-install-recommends sslh

Обратите внимание, мы указали аргумент – no-install-recommends. Если дать команду без доп. аргументов, то вместе с установкой SSLH потянется куча других ненужных пакетов.

В процессе установки будет задан вопрос:

Отвечаем – “standalone” (или “самостоятельно”, в русской версии).

После установки смотрим поддерживаемые службы:

sudo sslh-select -h

Вывод будет таким:

sslh-select: option '-http' requires an argument
sslh 1.20-1
usage:
sslh [-v] [-i] [-V] [-f] [-n] [--transparent] [-F]
[-t ] [-P ] [-u ] [-C ] -p [-p ...]
[--ssh ]
[--openvpn ]
[--tinc ]
[--xmpp ]
[--http ]
[--tls ]
[--adb ]
[--socks5 ]
[--anyprot ]

Запустим sslh в тестовом режиме:

sudo sslh-select -f --listen 0.0.0.0:8443 --tls 127.0.0.1:443 --ssh 127.0.0.1:22 --openvpn 127.0.0.1:1194 --anyprot 127.0.0.1:9443

–listen 0.0.0.0:8443 — адрес и порт (потом поменяем его на 443), который слушает sslh.

–tls 127.0.0.1:443 — ваш сайт.

–ssh 127.0.0.1:22 — ssh-сервер.

–openvpn 127.0.0.1:1194 — openvpn-сервер.

–anyprot 127.0.0.1:9443 — на этот порт можно повесить любую службу, например proxy-telegram. Входящий пакет сначала проверяется на соответствие указанным службам, и если нет, то отправляется на –anyprot. Если не указывать –anyprot, неизвестный пакет будет просто дропаться.

Пробуем подключиться по SSH используя порт: 8443. Если всё работает, то переходим к настройке:

sudo nano /etc/default/sslh

Меняем строку:

DAEMON_OPTS="--listen 0.0.0.0:443 --tls 127.0.0.1:445 --ssh 127.0.0.1:22 --openvpn 127.0.0.1:1194 --anyprot 127.0.0.1:9443 --pidfile /var/run/sslh/sslh.pid"

Если каких-то служб нет, то их указывать не нужно. Если есть сайт, тогда в конфигурации web-сервера нужно поменять 443-й порт на 445-й (80-й трогать не нужно).

Сохраняем конфигурацию и запускаем sslh:

sudo systemctl start sslh

Проверяем работу:

sudo systemctl status sslh

Пробуем подключиться по SSH через 443 порт.

Осталось только перечитать файлы конфигурации systemd, включить и запустить демон. Выполняем команды по очереди:

sudo systemctl daemon-reload
sudo systemctl enable sslh
sudo systemctl start sslh

Tags: