Ssh and openvpn on the same port: различия между версиями
Sirmax (обсуждение | вклад) |
Sirmax (обсуждение | вклад) Метка: ручная отмена |
||
| (не показано 9 промежуточных версий этого же участника) | |||
| Строка 5: | Строка 5: | ||
Задача: Есть абстрактный сервер, и файрволл разрешает доступ на сервер только на 22 порт. С сервера доступна некая внутренняя сеть, с которой нужно работать. |
Задача: Есть абстрактный сервер, и файрволл разрешает доступ на сервер только на 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