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 "-" "-"
Thermionix
источник

Ответы:

10

Nginx не поддерживает прямые запросы прокси (метод HTTP CONNECT), поэтому вы получаете ответ «Bad request» от 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, но у меня там нет опыта.

vdboor
источник
0

Я никогда не видел такой установки, и я сомневаюсь, что она может работать, потому что nginx ожидает, что сможет обрабатывать входящее соединение как HTTP и общаться с восходящим потоком через HTTP. Почему вы хотите прокси через nginx?

mgorven
источник
2
Это должно быть возможно - proxytunnel используется для туннелирования сеансов 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 только ProxyCommand.

Kensai
источник