#! /бин/ш | |
### НАЧАЛО ИНФОРМАЦИИ | |
# Предоставляет: sshttps | |
# Обязательный запуск: $remote_fs $syslog | |
# Обязательная остановка: $remote_fs $syslog | |
# Старт по умолчанию: 2 3 4 5 | |
# Стоп по умолчанию: 0 1 6 | |
# Краткое описание: мультиплексор sshttps SSH/HTTPS | |
# Описание: мультиплексор sshttps SSH/HTTPS | |
### КОНЕЦ ИНФОРМАЦИИ | |
# Автор: StalkR | |
# НЕ «устанавливайте -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.