Configuración firewall iptables Red Hat

19
Configuración firewall iptables Red Hat/CentOS 6, desde linea de comandos IPTABLES es el firewall incluido a nivel de kernel en las distribuciones Linux, es muy potente (una vez comprendido su funcionamiento), muy útil y flexible. Este post se ha hecho sobre un CentOS 6 (clon de Red Hat), prácticamente todo se debería poder aplicar a cualquier distribución. Mucho cuidado con los — y los -, wordpress hace conversiones, el largo son en realidad 2 cortos. En los ejemplos no existe esa conversión. El funcionamiento básico de iptables es el siguiente: Existen chains (cadenas) de reglas. Basicamente 3: INPUT, OUTPUT y FORWARD. Las reglas dentro de una cadena se evaluan por orden. Es aquí donde hay multitud de opciones de filtrado. Cuando una regla se evalua de forma positiva, es dirigida a un TARGET. Puede ser aceptada, denegada, eliminada, logada u otras muchas consas más (ver man iptables TARGET EXTENSIONS). Podemos listar las reglas actuales con: 1 /sbin/ iptables -L La relación de puertos y servicios se puede ver en: 1 /etc/ service s iptables trabaja con el concepto cadenas (chains), 3 tipos: INPUT, tráfico entrante. OUTPUT, tráfico saliente.

Transcript of Configuración firewall iptables Red Hat

Page 1: Configuración firewall iptables Red Hat

Configuración firewall iptables Red Hat/CentOS 6, desde linea de comandos

IPTABLES es el firewall incluido a nivel de kernel en las distribuciones Linux, es muy potente (una vez comprendido su funcionamiento), muy útil y flexible. Este post se ha hecho sobre un CentOS 6 (clon de Red Hat), prácticamente todo se debería poder aplicar a cualquier distribución.

Mucho cuidado con los — y los -, wordpress hace conversiones, el largo son en realidad 2 cortos. En los ejemplos no existe esa conversión.

El funcionamiento básico de iptables es el siguiente:

Existen chains (cadenas) de reglas. Basicamente 3: INPUT, OUTPUT y FORWARD.

Las reglas dentro de una cadena se evaluan por orden. Es aquí donde hay multitud de opciones de filtrado.

Cuando una regla se evalua de forma positiva, es dirigida a un TARGET. Puede ser aceptada, denegada, eliminada, logada u otras muchas consas más (ver man iptables TARGET EXTENSIONS).

Podemos listar las reglas actuales con:

1 /sbin/iptables -L

La relación de puertos y servicios se puede ver en:

1 /etc/services

iptables trabaja con el concepto cadenas (chains), 3 tipos:

INPUT, tráfico entrante.

OUTPUT, tráfico saliente.

FORWARD, tráfico a través de la máquina.

Sintaxis IPTABLES (muy resumido, para más detalles ver man):

1 iptables [-t tabletype] COMMAND [-m MATCH_EXTENSION] -j TARGET

tabletype=>

filter, filtrado de paquetes (por defecto)

nat, configuración NAT o enmascaramiento

<COMMAND>=>

-A, –append chain rule-specification, añadir una regla al final de la cadeana

-D –delete chain [rulenum|rule-specification] , elimina una regla. Si se especifica mediante rulenum, la primera regla es 1.

Page 2: Configuración firewall iptables Red Hat

-I, –insert chain [rulenum] rule-specification, inserta una regla antes de la numrule (por defecto 1, la primera)

-R, –replace chain rulenum rule-specification, reemplaza una regla en una chain (numrule=1 es la primera)

-L, –list [chain], listado reglas

-F, –flush [chain], flush de reglas en chains actuales (las borra todas)

<rule-specification>=>

[!] -s –source address[/mask], origen del paquete, puede ser una ip con o sin máscara o el nombre de un host

[!] -d –destination address[/mask], destino del paquete, puede ser una ip con o sin máscara o el nombre de un host(ojo que el nombre solo se resuelve una sola vez antes de enviar las reglas al kernel).

[!] -p –protocol, protocolo usado en la cominicación: tcp, udp, udplite, icmp, esp, ah, sctp o all

[!] –source-port,–sport port[:port], puerto o rango de puertos de destino de la comunicación

[!] –destination-port,–dport port[:port], puerto o rango de puertos de destino de la comunicación

[!] -i –in-interface name, nombre del interfaz de entrada de la comunicación. Por defecto todos los interfaces.

[!] -o –out-interface name, nombre del interfaz de salida de la comunicación. Por defecto todos los interfaces.

