В nginx 1.15.2 в модуль ngx_stream_ssl_preread была добавлена переменная $ssl_preread_protocol, которая определяет наибольшую версию протокола SSL/TLS, которую поддерживает клиент. При помощи новой переменной можно создавать конфигурации для доступа с использованием различных протоколов через один сетевой порт при проксировании трафика с использованием модулей http и stream. В частности, можно разделять обработчики для трафика на базе SSL и не использующего SSL (например, SSH).Для организации доступа по SSH и HTTPS через один сетевой порт 443 можно по умолчанию пробрасывать трафик на SSH, а если определена версия протокола TLSv1.2 пробрасывать на HTTPS:
stream {
upstream ssh {
server 192.0.2.1:22;
}upstream web {
server 192.0.2.2:443;
}
map $ssl_preread_protocol $upstream {
default ssh;
"TLSv1.2" web;
}# SSH и SSL на одном порту
server {
listen 443;
proxy_pass $upstream;
ssl_preread on;
}
}По аналогии можно настроить проброс через один сетевой порт для любых других сочетаний SSL/не-SSL протоколов, например, "HTTP/HTTPS", "TCP DNS/DNS over TLS" и т.п.
URL: https://www.nginx.com/blog/running-non-ssl-protocols-over-ss.../
Обсуждается: http://www.opennet.dev/tips/info/3071.shtml
Google: "SSH HTTPS multiplexing"
но зачем? 8-O
Например, чтобы пролезть оттуда, где вовне открыт доступ только на 80 и 443, на свой VDS
а тебе не ссыкотно?
обычно где вовне он так открыт - еще при входе заставляют подписать бумажку, что на работе надо заниматься работой, а не по своим vds лазать. И учти, что pa/checkpoint/cisco умеют отличать ssl от левого протокола на тех же портах, тем же самым (и не только) способом.впрочем, гораздо чаще - на дороге стоит дешифрующий прокси, и никакой ssh через него не пролезет в принципе.
а вот мобилы заставляют сдавать в камеру хранения гораздо позже.
Есть реальная безопасность, а есть заигравшиеся админы или, что гораздо чаще, банально стадартные полиси, не подходящие под половину реальных ситуаций. И подобными обходами пользуются тупо все - и для работы, и фоточки с котиками смотреть. И все об этом знают - ну просто потому, что это не криминал, а технически обойти проще, чем с бюрократией возиться. И быстрее - на месяцы. Соответственно, никакого DPI там нет в принципе, потому что тот, кто всё это настраивал, тоже понимал, скажем так, не универсальность требований.Я вообще ещё не видел ни одного случая, чтобы в более-менее крупной конторе возможно было эффективно работать, не нарушая букву полиси.
Впрочем, обычно проще, конечно, тупо на 443 поднять ssl vpn.
> Есть реальная безопасность, а есть заигравшиеся админы или, что гораздо чаще, банально
> стадартные полисии твоя стандартная подпись под ней. Ну и оно вот тебе - надо?
> И подобными обходами пользуются тупо все
потом начальству попадает возжа под хвост, админу надо на кого-то свалить проблему с вирусом, положившим пол-сети, меняется младший оператор зонда в отделе иб, или ты не так с кем-то здороваешься - и увольняют по статье, велев радоваться, что не заставили компенсировать "ущерб".
Ну и насчет "все" это явное преувеличение. Тетки в бухгалтерии тоже настраивают себе ssh на левых vps?
> Я вообще ещё не видел ни одного случая, чтобы в более-менее крупной конторе возможно было
> эффективно работать, не нарушая букву полиси.я видел и работаю. интернет доступен в силу служебного положения, флэшки - нет. Ну и хер с ними.
Нужен конфиг vpn дома - ок, идем к начальству, оно допущено к актам владения переносными носителями. Нет на месте - значит, vpn из дома у меня пока не будет. За это еще никого не уволили.не путать буквы с личными фанабериями админчиков - этим успешно можно прищемить хвост или игнорировать предоставляемый ими сервис. Но если подписал бумажку, что доступ в интернет строго для работы, потребные для работы сайты прилагаются списком - глупо наживать себе неприятности, да еще столь череззадничными методами.
а для дpoчева на опеннете есть мобило. Если и его заставляют сдавать при входе - нафига ж было там работать?
Да никто не заставляет мобилы сдавать. Речь об обычных больших айтишных конторах, где "глобальная" полиси вечно конфликтует с нуждами и удобствами конкретных проектов, и в мелочах никто её не энфорсит, так как невозможно и половина разработчикв уволится на фиг из такого концлагеря (и найдёт себе другую работу за пару недель). Что там у тёток в бухгалтерии мне вообще не интересно, речь об айтишных решениях на айтишном ресурсе. А вот где точно не надо работать, так это там, где могут попытаться уволить, потому что "не так с кем-то здороваешься" и т.п. Благо, для программиста есть вагон более привлекательных вариантов, где даже в случае каких-то проблем сначала минимум пару раз вежливо пообщаются, и только потом, если не договоритесь, разорвут контракт.
А вы не думали что есть юзкейсы кроме того что ты раб который пyкнуть боится чтобы с работы по статье не пойти?
Ну и страдай, трепеща перед "начальством" и подписывая разрешения на каждый поход в сортир. Такие конторы издалека видно ещё на собеседовании (а то и до него). И я искренне не понимаю тех мазохистов, которые идут туда работать.
Туда всякие поцреоты идут.
почему нельзя просто на свой vds повесить sshd на 443 порт?
А вдруг там уже сайтик висит имени Васи Пупкина?
А есть ли возможность сделать подобное с витруальными-хостами ( server_name )? Например крутятся во многих lxc разные сайты и мы хотим давать доступ и по https и по ssh через единый nginx на хост системе
Ага , вот тут наспиано как это сделать
http://nginx.org/en/docs/stream/ngx_stream_ssl_preread_modul...как я понял , можно написать еще один map по ssl_preread_server_name
> как я понял , можно написать еще один map по ssl_preread_server_nameнельзя, нет в ssh никакого "server name".
> А есть ли возможность сделать подобное с витруальными-хостами ( server_name )?нет. да и зачем?
> Например крутятся во многих lxc разные сайты и мы хотим
для этого есть sni, который прекрасно работает без этих ненужно-фокусов.
> давать доступ и по https и по ssh через единый nginx
а для ssh нет sni, да и не парсит его nginx, просто откидывая как "не-ssl" - поэтому попасть по ssh ты сможешь только на кого-то одного. Например на саму хост-систему, было бы чего ради огород-то городить...
Это получается, что если долбиться в 443 порт как SSL (2,3), TLS (1.0,1.1) или любым другим, не TLS 1.2 образом, то всё это будет скормлено sshd? А ему не поплохеет? Молодцы...
Если вашему sshd поплохеет из-за того, что ему от неаутентифицированного клиента прилетит в сокет мусор, то у вас какой-то неправильный sshd.
Обычное количество HTTP запросов не идёт ни в какое сравнение с числом таковых же по SSH. Фактически, в статье описан рецепт, как сделать DOS на свой же сервер. Правильнее было сделать наоборот - воспринимать все обращения по умолчанию, как HTTP запросы.
> Правильнее было сделать наоборот - воспринимать
> все обращения по умолчанию, как HTTP запросы.а они не могут. Там суть не в "по умолчанию" а в "нешмалга я распознать".
то есть единственное, что можно сделать, если уж задаться целью спасти доступ васяна к его ssh - это перечислять абсолютно все распознаваемые (regex або поштучно), а ssh по прежнему валить в default - его нечем матчить.
если бы авторы этого странного кода действительно имели ту же цель, что и васян, они бы добавили значение "unknown", отдельное от "default". Но у них явно была какая-то другая задача, а пример писал менеджер по рекламе, поэтому такая фигня и написана.
да не переживайте так, васян-vds'у на котором этот конфиг бездумно скопипастили, чтобы "обойти систему", в общем-то пофиг. В том числе и тот факт, что пользователи неправильных браузеров сайта не увидят.а реальные применения препарсера - они для ids каких-нибудь имеют смысл, защит от атак ("ssl2 роняем на пол, это точно не человек, странные протоколы отправляем в один балансер, нормальные, реально используемые большинством юзеров - в другой"), еще чего в этом же роде - и там, уверяю, не ssh будет принимать default ;-)
Ну ты же умнее автора примера, небось сообразишь как остальные версии прописать?
Так, а для чего это делать? Не, серьезно -- для чего?
security by obscurity
Коллега, неопытный администратор, которому кто-то выслал доступ к серверу в виде "root@blahblah -p443" начал править конфиги nginx и ошибся, не выполнив nginx -t, совершив синтаксическую ошибку рестартанул веб-сервер. Дальше, додумаете сами.Не проще ли использовать порт, к примеру, 22732 + доступ по ключу?
> Не проще ли использовать порт, к примеру, 22732 + доступ по ключу?Порт может быть закрыт, а ключ можно украсть вместе с компом. Паролить ключ - это уже почти то же самое, что заходить по паролю. Только пароль нужно держать в голове или в программе для хранения паролей со стойким паролем, опять же - в голове.
>> Не проще ли использовать порт, к примеру, 22732 + доступ по ключу?
> Порт может быть закрыт, а ключ можно украсть вместе с компом. Паролить
> ключ - это уже почти то же самое, что заходить по
> паролю. Только пароль нужно держать в голове или в программе для
> хранения паролей со стойким паролем, опять же - в голове.Откройте порт -- в чем проблема?
Ну, если есть сложности с запоминанием пароля )Просто на порт !=22 меньше "китайцев" будет стучать.
Я про то, что смысла стримить трафик ssh через nginx нет, это как-то неправильно
> Откройте порт -- в чем проблема?Описанный в статье рецепт относится к ситуации, когда на хостинге открыты только заданные порты и изменить это нельзя.
> Я про то, что смысла стримить трафик ssh через nginx нет, это как-то неправильно
Конечно неправильно и где-то даже отдаёт идиотизмом.
>Описанный в статье рецепт относится к ситуации, когда на хостинге открыты только заданные порты и изменить это нельзя.Мы говорим о хостинге или сервере (аппаратном, виртуализированном)? Если о хостинге, то Вам никто не даст стримить ssh через nginx
> Мы говорим о хостинге или сервере (аппаратном, виртуализированном)?Вообще говоря - нужно спросить у автора, для какого случая это всё.
> Если о хостинге, то Вам никто не даст стримить ssh через nginx
Это может быть хостинг сервер с полным доступом, но пофайерволленный политикой компании и т.п.
> Паролить ключ - это уже почти то же самое, что заходить по паролю.Вас обманули. Пасс-фраза вводится один раз при авторизации в системе, опционально после каждой разблокировки экрана. А к хостам подключаетесь посредством ssh host ;)
> Вас обманули. Пасс-фраза вводится один раз при авторизации в системе, опционально после
> каждой разблокировки экрана. А к хостам подключаетесь посредством ssh host ;)Вы сами себя обманули. Это от клиента зависит, как он работает с паролем к ключу.
От наличия и настроек ssh-agent, если уж так говорить.
> Вы сами себя обманули. Это от клиента зависит, как он работает с
> паролем к ключу.Разумеется я имел ввиду клиент из комплекта OpenSSH, там именно так как я написал. Используйте агент и не сочиняйте нам тут. :)
> nginx и ошибся, не выполнив nginx -t, совершив синтаксическую ошибку рестартанул веб-сервер.И nginx не рестартанул, а остался работать со старым конфигом, так как именно так он себя и ведет в приличных системах. Проверено электрониками.
омг, restart != reload.
вы описали поведение для reload'а, а при restart'е выполняется остановка процесса и его запуск.
поэтому если конфиг битый запуск завершается с ошибкой.
Зависит от ОС.
В нормальных - при restart'е перед стопом делается nginx -t.
https://i.imgur.com/7hWAYId.png
да, все получилось
> Так, а для чего это делать? Не, серьезно -- для чего?А почему нет-то? Мало ли откуда приспичит до сервера достучаться, и может там все кроме 80/443 блокируют.
https://github.com/google/huproxy
Есть же sslh для этого.
А как быть в ситуации если есть сервак с белым IP, а на нем 10 вируталок с сервми IP... И нужно ходить из вне на них по SSH?