Necesito configurar mi máquina para permitir el tráfico HTTP hacia / desde serverfault.com solamente. Todos los demás sitios web, puertos de servicios no son accesibles. Se me ocurrieron estas reglas de 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 muy bien:
Después de soltar todo y pasar a la regla 3:
iptables -A OUTPUT -p tcp -d serverfault.com --dport 80 -j ACCEPT
Me sale este error:
iptables v1.4.4: host/network `serverfault.com' not found
Try `iptables -h' or 'iptables --help' for more information.
¿Crees que está relacionado con DNS? ¿Debería permitirlo también? ¿O debería simplemente poner las direcciones IP en las reglas? ¿Crees que lo que estoy tratando de hacer podría lograrse con reglas más simples? ¿Cómo?
Agradecería cualquier ayuda o pistas sobre esto. ¡Muchas gracias!
Respuestas:
Con las reglas de IPTables, el orden importa. Las reglas se agregan y se aplican en orden. Además, al agregar reglas manualmente, se aplican de inmediato. Por lo tanto, en su ejemplo, los paquetes que pasan por las cadenas INPUT y OUTPUT comienzan a descartarse tan pronto como se establece la política predeterminada. Esto también es, por cierto, por qué recibió el mensaje de error que recibió. Lo que está sucediendo es esto:
Si bien las opciones de origen / destino aceptarán nombres de host, se desaconseja encarecidamente. Para citar la página del manual,
Slillibri golpeó el clavo en la cabeza que su respuesta, se perdió la regla ACEPTACIÓN DNS. En su caso, no importará, pero generalmente establecería la política predeterminada más adelante en el proceso. Lo último que desea es trabajar de forma remota y permitir SSH después de activar una denegación predeterminada.
Además, dependiendo de su distribución, debería poder guardar sus reglas de firewall de modo que se apliquen automáticamente en el momento de inicio.
Sabiendo todo eso y reorganizando su script, esto es lo que recomendaría.
fuente
iptables -P
declaraciones en cualquier parte de su secuencia de comandos, ya que las políticas de cadena solo se aplican cuando los paquetes "se caen" al final de una cadena. Usualmente pongo las declaraciones de política (típicamenteDROP
políticas) en la parte superior de mis scripts de iptables.sudo iptables -I OUTPUT 1 -o lo -j ACCEPT
. ¿No debería ser eso agregado?Añadir
para permitir búsquedas de DNS.
fuente
Este tipo de requisito puede manejarse mejor con un proxy y / o filtro web. Dansgaurdian se puede configurar para hacer esto. Deberá usar las reglas NAT para forzar su tráfico a través del filtro.
El uso de iptables para filtrar permitirá cualquier sitio disponible desde las direcciones IP relevantes. Esto normalmente es un pequeño subconjunto de toda la web.
fuente
iptables
es probablemente la herramienta incorrecta para usar aquí, ya que no se trata particularmente bien con los nombres DNS. Un proxy web con la configuración de filtro adecuada es mucho mejor.Me temo que iptables no funciona a este nivel, solo le importa la dirección IP, no el nombre de host. Si desea bloquear el acceso a otros hosts virtuales de nombre en la misma ip, deberá considerar la colocación de archivos .htaccess.
fuente
Necesita configurar esto 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 de TCP (es decir, no como parte del encabezado TCP, que es lo que iptables lee fácilmente).
Teniendo en cuenta eso, y el hecho de que las transacciones HTTP seguramente se distribuirán en múltiples paquetes (es decir, no puede coincidir con una cadena en el encabezado HTTP), esto es mucho mejor manejado por la configuración de su servidor web o por un proxy en el frente de eso.
Sería útil saber el razonamiento detrás de esto, hay un par de otras alternativas:
fuente