Si se antepone una !, esto quiere decir que estamos negando la condicion.

<MATCH_EXTENSION>, puede especificarse con -m o –match

state, permite filtrar por estado de conexion. Opciones:

[!] –state estado, se pueden especificar varios estados separados por ,. Los estados pueden ser:

-INVALID, paquete no identificado.

-NEW, nueva conexión

-ESTABLISHED, conexión existente.

-RELATED, relativa a otra conexión.

Ejemplo, aceptar todas las conexiones relativas o establecidas(es mejor aplicar filtrado solo a conexiones NEW):

1 iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

comment, aplicar comentarios a una regla. Opciones:

Page 3: Configuración firewall iptables Red Hat

–comment comentario

Ejemplo:

1iptables -A INPUT -m state --state ESTABLISHED,RELATED -m comment --comment "Permitir conexiones existentes" -j ACCEPT

mac, aplicar filtrado por MAC, no es aplicable para el chain OUTPUT. Opciones:

[!] –mac-source address, el formato de MAC es XX:XX:XX:XX:XX:XX

Ejemplo:

1 iptables -A INPUT -p TCP --dport 80 -m mac --mac-source FE:54:00:FC:4F:CC -j ACCEPT

limit, aplicación de limites promedios y ráfagas. Opciones:

–limit rate[/second|/minute|/hour|/day], especifica una frecuencia media por unidad de tiempo.

–limit-burst number, especifica una cantidad de peticiones a las que no se aplicará el limit. Una vez superado se ceñirá a la especimicación de limit.

Ejemplo, aceptar una media de 1 conexión por segundo con ráfagas de 2:

1iptables -A INPUT -m state --state NEW -p tcp --dport 25 -m limit --limit 1/second --limit-burst 2 -j ACCEPT

<TARGET>=>

DROP, eliminar paquete sin informar al remitente

REJECT, eliminar paquete informado error al remitente por defecto port-unreachable. El error informado se puede definir con: –reject-with [icmp-net-unreachable, icmp-host-unreachable, icmp-port-unreachable, icmp-proto-unreachable, icmp-net-prohibited, icmp-host-prohibited, icmp-admin-prohibited]

ACCEPT, paquete aceptado

LOG, es un TARGET EXTENSIONS. Escribe algo en el log, podemos configurar el prefijo con –log-prefix “texto_prefijo”. Por defecto escribe en /var/log/messages

Ejemplo para permitir icmp, puerto 22, aceptar puerto 80 por una MAC específica, denegar todas las conexiones puerto 80 y logar, limitar tráfico puerto 22 y logar, permitir conexiones salientes puerto 22, eliminar demás conexiones salientes y permitir comunicación a través de la máquina:

01 #!/bin/bash

02 #flush de todas las reglas y todos los chains

03 iptables -F

04

Page 4: Configuración firewall iptables Red Hat

05 #trafico entrante

06iptables -A INPUT -m state --state ESTABLISHED,RELATED -m comment --comment "Aceptar conexiones existentes" -j ACCEPT

07 iptables -A INPUT -p icmp -m comment --comment "Aceptar ping" -j ACCEPT

08 iptables -A INPUT -i lo -m comment --comment "Aceptar conexiones internas" -j ACCEPT

09iptables -A INPUT -m state --state NEW -p tcp --dport 22 -m comment --comment "Aceptar puerto 22" -j ACCEPT

10iptables -A INPUT -p TCP --dport 80 -m mac --mac-source FE:54:00:FC:4F:CC -m comment --comment "Aceptar peticiones al puerto 80 por una MAC" -j ACCEPT

11iptables -A INPUT -m state --state NEW -p tcp --dport 80 -m comment --comment "Logar intentos accesos puerto 80" -j LOG --log-prefix "denegado_puerto_80"

12iptables -A INPUT -m state --state NEW -p tcp --dport 80 -m comment --comment "Eliminar accesos puerto 80" -j DROP

13iptables -A INPUT -m state --state NEW -p tcp --dport 25 -m limit --limit 1/second --limit-burst 2 -j ACCEPT

14iptables -A INPUT -m state --state NEW -p tcp --dport 25 -j LOG --log-prefix "Ataque DOS puerto 25"

15 iptables -A INPUT -m comment --comment "Eliminar todo lo demás" -j DROP

16

17 #trafico saliente

18iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -m comment --comment "Aceptar conexiones salientes existentes" -j ACCEPT

