Configuración firewall iptables Red Hat
Transcript of 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.
-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:
–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
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
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
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
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
# 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
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.
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.
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
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.