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

Ole
quelle
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:

cnst
quelle
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/

Hendi Fauzi
quelle
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 [email protected]und ssh [email protected]- 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 [email protected] 'ssh [email protected]'.
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