SSH ผ่าน HTTPS พร้อมกับ proxytunnel และ 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ซึ่งสามารถ multiplex ทราฟฟิกขาเข้าที่พอร์ต 443 ไปยัง Nginx (ฟังที่ 127.0.0.1:443), SSH หรือ OpenVPN ตรวจสอบให้แน่ใจว่าคุณปล่อยให้sslhฟังที่ที่อยู่ IP สาธารณะและไม่เปิดใน0.0.0.0ขณะที่ทับซ้อนกับ127.0.0.1:433ตำแหน่งที่ Nginx กำลังฟังอยู่

ตัวเลือกอื่นกำลังใช้ Squid แต่ฉันไม่มีประสบการณ์


0

ฉันไม่เคยเห็นการตั้งค่าชนิดนี้และฉันสงสัยว่ามันสามารถทำงานได้เพราะ nginx คาดว่าจะสามารถรักษาการเชื่อมต่อขาเข้าเป็น HTTP และพูดคุยกับ upstream ด้วย HTTP ทำไมคุณถึงต้องการใช้งานผ่าน nginx


2
มันควรจะเป็นไปได้ - proxytunnelใช้ในการทันเนล SSH ผ่านพร็อกซี่ HTTP (S) นี่คือการตั้งค่าเพื่อกำหนดค่านี้โดยใช้ apache
Thermionix

Apache ดูเหมือนว่าจะทำงานเป็นพร็อกซี HTTP จริงที่นั่นซึ่งฉันไม่คิดว่า nginx รองรับ (reverse proxying เท่านั้น)
mgorven

0

นี่เป็นคำถามเก่า แต่ก็ยังจริง :-)

ตามที่คนอื่น ๆ กล่าวถึงการตั้งค่านี้แทบจะไม่สามารถใช้ได้เนื่องจากขาดวิธีการเชื่อมต่อ HTTP ที่มีอยู่ใน Nginx

หมายเหตุ: Apache เว็บเซิร์ฟเวอร์รองรับการตั้งค่านี้

แต่สำหรับ Nginx มีวิธีแก้ปัญหาโดยไม่ต้อง sslh ฉันคิดว่าในรูปแบบของโมดูล Nginx ที่กำหนดเองซึ่งดำเนินการเชื่อมต่อ HTTP: https://github.com/chobits/ngx_http_proxy_connect_module

โดยการใช้สิ่งนี้คุณจะสามารถใช้ในการกำหนดค่า ssh ของคุณเท่านั้น ProxyCommand อย่างถูกต้อง

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.