Ssh and openvpn on the same port: различия между версиями

Материал из noname.com.ua
Перейти к навигацииПерейти к поиску
(Новая страница: «=Как запустьтить OpenVPN и SSHd на одном порту=»)
 
Метка: ручная отмена
 
(не показано 12 промежуточных версий этого же участника)
Строка 1: Строка 1:
  +
[[Категория:Linux]]
=Как запустьтить OpenVPN и SSHd на одном порту=
 
  +
[[Категория:SSH]]
  +
[[Категория:OpenVPN]]
  +
=Как запустить OpenVPN и SSHd на одном порту=
  +
Задача: Есть абстрактный сервер, и файрволл разрешает доступ на сервер только на 22 порт. С сервера доступна некая внутренняя сеть, с которой нужно работать.
  +
Файрволл - внешний и доступа к нему нет. Нужно обеспечить доступ к внутренней сети максимально простым способом
  +
  +
* Постройка тунеля через ssh - http://wiki.sirmax.noname.com.ua/index.php/SSH_TUNNEL. Этот способ работает но не очень удобен. Кроме того, у меня случались подвисания туннелей и требовался перезапуск. В целом решение не слишком удобное хотя к плюсам можно отнести то что оно работает "из коробки".
  +
  +
* Использовать мультиплексирование протоколов с помощью специального демона sslh (тема этой статьи)
  +
  +
  +
==Установка sslh==
  +
Для 6-й CentOS найти готовый пакет мне не удалось. Версия 1.17 - сходу не собралась, разбираться в причинах времени не было, взял из мастера.
  +
* Склонить исходники
  +
<PRE>
  +
git clone https://github.com/yrutschle/sslh.git
  +
</PRE>
  +
(8f39c106e18eccb66afa2288c4557d4947278538 - последний коммит на данный момент)
  +
  +
* Для сборки мне пришлось доставить следующие пакеты:
  +
<PRE>
  +
# yum install gcc git libconfig-devel libconfig
  +
</PRE>
  +
В зависимости от системы список может отличаться
  +
  +
* Собрать. Да, до сборки пакета руки не дошли. Увы.
  +
<PRE>
  +
make
  +
</PRE>
  +
  +
* Скопировать собранные файлы (sslh-fork и sslh-select) куда-то в $PATH, например в /usr/local/sbin
  +
<PRE>
  +
# ls -lsa /usr/local/sbin/
  +
total 172
  +
4 drwxr-xr-x. 2 root root 4096 Mar 9 16:37 .
  +
4 drwxr-xr-x. 12 root root 4096 Feb 23 16:45 ..
  +
76 -rwxr-xr-x 1 root root 76689 Mar 9 16:36 sslh-fork
  +
80 -rwxr-xr-x 1 root root 81064 Mar 9 16:36 sslh-select
  +
</PRE>
  +
  +
* <B>Не проверено! </B> установить capabilites
  +
<PRE>
  +
# setcap cap_net_bind_service,cap_net_admin+pe sslh-select
  +
</PRE>
  +
<PRE>
  +
# getcap /usr/local/sbin/*
  +
/usr/local/sbin/sslh-fork = cap_net_bind_service,cap_net_admin+ep
  +
/usr/local/sbin/sslh-select = cap_net_bind_service,cap_net_admin+ep
  +
</PRE>
  +
У меня нет уверенности что этот пункт является необходимым. Но проверить - не было времени.
  +
Подробнее (хотя и не очень внятно) написано тут: http://www.everycloudtech.com/sslh-sslssh-multiplexer
  +
  +
  +
* Скопировать init-script
  +
<PRE>
  +
cp scripts/etc.rc.d.init.d.sslh.centos /etc/rc.d/init.d/sslh
  +
</PRE>
  +
В скрите мне пришлось исправить пути (что бы они соответствовали умолчаниям). Возможно это все можно упростить поправив на стадии компиляции.
  +
<PRE>
  +
PROGNAME=sslh
  +
SSLH=${SSLH:-/usr/local/sbin/sslh-select}
  +
CONFIG=${CONFIG:-/etc/sslh/sslh.cfg}
  +
PIDFILE=${PIDFILE:-/var/run/sslh.pid}
  +
