Herramientas personales

Firewall Simple por iptables en Linux

De Proyectos GULIX

Tabla de contenidos

Introducción

El siguiente pretende ser un tutorial rápido para implementar un firewall medianamente genérico en su servidor sin perder demasiado tiempo ni obtener una mayor complejidad al hacerlo.


Existen 3 tipos de tablas válidas

Nat : Conexiones modificadas por el firewall, como por ejemplo, enmascarar conexiones, realizar redirecciones de puertos, etc.

Filter: Donde se añaden las relacionadas con el filtrado.

Mangle Modifica paquetes pero, a diferencia de Nat, es mucho mas potente. Con Mangle podemos modificar cualquier aspecto del paquete (flags, TTL, etc) (útil para bloquiar webs).


Ordenes básicas

iptables –F : limpa, flush de reglas iptables –L : listado de reglas que se estan aplicando iptables –A : append, añadir regla iptables –D : borrar una reglas


Ejemplo

#!/bin/bash
# Un firewall simple genérico by Gustavo Lacoste
iptables=/sbin/iptables
#Borramos antiguas reglas.
$iptables -F
#HOSTS
#IPWEB: la ip del servidor web.
#IPWAN: la ip publica del servidor 
#IPNTP: Servidor de tiempo.
#IPWEB=200.200.45.12 (ejemplo)

IPWEB="`/sbin/ifconfig eth0 | grep 'inet addr' | awk '{print $2}' | sed -e 's/.*://'`"
IPWAN=$IPWEB
IPNTP=ntp.shoa.cl

case $1 in
start)
  #Politica por defecto: Denegar todo !
  $iptables -P INPUT DROP
  $iptables -P OUTPUT DROP
  $iptables -P FORWARD DROP

  #Permitimos paquetes de conexiones previamente establecidas
  # esto optimiza el nuevo acceso a recursos desde ips con conecciones
  # establecidas
  $iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  $iptables -A OUTPUT -m state --state RELATED,ESTABLISHED -j ACCEPT

  #Habilita loopback para mysql coneccion a localhost por ejemplo
  $iptables -A INPUT -i lo -j ACCEPT
  $iptables -A OUTPUT -o lo -j ACCEPT
 
  #Permite el acceso a ssh desde cualquier ip, sin embargo la registra
  # los ataques via ssh son filtrados utilizando con denyhosts pero solo a nivel
  # medio dado que se catiga con la pena de un  BLOCK_SERVICE = sshd solo al 
  # servicio ssh y no al resto
  #$iptables -A INPUT -p TCP --dport 22 -j LOG --log-prefix "Intento_SSH: "
  #$iptables -A INPUT -p TCP --dport 22 -j ACCEPT
  $iptables -A INPUT -p tcp --dport 22 -j ACCEPT
  $iptables -A OUTPUT -p udp --sport 22 -j ACCEPT
 
  #Permitimos la entrada y salida (solicitu y respuesta)  por el puerto 80 TCP:
  $iptables -A INPUT -p TCP --dport 80 -d $IPWEB -m state --state NEW -j ACCEPT
  $iptables -A OUTPUT -p tcp -m tcp --dport 80 -j ACCEPT
  #y https 
  $iptables -A INPUT -p tcp -m tcp --sport 443 -j ACCEPT
  $iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT  
 
  #permitimos mysql
  $iptables -A INPUT -p tcp -m tcp --sport 3306 -j ACCEPT
  $iptables -A OUTPUT -p tcp -m tcp --dport 3306 -j ACCEPT
   
  #permitimos SVN
  $iptables -A INPUT -p tcp -m tcp --sport 3690 -j ACCEPT
  $iptables -A OUTPUT -p tcp -m tcp --dport 3690 -j ACCEPT
 
 
  #Permitimos al servidor la salida de correos(Utilizada en envio de
  #recuperacion de contranas por ejemplo)
  $iptables -A OUTPUT -d $IPWEB -p tcp --dport 25 -j ACCEPT
 
  #Permitimos al servidor sincronizar su hora:
  $iptables -A INPUT -p udp -s $IPNTP  -d $IPWEB --dport 123 -j ACCEPT
  $iptables -A OUTPUT -p udp -s $IPWEB -d $IPNTP  --sport 123 -j ACCEPT
 
 
  #Log de todo lo que no se permite:
  #$iptables -A INPUT -j LOG --log-prefix "Default_Drop: "
  #$iptables -A OUTPUT -j LOG --log-prefix "Default_Drop: "
 
;;
 
stop)
 
  #Borramos antiguas reglas del firewall
  $iptables -F 
 
  #Ponemos la politica en ACCEPT
  $iptables -P INPUT ACCEPT
  $iptables -P OUTPUT ACCEPT
 
 
;;

restart)
  /etc/init.d/Firewall.sh stop
  /etc/init.d/Firewall.sh start
  
;; 
 
*)

  echo "Uso: /etc/init.d/Firewall.sh {start|stop|restart}"
;;
  
esac

Agregando otros filtros

Si desea agregar un puerto de un servicio que no est{a considerado agregué las siguientes lienas en la sección start (donde estan las demás) reemplaze las mayúsculas obviamente.

#permitimos NOMBRE_SERVICIO

   $iptables -A INPUT -p tcp -m tcp --sport PUERTOSERVICIO -j ACCEPT
   $iptables -A OUTPUT -p tcp -m tcp --dport PUERTOSERVICIO -j ACCEPT

Leer más

Autores de este Artículo

En este artículo han participado los siguientes usuarios de la comunidad gulix(Agregue su firma si ha realizado modificaciones que han sido aceptadas en este artículo):

--Knxroot 06:17 22 feb 2010 (UTC) (http://gruluf.org, http://lacosox.org)


Buscar