Sshttps: stealth/sshttp: SSH/HTTP(S) multiplexer. Run a webserver and a sshd on the same port w/o changes.

разное/sshttps на мастере · StalkR/разное · GitHub

#! /бин/ш
### НАЧАЛО ИНФОРМАЦИИ
# Предоставляет: sshttps
# Обязательный запуск: $remote_fs $syslog
# Обязательная остановка: $remote_fs $syslog
# Старт по умолчанию: 2 3 4 5
# Стоп по умолчанию: 0 1 6
# Краткое описание: мультиплексор sshttps SSH/HTTPS
# Описание: мультиплексор sshttps SSH/HTTPS
### КОНЕЦ ИНФОРМАЦИИ
# Автор: StalkR net>
# НЕ «устанавливайте -e»
# PATH должен включать /usr/* только в том случае, если он запускается после сценария mountnfs.sh
ПУТЬ=/sbin:/usr/sbin:/bin:/usr/bin
DESC=»мультиплексор sshttps SSH/HTTPS»
ИМЯ=sshttps
DAEMON=/usr/local/sbin/$ИМЯ
ИМЯ СЦЕНАРИЯ=/etc/init.d/$ИМЯ
# Выйти, если пакет не установлен
[-x «$DAEMON» ] || выход 0
# Чтение файла переменных конфигурации, если он присутствует
[ -r /etc/default/$NAME ] && . /etc/по умолчанию/$ИМЯ
DAEMON_ARGS=»-S $SSH_PORT -H $HTTP_PORT -L $LISTEN_PORT -U $USER -R $CHROOT»
[-d $CHROOT] || mkdir -p $CHROOT
# Загрузить настройку VERBOSE и другие переменные rcS
. /lib/init/vars.sh
# Определить функции LSB log_*.
# Зависит от lsb-base (>= 3.2-14), чтобы убедиться, что этот файл присутствует
# и status_of_proc работает.
. /lib/lsb/init-функции
#
# Функция, запускающая демон/службу
#
do_start()
{
# Возврат
# 0 если запущен демон
# 1, если демон уже запущен
# 2, если демон не может быть запущен
start-stop-daemon —start —quiet —exec $DAEMON —test > /dev/null \
|| возврат 1
старт-стоп-демон —start —quiet —exec $DAEMON — \
$DAEMON_ARGS \
|| возврат 2
если ! показать правило IP | grep -q «поиск $TABLE»; затем
ip rule add fwmark $MARK lookup $TABLE
фи
если ! ip route показать таблицу $TABLE | grep -q «по умолчанию»; затем
ip route add local 0. 0.0.0/0 dev lo таблица $TABLE
фи
}
# Функция, которая останавливает демон/службу
#
do_stop()
{
, если правило IP показывает | grep -q «поиск $TABLE»; затем
ip rule del fwmark $MARK lookup $TABLE
фи
, если ip route показывает таблицу $TABLE | grep -q «по умолчанию»; затем
ip route del local 0. 0.0.0/0 dev lo таблица $TABLE
фи
# Возврат
# 0, если демон был остановлен
# 1 если демон уже остановлен
# 2, если демон не может быть остановлен
# другое, если произошел сбой
start-stop-daemon —stop —quiet —exec $DAEMON —retry=TERM/30/KILL/5 —name $NAME
вернуть «$?»
}
чехол «1$» в
старт)
[ «$VERBOSE» != no ] && log_daemon_msg «Запуск $DESC» «$NAME»
do_start
случай «$?» в
0|1) [ «$VERBOSE» != нет ] && log_end_msg 0 ;;
2) [ «$VERBOSE» != нет ] && log_end_msg 1 ;;
esac
;;
стоп)
[ «$VERBOSE» != no ] && log_daemon_msg «Останов $DESC» «$NAME»
do_stop
случай «$?» в
0|1) [ «$VERBOSE» != нет ] && log_end_msg 0 ;;
2) [ «$VERBOSE» != нет ] && log_end_msg 1 ;;
esac
;;
статус)
status_of_proc «$DAEMON» «$NAME» && exit 0 || выйти $?
;;
перезапуск|принудительная перезагрузка)
log_daemon_msg «Перезапуск $DESC» «$NAME»
do_stop
случай «$?» в
0|1)
do_start
случай «$?» в
0) log_end_msg 0 ;;
1) log_end_msg 1 ;; # Старый процесс все еще работает
*) log_end_msg 1 ;; # Не удалось запустить
esac
;;
*)
# Не удалось остановить
log_end_msg 1
;;
esac
;;
*)
echo «Использование: $SCRIPTNAME {start|stop|status|restart|force-reload}» >&2
выход 3
;;
esac
:

Блог StalkR: Мультиплексирование SSH/HTTP(S) с помощью sshttp

Себастьян Крамер (@steaIth, c-skills) создал и выпустил отличный мультиплексор SSH/HTTP(S): sshttp. Такая программа необходима, когда вы хотите поделиться своим портом HTTP (или HTTPS) с SSH, чтобы иметь возможность использовать SSH, когда вы находитесь за сетью, которая разрешает только исходящие подключения к HTTP (или HTTPS) и не беспокоит проверку протокола. Узнайте больше, прочитав файл readme.

Раньше я использовал sslh, но у sshttp есть убийственная функция: он использует функцию Linux IP_TRANSPARENT с обманом netfilter (маркировка + конкретная таблица маршрутизации) для передачи исходного IP-адреса получателю (sshd или httpd), что означает, что ваши журналы по-прежнему показывают исходный IP-адрес ( а не 127.0.0.1). Поскольку это отличная программа, которую не обязательно легко настроить (еще не упаковано?), в этом посте я делюсь своей настройкой.