LOCKFILE=${LOCKFILE:-/var/lock/subsys/sslh}
  +
STOP_TIMEOUT=${STOP_TIMEOUT:-10}
  +
RETVAL=0
  +
</PRE>
  +
По какой-то причине конфиг в любом случае должен лежать в /etc/sslh/sslh.cfg что на первом этапе вызвало некоторые затруднения.
  +
Например процесс запущенный как
  +
<PRE>
  +
/usr/local/sbin/sslh-select -F /etc/sslh.cfg
  +
</PRE>
  +
все равно искал конфигурацию в /etc/sslh/sslh.cfg. <BR>
  +
Возможно это ошибка в программе, возможно - особенность моей сборки связанная с какой-либо из библиотек.
  +
==Настройка и запуск сервисов==
  +
===sshd===
  +
Так как 22 порт на внешнем интерфейсе будет использован для мультиплексирования, сам sshd переместить на lo.
  +
<PRE>
  +
Port 22
  +
ListenAddress 127.0.0.1
  +
</PRE>
  +
  +
===OpenVPN===
  +
В моем случае можно было ограничиться тем что OpenVPN работает на 0.0.0.0:1194, но для чистоты эксперимента его тоже перенес на lo:
  +
<PRE>
  +
local 127.0.0.1
  +
</PRE>
  +
  +
===sslh===
  +
C примером который из-коробки работает не все - его требуется отредактировать на предмет нерабочих опций (или я неправильно собрал?).
  +
<PRE>
  +
verbose: false;
  +
foreground: false;
  +
inetd: false;
  +
numeric: false;
  +
transparent: false;
  +
#timeout: 2;
  +
user: "nobody";
  +
pidfile: "/var/run/sslh.pid";
  +
  +
  +
# Change hostname with your external address name.
  +
listen:
  +
(
  +
{ host: "10.20.0.2"; port: "22"; }
  +
);
  +
  +
protocols:
  +
(
  +
{ name: "ssh"; service: "ssh"; host: "localhost"; port: "22"; },
  +
{ name: "openvpn"; host: "localhost"; port: "1194"; }
  +
);
  +
  +
</PRE>
  +
Отмечу, что попытка включить timeout вызывает крах программы как и попытка включить прозрачный режим.
  +
<BR>В остальном конфиг достаточно прост:
  +
* Если сервис ssh то отправить на 22 порт
  +
* Если сервис openvpn то отправить на 1194
  +
  +
<PRE>
  +
# netstat -ntpl | grep -E 'openvpn|ssh|sslh'
  +
tcp 0 0 127.0.0.1:1194 0.0.0.0:* LISTEN 1389/openvpn
  +
tcp 0 0 10.20.0.2:22 0.0.0.0:* LISTEN 4065/sslh-select
  +
tcp 0 0 127.0.0.1:22 0.0.0.0:* LISTEN 1013/sshd
  +
</PRE>
  +
  +
==Ссылки==
  +
* http://www.fedora.md/2013/04/14/использование-порта-443-несколькими-слу/
  +
* http://www.everycloudtech.com/sslh-sslssh-multiplexer
  +
* http://bernaerts.dyndns.org/linux/75-debian/210-debian-sslh
  +
* http://www.rutschle.net/tech/sslh.shtml

Текущая версия на 18:21, 24 июля 2024

Как запустить OpenVPN и SSHd на одном порту

Задача: Есть абстрактный сервер, и файрволл разрешает доступ на сервер только на 22 порт. С сервера доступна некая внутренняя сеть, с которой нужно работать. Файрволл - внешний и доступа к нему нет. Нужно обеспечить доступ к внутренней сети максимально простым способом

  • Постройка тунеля через ssh - http://wiki.sirmax.noname.com.ua/index.php/SSH_TUNNEL. Этот способ работает но не очень удобен. Кроме того, у меня случались подвисания туннелей и требовался перезапуск. В целом решение не слишком удобное хотя к плюсам можно отнести то что оно работает "из коробки".
  • Использовать мультиплексирование протоколов с помощью специального демона sslh (тема этой статьи)


Установка sslh

Для 6-й CentOS найти готовый пакет мне не удалось. Версия 1.17 - сходу не собралась, разбираться в причинах времени не было, взял из мастера.

  • Склонить исходники
