SSH через HTTPS з прокситуннелем та nginx


15

Я намагаюся встановити 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 "-" "-"

Відповіді:


10

Nginx не підтримує прямі запити проксі (метод HTTP CONNECT), тому ви отримуєте відповідь "Неправильний запит" від Nginx. Proxytunnel здатний підключитися до Nginx, але звідти він зупиняється. AFAIF автори Nginx не планують підтримувати запити проксі-проксі, оскільки вони люблять спеціалізуватися на обслуговуванні HTTP дуже добре. У Apache є модулі для всього іншого, що дає вам свободу використовувати ці екзотичні функції.

Ви можете подивитися на sslh , який може мультиплексувати вхідний трафік через порт 443 або до Nginx (прослуховування в 127.0.0.1:1043), SSH або OpenVPN. Переконайтеся, що ви дозволяєте sslhслухати за загальнодоступною IP-адресою, а не на 0.0.0.0тому, що перетинається з тим, 127.0.0.1:433де слухає Nginx.

Інший варіант - використання кальмарів, але я не маю там досвіду.


0

Я ніколи не бачив подібних налаштувань і сумніваюся, що це може працювати, тому що nginx розраховує, що зможе трактувати вхідне з'єднання як HTTP та спілкуватися з потоком HTTP за версією. Чому ви хочете проксі через nginx?


2
Це повинно бути можливо - прокситуннел використовується для тунелю сеансів SSH через проксі-сервери HTTP (S). Ось налаштування для налаштування цього за допомогою apache
Thermionix

Здається, Apache працює як фактичний проксі-сервер HTTP, який я не думаю, що nginx підтримує (лише зворотне проксі).
mgorven

0

Це старе питання, але все ще актуальне :-)

Як згадували інші, ця настройка навряд чи буде доступною через відсутність методу HTTP CONNECT, доступного в Nginx.

ПРИМІТКА: Веб-сервер Apache підтримує цю налаштування.

Але, для Nginx є рішення без sslh, я думаю, у формі користувацького модуля Nginx, який реалізує HTTP CONNECT: https://github.com/chobits/ngx_http_proxy_connect_module

Використовуючи це, ви зможете належним чином використовувати у своєму ssh config лише ProxyCommand.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.