19iptables -A OUTPUT -m state --state NEW -p tcp --dport 22 -m comment --comment "Aceptar puerto 22 saliente" -j ACCEPT

20 iptables -A OUTPUT -m comment --comment "Eliminar todas las demás salientes" -j DROP

21

22 #trafico interno

23 iptables -A FORWARD -m comment --comment "Aceptar todo el tráfico interno" -j ACCEPT

Los comentarios ayudan mucho a identificar el cometido de cada una de las reglas:

01 [root@tester1 ~]# iptables -L

Page 5: Configuración firewall iptables Red Hat

02 Chain INPUT (policy ACCEPT)

03 target prot opt source destination

04ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED /* Aceptar conexiones existentes */

05 ACCEPT icmp -- anywhere anywhere /* Aceptar ping */

06 ACCEPT all -- anywhere anywhere /* Aceptar conexiones internas */

07 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh /* Aceptar puerto 22 */

08ACCEPT tcp -- anywhere anywhere tcp dpt:http MAC FE:54:00:FC:4F:CC /* Aceptar peticiones al puerto 80 por una MAC */

09LOG tcp -- anywhere anywhere state NEW tcp dpt:http /* Logar intentos accesos puerto 80 */ LOG level warning prefix `denegado_puerto_80'

10 DROP tcp -- anywhere anywhere state NEW tcp dpt:http /* Eliminar accesos puerto 80 */

11 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:smtp limit: avg 1/sec burst 2

12LOG tcp -- anywhere anywhere state NEW tcp dpt:smtp LOG level warning prefix `Ataque DOS puerto 25'

13 DROP all -- anywhere anywhere /* Eliminar todo lo demás */

14

15 Chain FORWARD (policy ACCEPT)

16 target prot opt source destination

17 ACCEPT all -- anywhere anywhere /* Aceptar todo el tráfico interno */

18

19 Chain OUTPUT (policy ACCEPT)

20 target prot opt source destination

21ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED /* Aceptar conexiones salientes existentes */

22 ACCEPT tcp -- anywhere anywhere state NEW tcp dpt:ssh /* Aceptar puerto 22 saliente */

23 DROP all -- anywhere anywhere /* Eliminar todas las demás salientes */

Ahora desde fuera de la máquina podemos intentar (4 veces en menos de 2 segundos) un:

1 [jcmolinos@ppcjuancmolinos ~]$ telnet 192.168.122.150 25

Page 6: Configuración firewall iptables Red Hat

2 Trying 192.168.122.150...

3 telnet: connect to address 192.168.122.150: Connection refused

Y veremos en el log /var/log/messages:

18.122.150 LEN=60 TOS=0x10 PREC=0x00 TTL=64 ID=1351 DF PROTO=TCP SPT=46644 DPT=25 WINDOW=14600 RES=0x00 SYN URGP=0

2 Mar 7 20:38:03 tester1 yum: Installed: wget-1.12-1.4.el6.i686

Aplicación de reglas de forma automática

Si tenemos activado en el arranque el servicio iptables:

1 [root@tester1 ~]# chkconfig --list iptables

2 iptables 0:desactivado 1:desactivado 2:activo 3:activo 4:activo 5:activo 6:desactivado

Para que las reglas sean permanentes se han de incluir en el fichero:

1 /etc/sysconfig/iptables

Contenido ejemplo:

01 [root@tester1 sysconfig]# cat iptables

02 # Firewall configuration written by system-config-firewall

03 # Manual customization of this file is not recommended.

04 *filter

05 :INPUT ACCEPT [0:0]

06 :FORWARD ACCEPT [0:0]

07 :OUTPUT ACCEPT [0:0]

08 -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

09 -A INPUT -p icmp -j ACCEPT

10 -A INPUT -i lo -j ACCEPT

11 -A INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT

12 -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT

13 -A INPUT -j REJECT --reject-with icmp-host-prohibited

Page 7: Configuración firewall iptables Red Hat

14 -A FORWARD -j REJECT --reject-with icmp-host-prohibited

15 COMMIT

Su edición manual no es recomendada se debería usar system-config-firewall, o directamente no usarlo nunca y de esa forma no sobreescribe nuestras reglas.

Lo que se puede hacer es realizar todos los cambios en iptables como hemos visto arriba y luego directamente hacer:

1 /etc/init.d/iptables save

Esto actualizará el fichero:

1 /etc/sysconfig/iptables

