23 votos

Reglas iptables para permitir el tráfico HTTP a un solo dominio

Necesito configurar mi máquina para permitir el tráfico HTTP a/desde serverfault.com solamente. Todos los demás sitios web, puertos de servicios no son accesibles. Se me ocurrió con estas reglas iptables:

#drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

#Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

#allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

No funciona del todo bien:

  • Después de dejarlo todo, y pasar a la regla 3:

    iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT

Me aparece este error:

iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.

¿Cree que está relacionado con el DNS? ¿Debería permitirlo también? ¿O debería poner sólo las direcciones IP en las reglas? ¿Crees que lo que intento hacer podría conseguirse con reglas más simples? ¿Cómo?

Agradecería cualquier ayuda o pista al respecto. Muchas gracias.

2 votos

No olvides sstatic.net y otros. serverfault.com no proviene enteramente de serverfault.com

0 votos

¿Puede ejecutar un proxy en otro sistema? Esta es la mejor solución: serverfault.com/questions/215134

33voto

Scott Pack Puntos 11452

Con las reglas de IPTables, el orden importa. Las reglas se añaden y aplican en orden. Además, cuando se añaden reglas manualmente, se aplican inmediatamente. Así, en tu ejemplo, cualquier paquete que pase por las cadenas INPUT y OUTPUT empieza a ser descartado tan pronto como se establece la política por defecto. Esta es también, incidentalmente, la razón por la que recibió el mensaje de error que recibió. que recibió. Lo que ocurre es lo siguiente:

  1. Se aplica la política DROP por defecto
  2. IPTables recibe un nombre de host como destino
  3. IPTables intenta una búsqueda DNS en 'serverfault.com'.
  4. La búsqueda DNS está bloqueada por la acción DROP

Aunque las opciones origen/destino aceptan nombres de host, se desaconseja encarecidamente. Citando la página de manual,

Los nombres de host se resolverán una vez antes de que la regla sea enviada al al núcleo. Tenga en cuenta que especificar cualquier nombre a resolver con una consulta remota como DNS es una muy mala idea.

Slillibri ha dado en el clavo con su respuesta, te has saltado la regla DNS ACCEPT. En tu caso no importará, pero en general yo pondría la política por defecto más adelante en el proceso. Lo último que quieres es estar trabajando remotamente y permitir SSH después de activar una denegación por defecto.

Además, dependiendo de tu distribución, deberías poder guardar tus reglas de cortafuegos para que se apliquen automáticamente al iniciarse.

Sabiendo todo eso, y reordenando tu script, esto es lo que yo te recomendaría.

# Allow loopback
iptables -I INPUT 1 -i lo -j ACCEPT

# Allow DNS
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT

# Now, allow connection to website serverfault.com on port 80
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

# Drop everything
iptables -P INPUT DROP
iptables -P OUTPUT DROP

3 votos

Una respuesta hermosa y bien elaborada.

1 votos

Te lo agradezco, aunque también habrás pasado por alto mi error. Ups.

3 votos

En realidad, puede poner su iptables -P en cualquier parte de su script, ya que las políticas de cadena sólo se aplican cuando los paquetes "caen" al final de una cadena. Yo suelo poner las declaraciones de política (típicamente DROP policies) en la parte superior de mi iptables scripts.

7voto

Travis Christian Puntos 183

Añadir

iptables -A OUPUT -p udp --dport 53 -j ACCEPT

para permitir búsquedas DNS.

5voto

BillThor Puntos 15761

Este tipo de requisito puede gestionarse mejor con un proxy y/o filtro web. Dansgaurdian puede configurarse para ello. Necesitarás usar reglas NAT para forzar tu tráfico a través del filtro.

Usando iptables para filtrar permitirá cualquier sitio disponible desde las direcciones IP relevantes. Esto es normalmente un pequeño subconjunto de toda la web.

1 votos

Totalmente de acuerdo. iptables es probablemente la herramienta equivocada, ya que no se maneja especialmente bien con los nombres DNS. Un proxy web con la configuración de filtro adecuada es mucho mejor.

2voto

jrojo Puntos 244

Me temo que iptables no funciona a este nivel, sólo le importa la dirección ip, no el nombre de host. Si quieres bloquear el acceso a otros hosts virtuales de nombre en la misma ip, tendrás que mirar de poner archivos .htaccess.

0 votos

El caso es que cuando pruebo la regla 3 sin "soltar todo" ¡funciona bien con iptables!

2 votos

Hmm, leí mal la pregunta. Correcto, lo que está pasando en el fondo es que iptables resolverá serverfault.com a 64.34.119.12 (ver respuesta de slillibri para entender por qué la resolución no estaba funcionando). Sin embargo, como iptables no entiende de nombres de host, y solo permite la ip, podras conectarte a cualquier sitio web en esa ip, si es que tiene multiples sitios.

2 votos

@Emily, puede que funcione bien, en el sentido de que se añada la regla, pero si la IP de serverfault.com cambia, no se permitirá el tráfico. Permitir un sitio como google.com que tiene cientos de direcciones que se cambian con frecuencia no funcionaría en absoluto.

1voto

David Pokluda Puntos 4284

Debe configurarlo en su servidor web. iptables es un filtro de paquetes. Las transacciones HTTP envían el nombre del sitio (es decir, stackoverflow) como parte de la carga útil TCP (es decir, no como parte de la cabecera TCP que es lo que iptables lee fácilmente).

Teniendo esto en cuenta, y el hecho de que las transacciones HTTP casi con toda seguridad van a estar repartidas en múltiples paquetes (es decir, no puedes simplemente hacer coincidir una cadena en la cabecera HTTP), esto es mucho mejor gestionado por la configuración de tu servidor web o por un proxy delante de él.

Sería útil saber el razonamiento detrás de esto, hay un par de otras alternativas:

  1. Redirigir a la URL correcta si se introduce una URL incorrecta (por ejemplo, redirigir a stackoverflow.com si se introduce www.stackoverflow.com).
  2. Dile a tu servidor web que no sirva a hosts distintos de stackoverflow.com
  3. Ponga el sitio en una IP separada que nada más se resuelve a y sólo obtener su servidor web para escuchar en eso.

0 votos

Hola Phil, no estoy seguro de entender qué es un servidor web. No tengo un servidor web. Estoy haciendo esta configuración en mi ordenador.

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X