Как это работает?

При использовании HTTP клиент говорит первым (запрос GET/POST/и т. д.), тогда как при использовании SSH первым говорит сервер (баннер). Точно так же HTTPS использует протокол SSL/TLS, где клиент говорит первым (9). 0645 ClientHello ). Используя это свойство и немного подождав, мультиплексор может определить, следует ли отправлять трафик на сервер SSH или сервер HTTP/HTTPS.

Настройка

У меня есть основной маршрутизатор/брандмауэр перед локальной сетью, где находится сервер с ssh/http/https. Я держу свой веб-сервер работающим на портах по умолчанию (80/443), а также ssh (22). Я хочу мультиплексировать как по http, так и по https, поэтому у меня будет два демона, работающих на 2280 и 2244. Поскольку sshttp требует INPUT DROP на портах, на которые перенаправляется трафик, и я хочу сохранить нормальный доступ по ssh на порту 22, я открываю два порта для ssh: 228 для sshttp и 224 для sshttps.

 [HTTP]
           _____ ______
 порт 80 | | порт 2280 | |
--------> | НАТ | ----------> | серв | sshttp слушает на 2280
          |_____| |______| ||
                                            /- мультиплекс -\
                                           / \
                                    http сервер ssh сервер
                                  слушаю на 80 слушаю на 228

 
 [HTTPS]
           _____ ______
порт 443 | | порт 2244 | |
--------> | НАТ | ----------> | серв | sshttps прослушивает 2244
          |_____| |______| ||
                                            /- мультиплекс -\
                                           / \
                                   https сервер ssh сервер
                                 слушаю на 443 слушаю на 224

 

Установка

Компиляция из исходников на github:

 $ cd /usr/local/src
$ git клон https://github. com/stealth/sshttp
$ cd sshttp
$ сделать
$ cp sshttpd /usr/local/sbin/sshttp
$ cp sshttpd /usr/local/sbin/sshttps
 

Примечание: разные имена файлов и отсутствие жестких ссылок или start-stop-daemon недовольны…

Добавьте выделенные учетные записи пользователей для двух демонов:

 $ adduser --system --ingroup nogroup \
  --home /var/run/sshttp --no-create-home sshttp
$ adduser --system --ingroup без группы \
  --home /var/run/sshttps --no-create-home sshttps
 

Скрипты инициализации в стиле Debian /etc/init.d/sshttp и /etc/init.d/sshttps:

 $ cd /etc/init.d
$ wget https://raw.github.com/StalkR/misc/master/sshttp/etc/init.d/sshttp
$ wget https://raw.github.com/StalkR/misc/master/sshttp/etc/init.d/sshttps
 

Установите их с помощью новой инициализации на основе зависимостей:

 $ insserv sshttp
$ insserv sshttps
 

Или старая школа:

 $ update-rc. d sshttp по умолчанию
$ update-rc.d sshttps по умолчанию
 

Конфигурация

Конфигурация по умолчанию для /etc/default/sshttp/etc/default/sshttps:

 $ cd /etc/default
$ wget https://raw.github.com/StalkR/misc/master/sshttp/etc/default/sshttp
$ wget https://raw.github.com/StalkR/misc/master/sshttp/etc/default/sshttps
 

Все просто:

 $ cat /etc/default/sshttp
SSH_PORT=228
HTTP_PORT=80
LISTEN_PORT=2280
USER=sshttp
CHROOT=/var/run/sshttp
ОТМЕТКА=1
ТАБЛИЦА=80
 
 $ кошка /etc/default/sshttps
SSH_PORT=224
HTTP_PORT=443
LISTEN_PORT=2244
USER=sshttps
CHROOT=/var/run/sshttps
ОТМЕТКА=2
ТАБЛИЦА=443
 

Далее стоит настроить iptables, маркировку и маршрутизацию. Я использую ferm (для простого создания правил) в качестве внешнего интерфейса для iptables, и я очень рекомендую его. Если вы знакомы с iptables, он дает вам возможность легко выполнять сложный набор правил и поставляется с простым сценарием инициализации для безопасного запуска/остановки/перезагрузки брандмауэра. Гораздо лучше во многих отношениях, чем эти ручные сценарии iptables.sh .

Итак, вот правила sshttp для интеграции с вашим /etc/init.d/ferm.conf:

 IP-адрес домена {
  # ссhttp
  стол мангл {
    chain OUTPUT { proto tcp externalface eth0 sport (80 228) jump SSHTTP; }
    цепочка PREROUTING { proto tcp sport (80 228) mod socket jump SSHTTP; }
    цепочка SSHTTP { MARK set-mark 0x1; ПРИНИМАТЬ; } # 1-й бит
  }
  # ссhttps
  стол мангл {
    chain OUTPUT { proto tcp externalface eth0 sport (443 224) jump SSHTTPS; }
    chain PREROUTING { proto tcp sport (443 224) mod socket jump SSHTTPS; }
    цепочка SSHTTPS { MARK set-mark 0x2; ПРИНИМАТЬ; } # 2-й бит
  }
}

 

Наконец, откройте выделенные ssh-порты sshttp и sshttps, добавив в /etc/ssh/sshd_config :

 порт 228 # sshttp
Порт 224 # sshttps
 

Выполнить

Перезагрузить брандмауэр, ssh и запустить мультиплексоры:

 $ invoke-rc.