Con las reglas que teníamos en memoria hasta ahora, nos asegurarnos que el servicio de iptables esté con arranque automático para que se apliquen las reglas en el siguiente arranque.

1 [root@tester1 ~]# chkconfig iptables on

Hay que tener en cuenta que las utilidades system-config-firewall-tui y system-config-firewall sobreescriben todas estas configuraciones, yo prefiero no usarlas.

Instalando y configurando iptables en centos

Entramos en materia, iptables es un firewall tipico de instalaciones linux:

1.- Instalacion usando yum:

yum install iptables

2.- Crear un archivo de texto de configuracion (usando nano o vim):

nano /etc/sysconfig/iptables

# By default drop all incoming and forwarded traffic# Allow all outgoing traffic*filter:INPUT DROP [0:0]:FORWARD DROP [0:0]:OUTPUT ACCEPT [0:0]

# Puerto 80 http para los diferentes servicios web que podamos tener-A INPUT -p udp –dport 80 -j ACCEPT

# Allow incoming SSH (el 22 es el puerto por default)-A INPUT -p tcp –dport 22Â -j ACCEPT

# Allow ping-A INPUT -p icmp –icmp-type ping -j ACCEPT

Page 8: Configuración firewall iptables Red Hat

# Allow local traffic-A INPUT -i lo -j ACCEPT

# Allow ping-A INPUT -p icmp –icmp-type ping -j ACCEPT

COMMITGuardamos el archivo y debemos reiniciar iptables:

service iptables restart

Aparecera:

Flushing firewall rules: [ OK ]Setting chains to policy ACCEPT: filter [ OK ]Unloading iptables modules: [ OK ]Applying iptables firewall rules: [ OK ]

Chequeo general:iptables -L

Configuracion de Iptables (Firewall en Linux) Que es un firewall

Lo primero que hay que tener en cuenta a la hora de configurar un firewall, es si verdaderamente es necesario, muchas personas, en la actualidad se conectan a Internet, de una u otra manera, desde las empresas, sus hogares o desde algún cybercafe, sin embargo, pocas de estas personas entienden realmente las consecuencias que tiene el abrir sus sistemas informáticos a Internet.

Un firewall es, por lo general, un software o hardware, a través del cual nos conectamos a una red como Internet, y que sirve como filtro sobre el tráfico que por él pasa, en ambas direcciones, y que en un momento dado puede rechazar cierto tráfico en alguna de las direcciones.

Eso quiere decir que, mediante un firewall, podemos detectar el tráfico no deseado hacia nuestros sistemas, y en general, los posibles ataques de que seamos objeto. De esta manera podremos aislar nuestros equipos del exterior, permitiendo nuestro uso de Internet de manera absolutamente normal pero minimizando en lo posible la probabilidad de padecer las consecuencias de un ataque.

Es frecuente también que se necesite exponer algún servidor a Internet (como es el caso de un

Page 9: Configuración firewall iptables Red Hat

servidor web, un servidor de correo, etc...), y en esos casos obviamente en principio se debe aceptar cualquier conexión a ellos.

Iptables (Software Libre)

Iptables es la herramienta que nos permite configurar las reglas del sistema de filtrado de paquetes del kernel de Linux, desde su versión 2.4 (en 2.2 era ipchains). Con esta herramienta, podremos crearnos un firewall adaptado a nuestras necesidades.

El funcionamiento es simple: a iptables se le proporcionan unas reglas, especificando cada una de ellas unas determinadas características que debe cumplir un paquete. Además, se especifica para esa regla una acción o target. Las reglas tienen un orden, y cuando se recibe o se envía un paquete, las reglas se recorren en orden hasta que las condiciones que pide una de ellas se cumplen en el paquete, y la regla se activa realizando la acción que se le ha especificado.

Estas acciones se plasman en los que se denominan targets, que indican lo que se debe hacer con el paquete. Los más usados son bastante explícitos: ACCEPT, DROP y REJECT. En cuanto a los paquetes, el total del sistema de filtrado de paquetes del kernel se divide en tres tablas, cada una con varias cadenas (chains) a las que puede pertenecer un paquete, de la siguiente manera.

Page 10: Configuración firewall iptables Red Hat

FILTER: Tabla por defecto, para los paquetes que se refieran a nuestra máquinao INPUT: Paquetes recibidos para nuestro sistemao FORWARD: Paquetes enrutados a través de nuestro sistemao OUTPUT: Paquetes generados en nuestro sistema y que son enviados

