11 septiembre 2012

IPTABLES PARA VAGOS

-=IPTABLES=-


Es una herramienta de cortafuegos que permite no solamente filtrar paquetes, sino también realizar traducción de direcciones de red (NAT) para IPv4 o mantener registros de log. IPTABLES es el nombre de la herramienta de espacio de usuario mediante la cual el administrador puede definir políticas de filtrado del tráfico que circula por la red. El nombre iptables se utiliza frecuentemente de forma errónea para referirse a toda la infraestructura ofrecida por el proyecto Netfilter. Sin embargo, el proyecto ofrece otros subsistemas independientes de iptables tales como el connection tracking system o sistema de seguimiento de conexiones, que permite encolar paquetes para que sean tratados desde espacio de usuario. iptables es un software disponible en prácticamente todas las distribuciones de Linux actuales.

En iptables, las reglas se agrupan en cadenas. Una cadena es un conjunto de reglas para paquetes IP, que determinan lo que se debe hacer con ellos. Cada regla puede desechar el paquete de la cadena (cortocircuito), con lo cual otras cadenas no serán consideradas. Una cadena puede contener un enlace a otra cadena: si el paquete pasa a través de esa cadena entera o si cumple una regla de destino de retorno, va a continuar en la primera cadena. No hay un límite respecto de cuán anidadas pueden estar las cadenas. Hay tres cadenas básicas (INPUT, OUTPUT y FORWARD: ENTRADA, SALIDA y REENVÍO) y el usuario puede crear tantas como desee. Una regla puede ser simplemente un puntero a una cadena.



-=SYNTAIS=-
iptables [tabla] [COMANDOS] reglas DESTINO


## TABLAS

1) filter table (tabla de filtros).  esta tabla es por la cual pasan todos los paquetes sin distincion y es la responsable del filtrado. Contiene las siguentes cadenas:


a) INPUT: los paquetes que sean destinados al sistema atraviesan esta cadena.
b) OUTPUT: todos los paquete que han sido creados por el sistema pasan por esta cadena.
c) FORWARD: todos los paquetes que simplemente pasan por el sistema para ser encaminados a su destino.

2) nat table (tabla de traduccion de direcciones de red).  esta tabla tiene a su encargo configurar las reglas de escritura de direcciones o de los puertos de los paquetes. El primer paquete que entre al sistema de cualquier conxion pasa atravez de esta tabla; los veredictos determinan como van a reescribirse todos los paquetes de la conexion. Contiene las siguentes cadenas redefinidas:


a) PREROUTING chain (Cadena de PRERUTEO):los paquetes son revisados en esta regla antes de que sea consultada del ruteo local, principalmente el DNT (destinantion-NAT).
b) POSTROUTING chain (Cadena de POSRUTEO): los paquetes al salir pasan por esta cadena desp de tomarse la decicion del ruteo, principalemente el SNT (source-NAT)
c) OUTPUT chain (Cadena de SALIDA): permite hacer un DNAT solamente en los paquetes generados.

3) mangle table (Tabla de destrozo): esta tabla ajusta las opciones de los paquetes.  Todos los paquetes pasan por esta table.  Esta disenada para fines avanzados, por eso todas las cadenas estan pre definidas.
 

a) PREROUTING chain (Cadena de PRERUTEO) — Todos los paquetes que logran entrar a este sistema, antes de que el ruteo decida si el paquete debe ser reenviado (cadena de REENVÍO) o si tiene destino local (cadena de ENTRADA).
b) INPUT chain (Cadena de ENTRADA) — Todos los paquetes destinados para este sistema pasan a través de esta cadena
c) FORWARD chain (Cadena de REDIRECCIÓN) — Todos los paquetes que exactamente pasan por este sistema pasan a través de esta cadena.
d) OUTPUT chain (Cadena de SALIDA) — Todos los paquetes creados en este sistema pasan a través de esta cadena.
e) POSTROUTING chain (Cadena de POSRUTEO) — Todos los paquetes que abandonan este sistema pasan a través de esta cadena.

Ademas de las cadenas ya incorporadas, el usuario puede crear todas las cadenas definidas por el usuario que quiera dentro de cada tabla, las cuales permiten agrupar las reglas en forma logica.

