Jak skonfigurować NGINX jako zwrotny serwer proxy dla różnych numerów portów?

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

Chcę również proxy żądań ssh (Port 22). Czy mogę dodać kolejny blok serwera do tego samego pliku konfiguracyjnego:

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

Taki wynik końcowy jest następujący:

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
źródło
2
nginxdziała jako httppełnomocnik. Jeśli ustawisz odwrotny port proxy 22, nie pozwoli ci on przekazywać ruchu SSH - tylko httpruch do serwera SSH, który oczywiście się nie powiedzie.
garethTheRed
Idź sprawdź HAProxy .

Odpowiedzi:

13

Protokół ssh nie jest oparta na HTTP i jako takie nie mogą być przekierowywane przez regularne proxy_passodngx_http_proxy_module

Jednak ostatnio, poczynając od nginx 1.9.0 (wydany jako stabilny z 1.10.0 26.04.2016), nginx uzyskał wsparcie dla robienia proxy TCP , co oznacza, że ​​jeśli masz wystarczająco nową wersję nginx, w rzeczywistości możesz z nim łączyć połączenia ssh proxy (pamiętaj jednak, że nie możesz dodać niczego podobnego X-Real-IPdo połączenia proxy, ponieważ nie jest to oparte na HTTP).

Aby uzyskać więcej informacji i przykładów, spójrz na:

cnst
źródło
8

Ponieważ Nginx w wersji 1.9.0, NGINX obsługuje moduł ngx_stream_core_module, należy go włączyć za pomocą --with-stream. Gdy moduł przesyłania strumieniowego jest włączony, możliwe jest przesyłanie proxy tcp protokołu ssh

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
źródło
To wszystko fajna funkcja nginx - ale IMHO jest bezużyteczne, gdy chcesz mieć prawdziwe odwrotne proxy, tak jak nginx wykonuje idealną pracę dla HTTP. Rzecz w tym, że podejście do strumieni jest proste NAT - więc wolałbym wykonywać to zadanie na routerze brzegowym. To, co chciałbym / chciałbym mieć tutaj - to dokładnie taki sam zestaw funkcji jak odwrotne proxy HTTP. Innymi słowy, mam tylko jeden publiczny adres IP - dlatego port 22 jest dostępny tylko dla jednej maszyny - ale gdyby istniał sposób na rozróżnienie żądań w formie ssh [email protected]i ssh [email protected]- byłoby świetnie. Jest to ograniczenie protokołu (SSH nie
ujawnia
@stamster, możesz już zrobić prawie to samo, albo używając różnych numerów portów (np. 122 dla srv1i 222 dla srv2), albo używając zagnieżdżonych sesji ssh, gdzie najpierw ssh na publicznym serwerze / IP, a stamtąd, ssh w liście; np ssh [email protected] 'ssh [email protected]'.
cnst
1
Nie, wymaganiem / pomysłem jest użycie domyślnego portu (22 lub dowolnej innej usługi ...) jako portu docelowego, a następnie kierowanie ruchem w zależności od nazwy DNS lub mniej więcej. Tak jak wszyscy używamy nginx jako odwrotnego serwera proxy HTTP, więc każda domena jest kierowana na domyślne porty 80, 443, a następnie nginx kieruje ruchem w zależności od reguł proxy. Oczywiście klient ma HOSTnagłówek, więc łatwo jest rozróżnić, na którą stronę celuje ... Zagnieżdżone sesje SSH są rodzajem rozwiązania, ale bałagan - ale to działa. Skończyłem z różnymi portami w naszej sieci brzegowej - stary dobry NAT jako najbardziej KISS i niezawodne rozwiązanie.
stamster