Wiki

Clone wiki

comp-house.repo / sslh-a-sslssh-multiplexer-for-linux

Первоисточник: http://linuxaria.com/pills/sslh-a-sslssh-multiplexer-for-linux?lang=en

Иногда мы имеем дело с файрволами, которые разрешают принимать соединения только на определенные порты, например, можно соединиться на порт 80(http) и порт 443(https). Но что делать, если необходимо подключаться по ssh, а эти порты уже используются веб-сервером для соединения по http и https протоколам?

Во почему появился sslh. Этот несложный инструмент принимает входящие соединения на порт и в зависимости от используемого протокола перенаправляет их в sshd на порт 22, или на веб-сервер на localhost:443.

sslh позволяет принимать оба типа соединений - HTTPS и SSH на один порт и позволяет соединяться с сервером по SSH на порт 443 (паример, через корпоративный файрвол, который в большинстве случаев не блокирует порт 443) оставляя возможность обслуживать HTTPS-запросы на том же самом порту.

Идея состоит в том, чтобы с помощью sslh слушать внешний 443 порт, принимать входящие соединения, определять тип соединения и перенаправлять их на соответствующий сервер.

Sslh реализован на C для более быстрой производительности и поддержки сброса привелегий.

Определение протокола

Определение протокола построено на небольшом различии между SSL и SSH: при соединении клиент SSL обращается первым, тогда как SSH client ожидает, что SSH сервер заговорит первым (представляя себя с помощью баннера). sslh ждет некоторое время, будут ли от входящего соедниения данные. Если они есть до того как пройдет таймаут, значит, это соединение SSL. В ином случае речь идет о соединении SSH.

Установка

sslh уже упакован для Debian, Ubuntu, Gentoo, FreeBSD и множества других ОС, поэтому проверьте стандартные репозитории своего дистрибутива, прежде чем устанавливать его вручную, хотя можно загрузить тарбол с исходными кодами.

Установка

В Debian и Ubuntu конфигурационный файл находится в /etc/default/sslh. Указанные в нем переменные окружения загружаются в скрипте запуска-остановки (/etc/init.d/sslh) и передаются passed в sslh как параметры командной строки, но прежде, чем смотреть на sshl нам необходимо настроить два наших сервиса, которые в итоге будут принимать соединения.

Настройка SSH

Никаких специальных настроек для ssh не требуется. Нужно настроить SSH-server так, чтобы он принимал соединения на стандартный SSH-порт (22).

Настройка HTTPS-server

Теперь настало время настроить HTTPS-server (Apache?) так, чтобы слушал HTTPS/SSL соедиенния на неиспользуемом порту. В примере я использую порт 8080, который зарезервирован для альтернативного HTTP-трафика, но это сугубо частный выбор. В качестве альтернативы можно указать серверу слушать только localhost (а не внешний IP-адрес).

Configure SSLH

Теперь настало время отредактировать файл /etc/default/sslh, который отвечае за настройку данного сервиса в Ubuntu.

  • Change:*

RUN=yes # Указать, что демон таки должен быть запущен DAEMON_OPTS="--user sslh --listen 0.0.0.0:443 --ssh 127.0.0.1:22 --ssl 127.0.0.1:8080"

Вот объяснение настроек:

-user sslh необходимо для запуска программы под указанным пользователем -p 0.0.0.0:443 слушать указанный адрес – SSLH будет слушать порт 443 на всех доступных интерфейсах. -s 127.0.0.1:22 целевой адрес для SSH – направлять SSH-трафик на порт 22 на localhost. -l 127.0.0.1:8080 целевой адрес для SSL – направлять HTTPS/SSL-трафик на порт 8080 на localhost

Теперь осталось перезагрузить 3 демона daemons и получить доступ через 443 к обоим сервисам.

Заключение

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

Updated