## COMANDOS
iptables –A : append, añadir regla
iptables –D : borrar una reglas
iptables –F : elimina todas las reglas
iptables –P : modifica las politicas para una cadena (input, forward, output)
iptables –L : lista todas las reglas
iptables –N : crea una cadena de un usuario
iptables –R : reemplaza una regla
iptables –X : elimina una cadena definida por un usuario


## REGLAS
-i :interfaz de entrada red por donde entrara el paquete. Solo funciona para (INPUT, FORWARD y PREROUTING) (eth0,eth1, ppp0,…).
-o :el interfaz de salida de red por donde saldra el paquete(eth0,eth1, ppp0,…).
-s 0.0.0.0/0 :compara los paquetes que vienen de la dirección de acceso (cualquiera en este caso).
-d 0.0.0.0/0 :compara los paquetes que salen de la dirección de origen. la ip puede sustituirse por un hostnane tanto en -s como en -d.
-p TCP :tipo de puerto o protocolo que sera comparado con la regla (TCP,UDP,ICMP).
--sport :puerto de origen. puede abrir un rango usando #:# (ejempl 240:241)
--dport :puerto de destino.
-m :define que se aplica la regla si hay una coincidencia específica.

-nota
-i se usa con reglas INPUT y FORWARD
-o se usa con reglas FORWARD y OUTPUT

## DESTINO
-j :destino de la regla. (ACCEPT, DROP, LOG, REJECT,QUEUE, DNAT o SNAT).
-ACCEPT :acepta la conexion
-DROP :deniega el acceso
-REJECT :rechaza la conexion y reenvia el paquete a su origen
-QUEUE :envia el paquete hacia las reglas del usuario
-LOG :todos los paquetes que coincidan por esta regla se guardan en un log
-SNAT :un estado virtual donde difiere si la direccion fuente original difiere del envio destinado
-DNAT :un estado virtual donde coincide si el destino difiere del lugar donde son reenviados


-=METODOS DE IMPLEMENTACION=-

hay dos tipos de metodos para implementar iptables: 

1) aceptar todo (ACCEPT).  Este aceptar todos los paquetes y debemos de ir cerrando puerto por puerto segun nuestras necesidades.  Es el metodo mas facil para iniciar y si no tienes
mucho conocimiento del sistema operativo y sobre los servicios que corres en tu computadora

2) deniega todo (DROP).  Se cierra todo el acceso al servidor y se van aplicando politicas segun las necesidades.  Este es el metodo mas dificil y se requiere de conocimiento de tus
demonios y de los servicios que corres.

ojo:es importante el orden en que se crean las reglas.  cuando llega un paquete este se va comparando en cada regla hasta que encuentra una regla que afecta (lo que se llama match) y se ejecuta esa regla (se acepta o se denega). Despues de ese evento no se comparara mas el paquete con las reglas de nuestro firewall. 


-=EJEMPLOS DE MODOS DE IMPLEMENTACION=-

Hay varias formas de implementar un firewall:

1) PROTECCION DE UN HOST.
Puede ser un servidor o un desktop y usaremos el firewall para evitar que alguien este espiando o vulnerando algunos puertos de nuestro sistema

2) FIREWAll PARA PROTEGER HOST CONECTADOS A UNA RED LAN CON CONEXION A INTERNET
El firewall se encarga de proteger un conjunto de equipos que estan conectados en una oficina o una pequena institucion educativa. Es utilizado para tener servidores carnadas para ser atacados.

3) FIREWALL PARA PROTEGER HOST CONECTADOS LAN CON DMZ E INTERNET
Este tipo de configuracion se utiliza cuando existen varios servidores que necesitan tener acceso hacia internet y se cuentan un grupo de host.

4) FIREWALL EN UNA RED LAN CON SALIDA A INTERNET Y VPN'S
Cuadno tenemos un grupo de oficinas conectadas por vpn e internet y deseamos poner un firewall para proteger tanto los servidores como las maquinas que se encuentran en la red principal.

5) FIREWALL ENTER DOS REDES
Cuando deseamos filtrar el trafico o ciertos host tengan acceso a ambas redes.

En fin nuestro limite aqui es la imaginacion...



-=CONFIGURACION=-

Aqui empezamos a divertirnos.  Estoy usando CENTOS 5.8 i386.


-revisamos si nuestro iptables esta activo
[root@localhost ~]# service iptables status
Firewall is stopped.

-lo agregamos a la lista de servicios que esten en inicio
[root@localhost ~]# chkconfig iptables on