NAT: Tabla referida a los paquetes enrutados en un sistema con Masqueradingo PREROUTING: Para alterar los paquetes según entreno OUTPUT: Para alterar paquetes generados localmente antes de ser enrutadoso POSTROUTING: Para alterar los paquetes cuando están a punto para salir

MANGLE: Alteraciones más especiales de paqueteso PREROUTING: Para alterar los paquetes entrantes antes de ser enrutadoso OUTPUT: Para alterar los paquetes generados localmente antes de enrutar

Especificación de reglasSe hace con los siguientes parámetros (especificando aquellos que se necesite):

-p [protocolo]: Protocolo al que pertenece el paquete. -s [origen]: dirección de origen del paquete, puede ser un nombre de host, una dirección

IP normal, o una dirección de red (con máscara, de forma dirección/máscara). -d [destino]: Al igual que el anterior, puede ser un nombre de host, dirección de red o

dirección IP singular. -i [interfaz-entrada]: Especificación del interfaz por el que se recibe el paquete. -o [interfaz-salida]: Interfaz por el que se va a enviar el paquete. [!] -f: Especifica que la regla se refiere al segundo y siguientes fragmentos de un

paquete fragmentado. Si se antepone !, se refiere sólo al primer paquete, o a los paquetes no fragmentados.

Y además, uno que nos permitirá elegir qué haremos con el paquete:

-j [target]: Nos permite elegir el target al que se debe enviar ese paquete, esto es, la acción a llevar a cabo con él.

Page 11: Configuración firewall iptables Red Hat

Antes de iniciar con el ejemplo de las reglas del firewall es importante reconocer que el orden de las reglas es determinante. Normalmente cuando hay que decidir que se hace con un paquete se va comparando con cada regla del firewall hasta que se encuentra una que le afecta (match), y se hace lo que dicte esta regla (aceptar o denegar); es decir una vez que un paquete coincide con una regla no se analizan las siguientes.

Ejemplo de reglas de iptables InicializarEstablecer políticas por defecto , importante para definir en principio que todo lo que entra y sale por el firewall se acepta y solo se denegará lo que se diga explícitamente. Esto facilita mucho la gestión del firewall, ya que simplemente nos tenemos que preocupar de proteger aquellos puertos o direcciones que sabemos que nos interesa. Sin embargo esto puede resultar peligroso.

echo 1 > /proc/sys/net/ipv4/ip_forward iptables -X

iptables -F

iptables -Z

iptables -t nat -F

iptables -P INPUT ACCEPT iptables -P OUTPUT ACCEPT

iptables -P FORWARD ACCEPT

iptables -t nat -P PREROUTING ACCEPT

#iptables -t nat -P FORWARD ACCEPT

iptables -t nat -P POSTROUTING ACCEPT

Page 12: Configuración firewall iptables Red Hat

Establecer políticas para denegar acceso al ssh en las interfaces eth0 y la red 192.168.1.0, permitir acceso total a la red desde las direcciones 172.16.2.0 y la red 172.16.20.0; permitir también que los usuarios de la red 172.16.10.0, puedan acceder al Internet y

Ejemplo de reglas para la tabla Filter

iptables -A INPUT -i eth0 -p tcp --dport 22 -j DROP

iptables -A INPUT -s 192.168.1.0/24 -p tcp --dport 22 -j DROP

#

iptables -A INPUT -s 172.16.2.0/24 -j ACCEPT

iptables -A INPUT -s 172.16.20.0/24 -j ACCEPT

iptables -A FORWARD -s 192.168.10.0/24 -i eth1 -p tcp --dport 80 -j ACCEPT

Por medio de esta regla se esta indicando que todo el trafico proveniente de la red 192.168.1.0, sera enmascarado con la dirección IP de la tarjeta de red eth0 (172.16.2.13, para este ejemplo)

Ejemplo de reglas para la tabla NATiptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j MASQUERADE

Nota: Si el enrutador no tiene configurada una regla que indique realizar NAT a la red 172.16.10.0, sera indispensable, establecer una regla como la siguiente, sin embargo esto ocultara el trafico que proviene de esta red.

iptables -t nat -A POSTROUTING -s 172.16.10.0/24 -o eth0 -j MASQUERADE

Este es un pequeño ejemplo de iptables, sin embargo iptables es una herramienta muy poderosa y es útil para realizar un sin numero de restricciones como sean necesarios, algunos prefieren desde el principio configurar un iptables mucho mas fuerte, inicializando las reglas con DROP, esto requerirá mas conocimiento por parte del administrador del equipo.