Wie konfiguriere ich NGINX als Reverse Proxy für verschiedene Portnummern?


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;
    }
}

Ich möchte auch ssh (Port 22) -Anfragen proxen. Kann ich der gleichen Konfigurationsdatei einen weiteren Serverblock wie diesen hinzufügen:

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;
    }
}

So dass das Endergebnis ist:

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
nginxhandelt als httpProxy. Wenn Sie den Proxy-Port 22 auf "Reverse" setzen, können Sie keinen SSH-Datenverkehr httpweiterleiten - nur Datenverkehr zum SSH-Server, der offensichtlich ausfällt.
garethTheRed

Schauen Sie sich HAProxy an .

Antworten:


12

Das ssh-Protokoll basiert nicht auf HTTP und kann als solches nicht durch das reguläre proxy_passvon vertreten werdenngx_http_proxy_module

Doch vor kurzem, beginnend mit nginx 1.9.0 (veröffentlicht als stabil mit 1.10.0 auf 2016.04.26), nginx hat Verstärkung Unterstützung dafür TCP - Stream proxying, was bedeutet , dass , wenn Sie eine aktuelle-genug - Version von nginx haben, Sie können tatsächlich Proxy-SSH-Verbindungen damit herstellen (beachten Sie jedoch, dass Sie X-Real-IPder Proxy-Verbindung nichts Ähnliches hinzufügen können , da dies nicht auf HTTP basiert).

Weitere Informationen und Beispiele finden Sie unter:


8

Seit Nginx Version 1.9.0 unterstützt NGINX das Modul ngx_stream_core_module und sollte mit --with-stream aktiviert werden. Wenn das Stream-Modul aktiviert ist, können sie das TCP-Proxy-Protokoll ssh verwenden

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/


Das ist alles eine nette Funktion von Nginx - aber IMHO ist es nutzlos, wenn Sie einen echten Reverse-Proxy haben möchten, wie Nginx perfekte Arbeit für HTTP leistet. Die Sache ist, Streams Ansatz ist einfach NAT - also würde ich diese Aufgabe lieber auf Edge-Router tun. Was ich hier haben möchte / möchte - ist genau das gleiche Feature wie HTTP-Reverse-Proxy. Mit anderen Worten, ich habe nur eine öffentliche IP - Adresse - also 22 Port Erfolg nur für eine Maschine - aber wenn es eine Möglichkeit, auf Anfragen in einer Form zu unterscheiden ssh me@srv1.my.netund ssh me@srv2.my.net- es wäre toll. Es handelt sich um eine Protokollbeschränkung (SSH gibt die DNS-Namen, die der Client verwendet, nicht weiter)
stamster

@stamster, Sie können bereits fast dasselbe tun, indem Sie entweder verschiedene Portnummern verwenden (z. B. 122 für srv1und 222 für srv2), oder indem Sie verschachtelte ssh-Sitzungen verwenden, in denen Sie zuerst in den öffentlichen Server / die öffentliche IP ssh und von dort aus ssh in die Blätter; zB ssh user@example.org 'ssh user@192.168.5.1'.
15.

1
Nein, die Anforderung / Idee besteht darin, den Standardport (22 oder einen anderen Dienst) als Zielport zu verwenden und dann den Verkehr abhängig vom DNS-Namen oder so weiterzuleiten. Genau wie wir alle Nginx als Reverse-Web-HTTP-Proxyserver verwenden, zielt jede Domain auf die Standardports 80, 443 ab und leitet dann den Datenverkehr gemäß den Proxy-Regeln weiter. Natürlich hat der Client einen HOSTHeader, so dass man leicht unterscheiden kann, auf welche Site er abzielt ... Verschachtelte SSH-Sitzungen sind eine Art Lösung, aber eine chaotische - das funktioniert jedoch. Am Ende hatte ich verschiedene Ports in unserem Edge-Netzwerk - gutes altes NAT als die am meisten geküsste und zuverlässigste Lösung.
Stempel
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.