Como configurar o NGINX como um proxy reverso para diferentes números de porta?


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

Também quero fazer pedidos de proxy ssh (porta 22). Posso adicionar outro bloco de servidor como este ao mesmo arquivo de configuração:

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

De modo que o resultado final é este:

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
nginxestá agindo como um httpproxy. Se você configurá-lo para reverter a porta proxy 22, não permitirá que você transmita tráfego SSH - somente httptráfego para o servidor SSH, o que obviamente falhará.
garethTheRed

Vá verificar HAProxy .

Respostas:


13

O protocolo ssh não é baseado em HTTP e, como tal, não pode ser usado como proxy por meio proxy_passdongx_http_proxy_module

No entanto, recentemente, começando com o nginx 1.9.0 (lançado como estável na 1.10.0 em 26/04/2016), o nginx ganhou suporte para fazer proxy de fluxo TCP , o que significa que, se você tiver uma versão suficientemente recente do nginx, você pode, de fato, conexões proxy ssh com ele (no entanto, observe que não seria possível adicionar nada parecido X-Real-IPcom a conexão com proxy, pois isso não é baseado em HTTP).

Para mais informações e exemplos, consulte:


8

Desde o Nginx versão 1.9.0, o NGINX suporta o módulo ngx_stream_core_module, ele deve ser ativado com o --with-stream. Quando o módulo de fluxo está ativado, é possível fazer o proxy ssh protocol tcp

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/


Esse é um recurso interessante do nginx - mas o IMHO é inútil quando você deseja ter um proxy reverso real, como o nginx, que faz o trabalho perfeito para HTTP. A coisa é que a abordagem de fluxos é simples NAT - então eu prefiro fazer essa tarefa no roteador de borda. O que eu gostaria / gostaria de ter aqui - é exatamente o mesmo recurso definido como proxy reverso HTTP. Em outras palavras, eu tenho apenas um endereço IP público - portanto, a porta 22 está disponível apenas para uma máquina - mas se houvesse uma maneira de distinguir solicitações em um formulário ssh me@srv1.my.nete ssh me@srv2.my.net- seria ótimo. É de limitação protocolo (SSH não vai dar usos nome do cliente DNS)
stamster

@stamster, você já pode fazer quase a mesma coisa, usando números de porta diferentes (por exemplo, 122 para srv1e 222 para srv2), ou usando sessões ssh aninhadas, nas quais você primeiro ssh no servidor público / IP e, a partir daí, ssh nas folhas; por exemplo ssh user@example.org 'ssh user@192.168.5.1',.
CNST

1
Não, o requisito / ideia é usar a porta padrão (22 ou qualquer outro serviço ..) como porta de destino e, em seguida, rotear o tráfego, dependendo do nome DNS. Assim como todos nós estamos usando o nginx como um servidor proxy HTTP reverso na Web, cada domínio tem como alvo as portas padrão 80, 443 e, em seguida, o nginx roteia o tráfego, dependendo das regras do proxy. É claro que o cliente possui um HOSTcabeçalho, por isso é fácil distinguir em qual site ele se destina ... As sessões SSH aninhadas são uma espécie de solução, mas uma solução confusa - mas que funciona. Acabei com diferentes portas em nossa rede de borda - o bom e velho NAT como a solução mais confiável e confiável.
Stamster
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.