จะกำหนดค่า NGINX เป็น reverse proxy สำหรับหมายเลขพอร์ตอื่นได้อย่างไร


15
I have NGINX configured like this as a reverse proxy for http requests:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}

ฉันต้องการพร็อกซี ssh (พอร์ต 22) ด้วย ฉันสามารถเพิ่มเซิร์ฟเวอร์บล็อกอื่นเช่นนี้ในไฟล์การกำหนดค่าเดียวกันได้ไหม

server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

เช่นนั้นผลลัพธ์ที่ได้คือ:

server {
    listen 80;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:3000;
    }
}
server {
    listen 22;
    server_name 203.0.113.2;

    proxy_set_header X-Real-IP  $remote_addr; # pass on real client IP

    location / {
        proxy_pass http://203.0.113.1:22;
    }
}

TIA,
Ole


2
nginxกำลังทำหน้าที่เป็นhttpตัวแทน หากคุณตั้งค่าให้ย้อนกลับพอร์ตพร็อกซี 22 มันจะไม่อนุญาตให้คุณผ่านทราฟฟิก SSH - ทราฟhttpฟิกไปยังเซิร์ฟเวอร์ SSH เท่านั้นซึ่งจะล้มเหลวอย่างเห็นได้ชัด
garethTheRed

ไปตรวจสอบHAProxy

คำตอบ:


13

โปรโตคอล SSHไม่ได้ขึ้นกับ HTTP และเป็นเช่นนี้ไม่สามารถผ่านพร็อกซีปกติproxy_passของngx_http_proxy_module

อย่างไรก็ตามเมื่อเร็ว ๆ นี้เริ่มต้นด้วยnginx 1.9.0 (ปล่อยอย่างเสถียรด้วย 1.10.0 เมื่อ 2016-04-26), nginx ได้รับการสนับสนุนสำหรับการทำproxying กระแสข้อมูล TCPซึ่งหมายความว่าถ้าคุณมีรุ่น nginx ที่เพียงพอล่าสุด ในความเป็นจริงคุณสามารถเชื่อมต่อพร็อกซี ssh กับมันได้ (อย่างไรก็ตามโปรดทราบว่าคุณจะไม่สามารถเพิ่มสิ่งใด ๆ เช่นการX-Real-IPเชื่อมต่อไปยังพร็อกซีเนื่องจากไม่ได้ใช้ HTTP)

สำหรับข้อมูลเพิ่มเติมและตัวอย่างลองดูที่:


8

ตั้งแต่ Nginx เวอร์ชัน 1.9.0, NGINX รองรับโมดูล ngx_stream_core_module จึงควรเปิดใช้งานด้วย --with-stream เมื่อเปิดใช้งานโมดูลการสตรีมจะสามารถใช้ ssh โปรโตคอล tcp proxy ได้

stream {
    upstream ssh {
        server 192.168.1.12:22;
    }
        server {
        listen        12345;
        proxy_pass    ssh;

    }

}

https://www.nginx.com/resources/admin-guide/tcp-load-balancing/


นั่นเป็นคุณสมบัติที่ดีของ nginx - แต่ IMHO มันไร้ประโยชน์เมื่อคุณต้องการให้ reverse proxy ตัวจริงอย่าง nginx ทำงานได้สมบูรณ์แบบสำหรับ HTTP สิ่งที่เป็นวิธีการสตรีมนั้นเรียบง่าย NAT - ดังนั้นฉันจึงอยากทำงานที่ขอบเราเตอร์ สิ่งที่ฉันต้องการ / มีที่นี่ - เป็นคุณสมบัติที่แน่นอนเหมือนกันกับ HTTP reverse proxy กล่าวอีกนัยหนึ่งฉันมีที่อยู่ IP สาธารณะเดียวเท่านั้นดังนั้นพอร์ต 22 จึงมีประโยชน์สำหรับเครื่องเดียวเท่านั้น แต่หากมีวิธีแยกแยะคำขอในแบบฟอร์มssh me@srv1.my.netและssh me@srv2.my.net- จะดีมาก มันเป็นข้อ จำกัด โพรโทคอล (SSH จะไม่ให้ไคลเอ็นต์ชื่อ DNS ใช้)
stamster

@stamster คุณสามารถทำสิ่งเดียวกันได้เกือบแล้วโดยใช้หมายเลขพอร์ตที่แตกต่างกัน (เช่น 122 สำหรับsrv1และ 222 สำหรับsrv2) หรือโดยใช้เซสชัน ssh ที่ซ้อนกันซึ่งคุณ ssh แรกในเซิร์ฟเวอร์สาธารณะ / IP และจากที่นั่น ssh เป็นใบไม้; เช่นssh user@example.org 'ssh user@192.168.5.1'.
cnst

1
ไม่ความต้องการ / แนวคิดคือใช้พอร์ตเริ่มต้น (22 หรือบริการอื่น ๆ .. ) เป็นพอร์ตปลายทางจากนั้นจึงกำหนดเส้นทางทราฟฟิกตามชื่อ DNS หรือมากกว่านั้น เช่นเดียวกับเราทุกคนใช้ nginx เป็นเว็บพร็อกซีเซิร์ฟเวอร์ http ย้อนกลับดังนั้นแต่ละโดเมนจะกำหนดเป้าหมายพอร์ตเริ่มต้นที่ 80, 443 และจากนั้น nginx จะกำหนดเส้นทางการรับส่งข้อมูลขึ้นอยู่กับกฎพร็อกซี แน่นอนว่าลูกค้ามีHOSTส่วนหัวดังนั้นจึงเป็นเรื่องง่ายที่จะแยกแยะว่าไซต์ใดที่เป็นเป้าหมาย ... เซสชันที่ซ้อนกันของ SSH นั้นเป็นวิธีแก้ปัญหา แต่เป็นวิธีที่ยุ่งเหยิง ฉันจบลงด้วยพอร์ตที่แตกต่างกันบนเครือข่ายของเรา - NAT เก่าที่ดีในฐานะ KISS และโซลูชั่นที่น่าเชื่อถือที่สุด
เริ่ม
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.