# Mapeo de Direcciones y Puertos.

Configurando Apache HTTP Server para que escuche en una dirección y puertos específicos.

Hosts Virtuales
Problemas de DNS

# Visión General

core
mpm_common
VirtualHost
Listen

Cuando httpd se ejecuta, se mapea a una dirección y un puerto en la máquina local, y espera a recibir peticiones. Por defecto, escucha en todas las direcciones de la máquina. Ahora bien, se le puede especificar que escuche en un determinado puerto, o en una sola dirección IP especifica, o una combinación de ambos. A menudo esto se combina con la característica de los Hosts virtuales, que determina como responde el `httpd` a diferentes direcciones IP, nombres de máquinas y puertos.

La directiva Listen le dice al servidor que acepte peticiones en el puerto o puertos que se le especifiquen al servidor, o a combinaciones de direcciones y puertos. Si sólo se especifica el número del puerto en la directiva Listen, el servidor escuchará en ese puerto pero en todas las interfaces de red. Si además del puerto se le especifica una dirección IP, el servidor escuchará en el puerto y en la interfaz de red asociado a la dirección IP que se le ha especificado en la directiva. Se pueden especificar múltiples directivas Listen para especificar un determinado número de IP´s y puertos por donde el servidor escuchará. El servidor por tanto, responderá a las peticiones en cualquiera de las IP´s y puertos listados en la directiva.

Por ejemplo, para hacer que el servidor escuche en ambos puertos 80 y 8080 en todas sus interfaces de red, se usa lo siguiente:

Listen 80 Listen 8000

Para hacer que el servidor acepte peticiones en el puerto 80 en una sola interfaz de red, usaremos:

Listen 192.0.2.1:80 Listen 192.0.2.5:8000

Las direcciones IPv6 deberán ir entre '[ ]' corchetes como en el siguiente ejemplo:

Listen [2001:db8::a00:20ff:fea7:ccea]:80

Si se superponen directivas de tipo Listen, dará como resultado un error fatal que impedirá que se inicie el servidor.

(48)Address already in use: make_sock: could not bind to address [::]:80

Puede mirar el articulo de la wiki de consejos para solucionar problemas relacionados.

# Cambiar configuración de escucha al reiniciar

Cuando httpd se reinicia, hay que tener especial consideración en los cambios que se realicen a la directiva Listen. Durante un reinicio, httpd mantiene los puertos (como en la configuración original) para evitar generar errores del tipo "Conexión rechazada" para cualquier intento nuevo de establecer la conexión contra el servidor. Si se realiza algún cambio al conjunto de la directiva Listen, es probable que entre en conflicto con la configuración antigua, la configuración fallará y el servidor no se iniciará.

Por ejemplo, cambiar de la configuración:

Listen 127.0.0.1:80

a la siguiente configuración, es probable que falle, porque mapear el puerto 80 a todas las direcciones, entra en conflicto con sólo mapear el puerto 80 a la 127.0.0.1.

Listen 80

Para que este tipo de cambios surtan efecto, es necesario parar el servidor, y después iniciarlo.

# Consideraciones especiales con IPv6

Un creciente número de plataformas implementan ya IPv6, y

APR
soporta IPv6 en la mayoría de estas plataformas, permitiendo así a httpd asignar sockets IPv6, y manejar las respuestas enviadas a través de IPv6.

Un factor bastante complejo para un administrador del httpd es si un socket IPv6 puede o no manejar tanto conexiones IPv6 como IPv4. El manejo por httpd de conexiones IPv4 con socket IPv6 se debe al mapeo de direcciones IPv4 sobre IPv6, que está permitido por defecto en muchas plataformas, pero no lo está en sistemas FreeBSD, NetBSD y Open BSD, con el fin de que en estas plataformas, cumpla con la política del sistema. En los sistemas que no está permitido el mapeo por defecto, existe un parámetro de configure especial para cambiar éste comportamiento para httpd.

Por otro lado, en algunas plataformas, como Linux y True64, la única forma para el manejo de IPv4 e IPv6 al mismo tiempo es mediante direcciones mapeadas. Si quieres que `httpd` maneje amos tipos de conexiones IPv4 e IPv6 con el mínimo de sockets, hay que especificar la opción `--enable-v4-mapped` al configure.

`--enable-v4-mapped` es la opción que está estipulada por defecto en todos los sistemas menos en FreeBSD, NetBSD y Open BSD, por lo que es probablemente como se compiló su httpd.

Si lo que quiere es manejar sólo conexiones IPv4, independientemente de lo que soporten

APR
y su plataforma, especifique una dirección IPv4 por cada directiva Listen, como en el siguiente ejemplo:

Listen 0.0.0.0:80 Listen 192.0.2.1:80

Si en cambio, su plataforma lo soporta, y lo que quiere es que su httpd soporte tanto conexiones IPv4 como IPv6 en diferentes sockets (ejemplo.: para deshabilitar mapeo de direcciones IPv4), especifique la opción `--disable-v4-mapped` al configure. `--disable-v4-mapped` es la opción por defecto en FreeBSD, NetBSD y OpenBSD.

# Especificar el Protocolo en el Listen

El segundo argumento en la directiva Listen el protocolo que es opcional no es algo que se requiera en las configuraciones. Si éste argumento no se especifica, `https` es el protocolo usado por defecto en el puerto 443 y `http` para el resto. El protocolo se utiliza para determinar que módulo deberá manejar la petición, y se le aplicarán optimizaciones específicas del protocolo con la directiva AcceptFilter.

Sólo necesitará especificar el protocolo si no está escuchando en un puerto de los que son estándares, por ejemplo si ejecuta un sitio web `https` en el puerto 8443:

Listen 192.170.2.1:8443 https

# Como Funciona en los Hosts Virtuales

La directiva Listen no implementa los Hosts Virtuales - solo le dice al servidor en que direcciones y puertos debe escuchar. Si no hay directiva VirtualHost en uso, el servidor se comportará de la misma manera para todas las peticiones aceptadas. Ahora bien, VirtualHost puede ser usado para especificar un comportamiento diferente en una o varias direcciones o puertos. Para implementar los Hosts Virtuales, antes se le tiene que decir al servidor que direcciones y puertos van a ser usados. Después de esto, se deberá especificar una sección de la directiva VirtualHost especificando direcciones y puertos que se van a usar en el Host Virtual Note que si se configura un VirtualHost para una dirección y puerto en el que el servidor no está escuchando, no se podrá acceder al Host Virtual.