Proxy (nginx) muestra un error de puerta de enlace incorrecta

18

Tengo un servicio (registro de Docker) que se ejecuta port 5000, he instalado nginx para redirigir la solicitud HTTP de 8080a 5000. Si hago un rizo localhost:5000, funciona, pero cuando hago un rizo localhost:8080, obtengo un error de puerta de enlace incorrecta.

archivo de configuración nginx:

upstream docker-registry {
 server localhost:5000;
}

server {
 listen 8080;
 server_name registry.mydomain.com;

 proxy_set_header Host       $http_host; 
 proxy_set_header X-Real-IP  $remote_addr; 
 client_max_body_size 0; 
 chunked_transfer_encoding on;

 location / {

     proxy_pass http://docker-registry;
 }
 location /_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }
 location /v1/_ping {
     auth_basic off;
     proxy_pass http://docker-registry;
 }

}

En /var/log/nginx/error.logtengo:

[crit] 15595#0: *1 connect() to [::1]:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain.com, request: "GET / HTTP/1.1", upstream: "http://[::1]:5000/", host: "localhost:8080"

¿Alguna idea?

hellb0y77
fuente
En mi caso, mi servicio de representación proxy murió (y no me di cuenta) en medio de mi uso. Un segundo estaba accediendo a él, al segundo siguiente obtuve una mala puerta de enlace. Tuve que reiniciar el servicio.
Michael Plautz

Respuestas:

57

Supongo que es una caja de Linux, por lo que lo más probable es que SELinux esté impidiendo la conexión ya que no hay una política que lo permita.

Deberías poder correr

# setsebool -P httpd_can_network_connect true

y luego reinicie nginx.

Madriguera
fuente
Selinux está desactivado, también el servicio firewalld
hellb0y77
2
Acabas de arreglar mi problema, incluso si no arreglaste el hellb0y77. ¡SE_LINUX ataca de nuevo!
Wesley Burr
1
Eso me funcionó a mí también. ¿Alguien tiene más información sobre lo que realmente está haciendo? Odio no saber!
Martinedwards
Elegido y trabajado en centOs 7, ¿puedo preguntar qué problemas de seguridad puede abrir esto? Generalmente ejecuto un conjunto de reglas de iptables que permiten el tráfico local. Preguntándose qué efectos tiene esto.
edencorbin
1
@edencorbin permite que los módulos httpd puedan conectarse a la red.
Warren
5

Según el mensaje de error, me hace preguntarme si localhost: 5000 se está resolviendo como una dirección ipv6, lo que es posible que no desee. Podrías intentar cambiar eso a 127.0.0.1:5000

EDITAR: en su línea proxy_pass, ¿es posible que le falte parte de la URL? Intente agregar $ request_uri para que pueda ser:

proxy_pass http://docker-registry/$request_uri;

o probablemente:

proxy_pass http://docker-registry$request_uri;

No estoy seguro de cuál es el más correcto.

Otra cosa a tener en cuenta. Su configuración indica:

server_name registry.mydomain.com;

Entonces, localhost: 8080 puede no coincidir. Para las pruebas, puede cambiar esto a:

server_name registry.mydomain.com localhost;

Luego, se emparejaría el localhost: 8080, así como su dominio. Supongo que Registry.mydomain.com es solo un ejemplo y pondría su FQDN del servidor real allí.

Gregor
fuente
No funciona, configuré 127.0.0.1:5000y lo intenté solo server_name localhosty server_name registry.mydomain.com(intentando desde otro servidor en el mismo lan con nombre registry.mydomain.comde host en / etc / hosts), y ambos, pero nada ... mismo error
hellb0y77
Con registro.midominio.com [crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: registry.mydomain,com request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080", con localhost:[crit] 16839#0: *5 connect() to 127.0.0.1:5000 failed (13: Permission denied) while connecting to upstream, client: 127.0.0.1, server: localhost, request: "GET / HTTP/1.1", upstream: "http://127.0.0.1:5000/", host: "localhost:8080"
hellb0y77