Я пытаюсь настроить соединение ssh через https с помощью nginx. Я не нашел ни одного рабочего примера, так что любая помощь будет признательна!
~$ cat .ssh/config
Host example.net
Hostname example.net
ProtocolKeepAlives 30
DynamicForward 8118
ProxyCommand /usr/bin/proxytunnel -p ssh.example.net:443 -d localhost:22 -E -v -H "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)"
~$ ssh user@example.net
Local proxy ssh.example.net resolves to 115.xxx.xxx.xxx
Connected to ssh.example.net:443 (local proxy)
Tunneling to localhost:22 (destination)
Communication with local proxy:
-> CONNECT localhost:22 HTTP/1.0
-> Proxy-Connection: Keep-Alive
-> User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Win32)
<- <html>
<- <head><title>400 Bad Request</title></head>
<- <body bgcolor="white">
<- <center><h1>400 Bad Request</h1></center>
<- <hr><center>nginx/1.0.5</center>
<- </body>
<- </html>
analyze_HTTP: readline failed: Connection closed by remote host
ssh_exchange_identification: Connection closed by remote host
Конфигурация Nginx на сервере;
~$ cat /etc/nginx/sites-enabled/ssh
upstream tunnel {
server localhost:22;
}
server {
listen 443;
server_name ssh.example.net;
location / {
proxy_pass http://tunnel;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_redirect off;
}
ssl on;
ssl_certificate /etc/ssl/certs/server.cer;
ssl_certificate_key /etc/ssl/private/server.key;
}
~$ tail /var/log/nginx/access.log
203.xxx.xxx.xxx - - [08/Feb/2012:15:17:39 +1100] "CONNECT localhost:22 HTTP/1.0" 400 173 "-" "-"
Nginx не поддерживает запросы прямого прокси (метод HTTP CONNECT), поэтому вы получаете ответ «Плохой запрос» от Nginx. Proxytunnel может подключаться к Nginx, но оттуда он останавливается. AFAIF, авторы Nginx не планируют поддерживать запросы прямого прокси-сервера, поскольку им нравится специализироваться на обслуживании HTTP. У Apache есть модули для всего остального, что дает вам свободу использовать эти экзотические функции.
Вы можете посмотреть на sslh, который может мультиплексировать входящий трафик с порта 443 либо на Nginx (прослушивает 127.0.0.1:443), либо на SSH, либо на OpenVPN. Убедитесь, что вы позволили sslh
слушать на общедоступном IP-адресе, а не на 0.0.0.0
поскольку это пересекается с 127.0.0.1:433
где слушает Nginx.
Другой вариант - использовать Squid, но у меня нет опыта.
Это старый вопрос, но все же актуальный :-)
Как уже упоминалось, эта настройка вряд ли будет доступна из-за отсутствия метода HTTP CONNECT, доступного в Nginx.
ПРИМЕЧАНИЕ. Веб-сервер Apache поддерживает эту настройку.
Но для Nginx есть решение без sslh, я думаю в виде настраиваемого модуля Nginx, который реализует HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module
Используя это, вы сможете правильно использовать в своей конфигурации ssh только ProxyCommand.
Я никогда не видел такой настройки и сомневаюсь, что она может работать, потому что nginx ожидает, что сможет обрабатывать входящее соединение как HTTP и разговаривать с восходящим потоком по HTTP. Почему вы хотите использовать прокси через nginx?