-confirmamos que este en la lista de los servicios que se cargaran en el inicio
[root@localhost ~]# chkconfig --list | grep iptable
iptables           0:off    1:off    2:on    3:on    4:on    5:on    6:off

-antes de empezar a poner las reglas hay que agregar los modulos al kernel
[root@localhost ~]# modprobe ip_tables
[root@localhost ~]# modprobe ip_nat_ftp
[root@localhost ~]# modprobe ip_conntrack-ftp
[root@localhost ~]# modprobe iptable_filter
[root@localhost ~]# modprobe ip_conntrack
[root@localhost ~]# modprobe ipt_state
[root@localhost ~]# modprobe ipt_LOG
-nota: todavia tengo todavia que indagar el por que hay que cargar cada modulo de estos, si alguien me puede hechar una mano le agradeceria de todo corazon.

-ahora podemos iniciar el IPTABLES
[root@localhost ~]# service iptables start
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: filter                    [  OK  ]
Unloading iptables modules:                                [  OK  ]

-antes de continuar debemos saber que el archivo de configuracion de iptables se encuentra en:
# /etc/sysconfig/iptables.

-listamos todas las reglas actuales que contiene nuestro IPTABLES:
[root@localhost ~]# iptables -L
Chain INPUT (policy ACCEPT)
target     prot opt source               destination        

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination        

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

-esta es la forma mas sencilla de ver nuestras reglas ahora podemos usar esta opcion:
[root@localhost ~]# iptables -n -L -v
Chain INPUT (policy ACCEPT 650 packets, 82778 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy ACCEPT 76 packets, 9672 bytes)
 pkts bytes target     prot opt in     out     source               destination  

-obtenemos mas resultados que nos interesan:
-L : lista las reglas.
-v : despliega informacion detalla. Muestras los nombres de las interfaces, las opciones de las reglas y la mascara T
-n : muestra la direccion ip en un formato numerico.  no resuelve nombre dns.
--line-numbers:  esta opcion no se encuentra includa pero cuando agregemos las reglas nos deplegara numericamente cada regla segun su politica.

-tambien podemos listar las reglas por politicas
[root@localhost ~]# iptables -L INPUT -n -v
Chain INPUT (policy ACCEPT 928 packets, 120K bytes)
 pkts bytes target     prot opt in     out     source               destination


-=EJEMPLO DE REGLAS DROP PARA UN SERVIDOR=-
Este es un ejemplo sencillo de como usaria iptables para proteger un pequeno servidor con la politica por defecto de DROP para todos los paquetes.


1) LIMPIEZA DE LAS REGLAS

-eliminamos todas las reglas existentes
#iptables -F

-eliminamos las cadenas definidas por usuarios
#iptables -X

-llenamos a cero todos los paquetes y contadores de todas las cadenas
#iptables -Z

-eliminamos las reglas en la tabla NAT
#iptables -t nat -F
-nota: averiguar sobre esta regla

-eliminiamos las reglas de la tabla mangle
#iptables -t mangle -F   
-nota: averiguar sobre esta regla


2) ESTABLECER LAS POLITICAS POR DEFECTO (ACCEPT O DROP)

-denegamos todos las entradas
#iptables -P INPUT DROP

-denegamos todas las salidas
#iptables -P OUTPUT DROP

-denegamos todos los reenvios de paquetes
#iptables -P FORWARD DROP

-listamos todas las reglas actuales que contiene nuestro IPTABLES:
[root@localhost ~]# iptables -L
Chain INPUT (policy DROP)
target     prot opt source               destination        

Chain FORWARD (policy DROP)
target     prot opt source               destination        

Chain OUTPUT (policy DROP)
target     prot opt source               destination


3) INSERTAMOS NUESTRAS REGLAS

-aceptar todas las peticiones locales
#iptables -A INPUT -i lo -j ACCEPT
#iptables -A OUTPUT -o lo -j ACCEPT

-a nuestra ip acceso hacia fuera y hacia dentro total
#iptables -A INPUT -s 172.16.100.94 -j ACCEPT
#iptables -A OUTPUT -d 172.16.100.94 -j ACCEPT

-solo aceptamos SSH de este cliente.
#iptables -A INPUT -s 172.16.1.2 -p tcp --dport 22 -j ACCEPT
#iptables -A OUTPUT -d 172.16.1.2 -p tcp --sport 22 -j ACCEPT

