Redirigir a https a menos que sea de una red privada en nginx

Redirigir a https a menos que sea de una red privada en nginx

Me gustaría redirigir todas las solicitudes provenientes de fuera de la red a https, pero mantener las internas en http.

En este momento tengo dos .confarchivos, uno que comienza así:

server {
        # listen [::]:443 ssl ipv6only=on; # managed by Certbot                                                                                                                                              
        listen 443 ssl; # managed by Certbot                                                                                                                                                                 
        server_name www.example.com , example.com;         
        # omitted stuff
}

y contiene

server {
    listen 80;
    server_name www.example.com , example.com;         
    return 301 https://$host$request_uri;
}

y otro que empieza así:

server {                                                                                                                                                                                                     
        listen 192.168.1.144:80;                                                                                                                                                                             
        listen 192.168.1.196:80;                                                                                                                                                                             
                                                                                                                                                                                                             
        server_name "";                                                                                                                                                                                      
        root /var/www/html;                                                                                                                                                                                  
        # omitted stuff
   }

Pero ahora mismo solicitahttp://ejemplo.comno sea redirigido a https.

¿Porqué es eso? ¿Qué me he equivocado? Mi objetivo es redirigir todas las solicitudes que no provienen de la red privada doméstica ( 192.168.1.*) a https y dejar las internas en paz.

Respuesta1

server_nameLa directiva utiliza espacios para separar nombres de dominio. Su configuración tiene comas, lo que confunde a nginx.

Necesitas usar:

server_name www.example.com example.com;

Respuesta2

Supongo que con lo siguiente estás intentando crear un bloque de servidor diferente que escuche en dos interfaces de la red local:

server {
    listen 192.168.1.144:80;
    listen 192.168.1.196:80;
    # ...
}

Para que esto funcione, su topología sería similar a esta:

Topología con Nginx conectado directamente a Internet

Sin embargo, si su servidor utiliza el mismo NAT que los clientes de la red privada 192.168.1.0/24, este serverbloque también se utilizará para las conexiones externas. Esta topología sería similar a esta:

Topología con NAT y reenvío de puertos

Con este último, podrías usar, por ejemplo, elngx_http_geo_modulepara separar la red local en función de sus clientes:

geo $external {
    default         1;
    192.168.1.0/24  0;
}

server {
    listen 80;
    server_name example.com www.example.com;
    root /var/www/html;
    
    if ($external) {
        return 301 https://$server_name$request_uri;
    }
}

Sin embargo, desde la perspectiva de la seguridad, no recomendaría confiar en su red interna de esta manera, sino usar TLS por igual para cada cliente. Esto se debe a que es fácil conseguir una posición en MitM simplemente teniendo acceso a la red local.

Respuesta3

Pruebe esto para la redirección y, para la redirección interna, personalmente prefiero hacer el nombre del servidor por dirección IP.

server {
    listen 80;
    server_name example.com www.example.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    listen [::]:443 ssl;

    ssl_certificate /etc/ssl/example.crt;
    ssl_certificate_key /etc/ssl/example.key;

    server_name example.com www.example.com;

    location{
       .......
    }
}

información relacionada