git clone https://github.com/yrutschle/sslh.git

(8f39c106e18eccb66afa2288c4557d4947278538 - последний коммит на данный момент)

  • Для сборки мне пришлось доставить следующие пакеты:
# yum install gcc git libconfig-devel libconfig

В зависимости от системы список может отличаться

  • Собрать. Да, до сборки пакета руки не дошли. Увы.
make
  • Скопировать собранные файлы (sslh-fork и sslh-select) куда-то в $PATH, например в /usr/local/sbin
# ls -lsa /usr/local/sbin/
total 172
 4 drwxr-xr-x.  2 root root  4096 Mar  9 16:37 .
 4 drwxr-xr-x. 12 root root  4096 Feb 23 16:45 ..
76 -rwxr-xr-x   1 root root 76689 Mar  9 16:36 sslh-fork
80 -rwxr-xr-x   1 root root 81064 Mar  9 16:36 sslh-select
  • Не проверено! установить capabilites
# setcap cap_net_bind_service,cap_net_admin+pe sslh-select
# getcap /usr/local/sbin/*
/usr/local/sbin/sslh-fork = cap_net_bind_service,cap_net_admin+ep
/usr/local/sbin/sslh-select = cap_net_bind_service,cap_net_admin+ep

У меня нет уверенности что этот пункт является необходимым. Но проверить - не было времени. Подробнее (хотя и не очень внятно) написано тут: http://www.everycloudtech.com/sslh-sslssh-multiplexer


  • Скопировать init-script
cp scripts/etc.rc.d.init.d.sslh.centos /etc/rc.d/init.d/sslh

В скрите мне пришлось исправить пути (что бы они соответствовали умолчаниям). Возможно это все можно упростить поправив на стадии компиляции.

PROGNAME=sslh
SSLH=${SSLH:-/usr/local/sbin/sslh-select}
CONFIG=${CONFIG:-/etc/sslh/sslh.cfg}
PIDFILE=${PIDFILE:-/var/run/sslh.pid}
LOCKFILE=${LOCKFILE:-/var/lock/subsys/sslh}
STOP_TIMEOUT=${STOP_TIMEOUT:-10}
RETVAL=0

По какой-то причине конфиг в любом случае должен лежать в /etc/sslh/sslh.cfg что на первом этапе вызвало некоторые затруднения. Например процесс запущенный как

/usr/local/sbin/sslh-select -F /etc/sslh.cfg

все равно искал конфигурацию в /etc/sslh/sslh.cfg.
Возможно это ошибка в программе, возможно - особенность моей сборки связанная с какой-либо из библиотек.

Настройка и запуск сервисов

sshd

Так как 22 порт на внешнем интерфейсе будет использован для мультиплексирования, сам sshd переместить на lo.

Port 22
ListenAddress 127.0.0.1

OpenVPN

В моем случае можно было ограничиться тем что OpenVPN работает на 0.0.0.0:1194, но для чистоты эксперимента его тоже перенес на lo:

local 127.0.0.1

sslh

C примером который из-коробки работает не все - его требуется отредактировать на предмет нерабочих опций (или я неправильно собрал?).

verbose: false;
foreground: false;
inetd: false;
numeric: false;
transparent: false;
#timeout: 2;
user: "nobody";
pidfile: "/var/run/sslh.pid";


# Change hostname with your external address name.
listen:
(
    { host: "10.20.0.2"; port: "22"; }
);

protocols:
(
     { name: "ssh"; service: "ssh"; host: "localhost"; port: "22"; },
     { name: "openvpn"; host: "localhost"; port: "1194"; }
);

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

  • Если сервис ssh то отправить на 22 порт
  • Если сервис openvpn то отправить на 1194
# netstat  -ntpl | grep -E 'openvpn|ssh|sslh'
tcp        0      0 127.0.0.1:1194              0.0.0.0:*                   LISTEN      1389/openvpn
tcp        0      0 10.20.0.2:22                0.0.0.0:*                   LISTEN      4065/sslh-select
tcp        0      0 127.0.0.1:22                0.0.0.0:*                   LISTEN      1013/sshd

Ссылки