-tambien podemos hacer que sean todas peticiones de ssh que sean aceptadas
#iptables -A INPUT -i eth0 -p tcp --dport 22 -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --sport 22 -j ACCEPT

-aceptamos todo el trafico de este cliente. Aqui se aceptan los pings.
#iptables -A INPUT -s 172.16.1.2 -j ACCEPT
#iptables -A OUTPUT -d 172.16.1.2 -j ACCEPT

-permitir resolver nombres (DNS).  si hacemos ping nos dira que no es permitido, entonces hacemos el siguiente paso:
#iptables -A INPUT -i eth0 -p udp --sport 53 -j ACCEPT
#iptables -A OUTPUT -o eth0 -p udp --dport 53 -j ACCEPT

-aceptar las peticiones del ping que salen del servidor.
#iptables -A INPUT -p icmp -m state --state ESTABLISHED,RELATED -j ACCEPT
#iptables -A OUTPUT -p icmp -j ACCEPT

-tambien podemos permitir que nos den PING desde cualquier lugar
#iptables -A INPUT -i eth0 -p ICMP -j ACCEPT

-abrimos el puerto 80 para un servidor web.
#iptables -A INPUT -p tcp --sport 80 -j ACCEPT
#iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT

-para webs seguras
#iptables -A INPUT -p tcp -m tcp --sport 443 -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -p tcp -m tcp --dport 443 -j ACCEPT
-estas son las eglas necesarias para un FTP pasivo y activo. Se permiten conexiones entrantes ya establecidas
#iptables -A INPUT -p tcp -m tcp --sport 20:21 -m state --state RELATED,ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -p tcp -m tcp --dport 20:21 -j ACCEPT
#iptables -A INPUT -p tcp -m tcp --sport 1024:65535 --dport 1024:65535 -m state --state ESTABLISHED -j ACCEPT
#iptables -A OUTPUT -p tcp -m tcp --dport 1024:65535 -m state --state NEW,RELATED,ESTABLISHED -j ACCEPT

-si tenemos un NO-IP permitimos que se comunique.
#iptables -A INPUT -s 0.0.0.0 -p tcp --sport 8245 -j ACCEPT
#iptables -A INPUT -i eth0 -p tcp --sport 8245 -j ACCEPT
#iptables -A OUTPUT -o eth0 -p tcp --dport 8245 -j ACCEPT
#iptables -A INPUT -i eth1 -p tcp --sport 8245 -j ACCEPT
#iptables -A OUTPUT -o eth1 -p tcp --dport 8245 -j ACCEPT    

-este es el fin de nustro grupo de reglas. guardamos las modificaciones que hicimos
[root@localhost ~]# service iptables save
Saving firewall rules to /etc/sysconfig/iptables:          [  OK  ]
------------------------------------------------------------------------
nota: para fedora 16 no es lo mismo pero puedes usar:
/usr/libexec/iptables.init save

creas un archivo
/etc/profile.d/iptables.sh

y agregas estos las lineas
alias firewall-save='/usr/libexec/iptables.init save'
alias firewall-rules='/usr/libexec/iptables.init status'
alias firewall-panic='/usr/libexec/iptables.init panic'
alias firewall-start='systemctl start iptables.service'
alias firewall-stop='systemctl stop iptables.service'
alias firewall-status='systemctl status iptables.service'
alias firewall-restart='systemctl restart iptables.service'
------------------------------------------------------------------------

-reiniciamos el servicio para que se actualizen los cambios
[root@localhost ~]# service iptables restart
Flushing firewall rules:                                   [  OK  ]
Setting chains to policy ACCEPT: mangle nat filter         [  OK  ]
Unloading iptables modules:                                [  OK  ]
Applying iptables firewall rules:                          [  OK  ]
Loading additional iptables modules: ip_conntrack_netbios_n[  OK  ]
-y ya tenemos todas nuestras reglas guardadas y funcionando

