-=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
No hay comentarios:
Publicar un comentario