¿Cómo configurar NGINX como proxy inverso para diferentes números de puerto?

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

También quiero proxy ssh (puerto 22) solicitudes. ¿Puedo agregar otro bloque de servidor como este al mismo archivo de configuración:

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

Tal que el resultado final es 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

Viejo
fuente
2
nginxestá actuando como un httpproxy. Si lo configura para invertir el puerto proxy 22, no le permitirá pasar tráfico SSH, solo httptráfico al servidor SSH, lo que obviamente fallará.
garethTheRed
Ve a ver HAProxy .

Respuestas:

13

El protocolo ssh no se basa en HTTP y, como tal, no se puede representar a través proxy_passdengx_http_proxy_module

Sin embargo, recientemente, comenzando con nginx 1.9.0 (lanzado como estable con 1.10.0 el 26/04/2016), nginx obtuvo soporte para hacer proxying de flujo TCP , lo que significa que si tiene una versión de nginx lo suficientemente reciente, de hecho, puede hacer conexiones proxy ssh con él (sin embargo, tenga en cuenta que no podrá agregar nada parecido X-Real-IPa la conexión proxy, ya que esto no se basa en HTTP).

Para obtener más información y ejemplos, eche un vistazo a:

cnst
fuente
8

Desde Nginx Versión 1.9.0, NGINX admite el módulo ngx_stream_core_module, debe habilitarse con --with-stream. Cuando el módulo de transmisión está habilitado, es posible usar el protocolo TCP tsh 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/

Hendi Fauzi
fuente
Esa es toda una buena característica de nginx, pero en mi humilde opinión, es inútil cuando quieres tener un proxy inverso real como nginx hace un trabajo perfecto para HTTP. La cuestión es que el enfoque de las secuencias es NAT simple, por lo que prefiero hacer esa tarea en el enrutador perimetral. Lo que me gustaría / me gustaría tener aquí es exactamente el mismo conjunto de características que el proxy inverso HTTP. En otras palabras, solo tengo una dirección IP pública, por lo tanto, el puerto 22 está disponible solo para una máquina, pero si hubiera una manera de distinguir las solicitudes en un formulario ssh [email protected]y ssh [email protected], sería genial. Es la limitación de protocolo (SSH no dará a conocer los usos del cliente de nombre DNS)
stamster
@stamster, ya puedes hacer casi lo mismo, ya sea usando diferentes números de puerto (por ejemplo, 122 para srv1y 222 para srv2), o usando sesiones ssh anidadas, donde ssh primero en el servidor público / IP, y desde allí, ssh en las hojas; por ejemplo, ssh [email protected] 'ssh [email protected]'.
cnst
1
No, el requisito / idea es usar el puerto predeterminado (22 o cualquier otro servicio ...) como puerto de destino, y luego enrutar el tráfico dependiendo del nombre DNS más o menos. Al igual que todos usamos nginx como un servidor proxy web http inverso, cada dominio apunta a los puertos predeterminados 80, 443 y luego nginx enruta el tráfico según las reglas del proxy. Por supuesto, el cliente tiene un HOSTencabezado, por lo que es fácil distinguir a qué sitio se dirige ... Las sesiones SSH anidadas son una solución pero desordenada, aunque eso funciona. Terminé con diferentes puertos en nuestra red perimetral, el viejo y viejo NAT como la solución más confiable y de KISS.
stamster