-mostramos todas las reglas que hemos creado:
[root@localhost ~]# iptables -n -L -v --line-numbers
Chain INPUT (policy DROP 169 packets, 25330 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1        0     0 ACCEPT     all  --  lo     *       0.0.0.0/0            0.0.0.0/0          
2        0     0 ACCEPT     all  --  *      *       172.16.100.94        0.0.0.0/0          
3       25  1428 ACCEPT     all  --  *      *       172.16.1.2           0.0.0.0/0          
4        0     0 ACCEPT     udp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           udp spt:53
5        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0           state RELATED,ESTABLISHED
6        0     0 ACCEPT     tcp  --  *      *       172.16.1.2           0.0.0.0/0           tcp dpt:22
7        0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp dpt:22
8        0     0 ACCEPT     all  --  *      *       172.16.1.2           0.0.0.0/0          
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:80
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:443 state RELATED,ESTABLISHED
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spts:20:21 state RELATED,ESTABLISHED
12       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spts:1024:65535 dpts:1024:65535 state ESTABLISHED
13       0     0 ACCEPT     tcp  --  eth0   *       0.0.0.0/0            0.0.0.0/0           tcp spt:8245
14       0     0 ACCEPT     tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           tcp spt:8245
15       0     0 ACCEPT     tcp  --  *      *       0.0.0.0              0.0.0.0/0           tcp spt:8245
16       0     0 ACCEPT     tcp  --  eth1   *       0.0.0.0/0            0.0.0.0/0           tcp spt:8245
17       0     0            tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spts:1:1024
18     150 21662            udp  --  *      *       0.0.0.0/0            0.0.0.0/0           udp spts:1:1024
19       0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:1723
20       0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:3306
21       0     0 DROP       tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp spt:5432

Chain FORWARD (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination        

Chain OUTPUT (policy DROP 0 packets, 0 bytes)
num   pkts bytes target     prot opt in     out     source               destination        
1        0     0 ACCEPT     all  --  *      lo      0.0.0.0/0            0.0.0.0/0          
2        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.16.100.94      
3       23  2396 ACCEPT     all  --  *      *       0.0.0.0/0            172.16.1.2         
4        0     0 ACCEPT     udp  --  *      eth0    0.0.0.0/0            0.0.0.0/0           udp dpt:53
5        0     0 ACCEPT     icmp --  *      *       0.0.0.0/0            0.0.0.0/0          
6        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            172.16.1.2          tcp spt:22
7        0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0           tcp spt:22
8        0     0 ACCEPT     all  --  *      *       0.0.0.0/0            172.16.1.2         
9        0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:80
10       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpt:443
11       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpts:20:21
12       0     0 ACCEPT     tcp  --  *      *       0.0.0.0/0            0.0.0.0/0           tcp dpts:1024:65535 state NEW,RELATED,ESTABLISHED
13       0     0 ACCEPT     tcp  --  *      eth0    0.0.0.0/0            0.0.0.0/0           tcp dpt:8245
14       0     0 ACCEPT     tcp  --  *      eth1    0.0.0.0/0            0.0.0.0/0           tcp dpt:8245

Este ha sido mi trabajo de estos dias y lo comparto con usted. Es posible mejorarlo y agregar mas ejemplos y casos mas complicados y sera trabajo para un futuro.

Este documento es liberado por la licencia GPL, asi que compartanlo, modifiquenlo y compartan sus modificaciones para que siga creciendo.  Cualquier preguntas o comentario estoy por aca...


----------------------------------------------------------------------------------------------------------------------------------
FUENTES:
http://www.pello.info/filez/IPTABLES_en_21_segundos.html   
http://www.pello.info/filez/firewall/iptables.html
http://es.wikipedia.org/wiki/Netfilter/iptables
http://www.alcancelibre.org/staticpages/index.php/introduccion-iptables
http://web.mit.edu/rhel-doc/4/RH-DOCS/rhel-sg-es-4/ch-fw.html
http://sindormir.net/iptables/
http://www.cyberciti.biz/tips/linux-iptables-examples.html
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
http://www.novell.com/coolsolutions/feature/18139.html
http://lists.netfilter.org/pipermail/netfilter/2000-June/004382.html   
http://bulma.net/impresion.phtml?nIdNoticia=1522
http://www.carrosses.com/~peratu/tutoriales/iptables/iptables.html
http://lists.centos.org/pipermail/centos-es/2008-August/003428.html
http://www.linux-cd.com.ar/manuales/blfs-es-1.0-html/postlfs/firewall.html
http://www.linuxfromscratch.org/blfs/view/6.3/postlfs/firewall.html
http://en.wikipedia.org/wiki/Netfilter
http://www.linuxguide.it/command_line/linux-manpage/do.php?file=iptables