Servidor web detrás de NAT, cómo escuchar la dirección IP pública

Servidor web detrás de NAT, cómo escuchar la dirección IP pública

Tengo un servidor web Debian (nginx) ejecutándose detrás de un firewall usando NAT. El servidor web aloja varios sitios que requieren SSL y su propia dirección IP. Me gustaría que los sitios SSL escuchen solo su dirección IP específica y los sitios compartidos escuchen solo la IP compartida.

En este momento estoy escuchando un comodín * para todos los dominios, lo que, supongo, significa que está escuchando una única dirección LAN y entregando contenido del sitio según el nombre de host y no la dirección IP. Me gustaría corregir esto.

¿Cuál es el curso de acción adecuado? ¿Se trata de crear una NAT 1:1 para cada dirección IP y agregar las IP de LAN a la interfaz de red para escuchar y luego asignar las IP de LAN a dominios específicos? ¿O hay un mejor camino? ¿Hay alguna manera de transmitir la IP pública y tomar medidas en base a ella? Gracias.

Respuesta1

No, no puede pasar a través de la dirección IP de destino original después de haber realizado NAT, al menos no directamente.

Usaré 192.0.2.0/24 como bloque de IP externo y 198.51.100.0/24 como bloque de IP interno (consulte RFC5737).

Algunas cosas que podrías hacer incluyen:

  • NAT los puertos de destino en cada IP externa a un conjunto diferente de puertos en la IP interna. Por ejemplo, NAT 192.0.2.1:80 y 192.0.2.1:443 a 198.51.100.1:80 y 198.51.100.1:443, y luego NAT 192.0.2.2:80 y 192.0.2.2:443 a 198.51.100.1:81 y .51 .100.1:444. Configure el servidor web para escuchar en los puertos diferenciados los servicios apropiados. Asegúrese de elegir los puertos que no utilice para nada más y verifique la configuración de su firewall.
  • Asigne IP internas adicionales al servidor web. Por ejemplo, asigne el servidor web 198.51.100.1 y 198.51.100.2. NAT los pares IP/puerto externos apropiados a los pares IP/puerto internos correspondientes (por ejemplo, 192.0.2.1 a 198.51.100.1 y 192.0.2.2 a 198.51.100.2). Dirija a nginx para vincular los servicios apropiados a las IP internas apropiadas.

Si opta por la última solución, su entorno será más simple y más compatible con los estándares porque no tendrá que lidiar con números de puerto ni traducción de puertos inusuales, pero necesitará asignar múltiples IP internas a cada servidor web (supongo que tiene solo uno). Además, si utiliza la última solución, puede utilizar NAT 1:1.

Dicho esto, si no tiene ningún motivo para colocar el servidor web detrás de una NAT (NAT no es un firewall), simplemente escuche las IP externas (hacer eso también requeriría un cambio de topología).

Respuesta2

Parece que desea una dirección IP pública diferente para cada uno de los sitios. Eso significa que el firewall tiene que presentar las diferentes direcciones IP públicas. Luego, el firewall puede reenviar las solicitudes a diferentes direcciones IP al servidor nginx, o puede reenviar esas solicitudes a diferentes puertos en la misma dirección IP. Luego puede hacer que el servidor nginx responda en consecuencia.

Exactamente cómo lo configura depende de su firewall. Por ejemplo, usando iptables, podrías hacer algo como esto en un script:

KINCAID=192.168.1.112
EXTIPJMN=50.60.70.80
iptables -t nat -A PREROUTING -d $EXTIPJMN -p tcp -i $EXT --dport 8081 -j DNAT --to-destination $KINCAID:8080

Eso enrutaría las solicitudes provenientes de la dirección IP EXTIPJMN (50.60.70.80) y el puerto 8081 a su servidor interno en la dirección IP KINCAID (192.168.1.112) y el puerto 8080.

Es posible servir a diferentes sitios desde la misma dirección IP incluso a través de https, y esto es compatible con la mayoría de los clientes modernos, pero no todos.

información relacionada