Tal como lo dice el titulo, el día de ayer escribí una entrada sobre una pequeña conversación que tuve con uno de los expertos en seguridad, si bien no hay que ser paranoico con los computadores que tenemos en casa, eso no quiere decir que no debamos tomar medidas de seguridad. Como dije anteriormente tengo pensado tomar dos medidas, una es la de instalar mi propio router de gamma baja y administrarlo, para proteger la red interna de mi casa, y la otra medida fue instalar un Firewall en mi equipo con Archlinux. Si buscamos en la Wiki de Archlinux, obtendremos que hay una gran cantidad de aplicaciones en Archlinux para esta función, aunque por decirlo así la mayoría son Front-end de iptables, y hay muchas GUI para administrar tu propio Firewall. Personalmente me puse a investigar sobre iptables y decidí aprender lo básico, que quede claro que no soy un experto en esta aplicación y mucho menos un experto en seguridad, pero con lo que he leído y sacado de muchas partes, creo que tengo la capacidad de configurar un firewall medianamente decente :).
Vamos al grano:
- Lo primero que debemos de hacer es instalar iptables:
#yaourt -S iptables
- Luego de haberlo instalado, podremos revisar como está configurado netfilter por defecto con el comando que mostraré en la parte de abajo:
[root@chucho ~]# 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
Si queremos una información mas detallada, podremos usar la opción "nvL", así:
[root@chucho ~]# iptables -nvL Chain INPUT (policy ACCEPT 5057 packets, 4614K 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 4824 packets, 839K bytes) pkts bytes target prot opt in out source destination
En el caso anterior vimos los puertos además de las políticas por defecto que se encuentran todas en "ACCEPT".
Entonces aquí tenemos las siguientes cadenas:
INPUT: Es la cadena de entrada. En pocas palabras es el trafico que viene desde afuera hacia nuestra maquina.
OUTPUT: Como su nombre lo indica es la cadena de salida, es decir, es el trafico que sale de nuestro equipo hacia Internet.
FORDWARD: Es la cadena de redireccionamiento, esta cadena es muy útil cuando queremos hacer NAT o como su nombre lo indica redireccionamiento de trafico, a ver si me explico, supongamos que tenemos una maquina virtual con una dirección IP privada que NO tenga salida a Internet, digamos 10.0.0.15, y en la maquina real tenemos una dirección IP pública 200.232.17.205 y queremos conectarnos a la maquina virtual a través de ssh, ¿Pero como llegamos a la virtual si no tienes acceso a Internet? Entonces con iptables podemos decir algo como:
"Todo el trafico que llegue a la dirección IP 200.232.17.205 en el puerto 10081 redirigalo a la dirección IP 10.0.0.15 al puerto 22".
Lo del puerto 10081 puede ser un puerto aleatorio que no estés usando obviamente, y el 22 es el puerto por defecto de ssh aunque puede ser otro pero eso es otro tema.
Para los expertos en redes: Si ya lo se, el ejemplo anterior no es tan simple como soplar y hacer botella, pero omití algunas cosas solo para explicar mas o menos de que se trata el "FORDWARD".
Lo primero que hay que tener claro a la hora de instalar un Firewall, es definir exactamente que es lo que quieres, para eso tienes dos opciones:
1. Aceptar todo por defecto e ir cerrando los puertos que necesitas.
2. Denegar todo por defecto y abrir los puertos que necesitas.
La primera opción es mas sencilla de configurar, pero a nivel de seguridad no es tan recomendable ya que hay que tener claro que se va a dejar cerrado exactamente, es decir, puedes dejar el puerto 64000 abierto y quizás no te afecta pues no sabes para que es, pero se te pueden olvidar puertos importantes como el SNMP y podrías perder control de todo, con la segunda opción la cosa cambia y tendremos un verdadero muro, pero el firewall es mas difícil de configurar.
En mi caso digamos que "denegamos" todo por defecto, aunque en realidad no es así, en pocas palabras lo recomendable es denegar la entrada (INPUT) y el redireccionamiento (FORDWARD) por defecto y aceptar la salida (OUTPUT).
Los comandos a ejecutar serían los siguientes:
#iptables -P INPUT DROP
#iptables -P FORWARD DROP
#iptables -P OUTPUT ACCEPT
Antes de ponernos a teclear comandos de iptables quiero dejar claro unas cosas, la cadena OUTPUT, que es el trafico de salida, se deja en ACCEPT por defecto debido a que es mucho mas practico, podemos colocarla en DROP pero eso haría que las cosas se complicaran mucho más y además toca tener mucha experiencia en este campo para poder trabajar así, por lo tanto, es mejor dejar las políticas tal cual mostré anteriormente, de todas maneras es muy extraño que se bloquee todo lo que sale de nuestra maquina :).
Mi idea, es explicar paso a paso lo que se está haciendo, en muchos sitios te recomiendan leer el aburrido manual de iptables, si ves eso, es para asustarse, así que en este caso explicaré las nomenclaturas de iptables de forma corta:
-A = Agregar una regla.
-D = Eliminar una regla.
-P = Aplicar una política por defecto.
-R = Remplazar una regla.
-L = Listar el numero de reglas actuales.
-F = Eliminar todas las reglas.
-X = Borrar una regla definida por el usuario.
-Z = Colocar los contadores en cero.
Ahora por cada regla podemos hacer uso de parámetros que nos pueden ayudar a hacerlas mas especificas.
-p = Especificamos el protocolo a usar, por ejemplo: tcp,udp,etc
-s = Dirección IP fuente.
-d = Dirección IP destino
-s = Dirección IP fuente.
-d = Dirección IP destino
-o = Interfaz de salida (ethx, lo, wlanx, etc)
-i = Interfaz de entrada (ethx, lo, etc)
--sport = Puerto o rango de puertos fuente
--dport = Puerto o rango de puertos destino
-j = Acción a tomar ( ACCEPT, DROP, REJECT Aceptar o Denegar)
-m= match, mas abajo trataré de explicar de que trata porque es algo complicadito para mi :).
-i = Interfaz de entrada (ethx, lo, etc)
--sport = Puerto o rango de puertos fuente
--dport = Puerto o rango de puertos destino
-j = Acción a tomar ( ACCEPT, DROP, REJECT Aceptar o Denegar)
-m= match, mas abajo trataré de explicar de que trata porque es algo complicadito para mi :).
Entonces, con todo el carretazo que eché anteriormente la pregunta sería:
¿Quiero que mi hermano mayor pueda acceder a mi servidor web porno, como hago?.
Solo tenemos que tener la ip de tu hermano y tener claro que puerto debemos abrir, entonces, por lógica sabemos que el puerto de un servidor web es el TCP 80 (A menos que lo cambien), entonces las regla a aplicar serían:
#iptables -A INPUT -s ipdetuhermano -p tcp --dport 80 -j ACCEPT.
La politica de salida por defecto en nuestro firewall es ACEPTAR, pero si quieres especificarla pues solo sería:
#iptables -A OUTPUT -d ipdetuhermano -p tcp --dport 80 -j ACCEPT.
Si ven que no es tan complicado como parece, cierto?. Si miramos las nomenclaturas que están anteriormente citadas y las reglas que coloqué verán que no tiene ciencia. Con iptables no solo podemos permitir que una IP se conecte a nuestra red, sino que también podemos decir que todos los equipos de nuestra red interna puedan hacerlo.
En mi experiencia personal, la mejor forma de definir reglas en iptables es a través de un bash script. De esta manera tenemos todo en orden y podemos ahorrarnos muchos dolores de cabeza, por ejemplo: "La regla anterior (la del servidor web) no me sirve porque me equivoqué de ip". Entonces sería muy feo colocar.
#iptables -D OUTPUT -d ipdetuhermano -p tcp --dport 80 -j ACCEPT.
Personalmente conozco dos formas de aplicar las reglas en iptables, una es añadiendo regla por regla, tal cual como muestran los ejemplos, pero tiene la desventaja de puedes correr el riesgo de cagarla a menos que sepas lo que haces, por ejemplo, si envías un paquete X, el firewall va comparando dicho paquete con cada regla hasta que lo encuentra, es decir, hace Match , y se hace lo que dicte dicha regla, luego de eso, NO SE MIRARÁN MAS REGLAS, así que si colocas una regla muy permisiva al principio, probablemente las que sigan NO se apliquen, la otra opción que yo propongo y es la que la mayoría de personas hacen, es a través de un bash script, pues simplemente ordenas tus reglas y las vas cambiando con el paso del tiempo, y así te evitas ejecutar comandos como el anterior.
Después de terminar con toda la carreta dejo el script que hice comentado, pueden copiar y pegar lo que está acá pero la idea es que analicen cada detalle y entiendan bien lo que se está haciendo.
#!/bin/bash # ## SCRIPT IPTABLES ## Script para la protección del computador. #-------------------------------------------------------- #Asignamos un valor a la interfaz que nos interesa, esto puede ser útil si manejas muchas interfaces, y muchas reglas. En mi caso es la wlan0, si no es así DEBES cambiar este valor. #-------------------------------------------------------- Interfaz=wlan0 #-------------------------------------------------------- ## FLUSH de reglas, como vimos en las nomenclaturas anteriormente, esto nos sirve para borrar cualquier configuración de iptables que hayamos hecho anteriormente. #-------------------------------------------------------- iptables -F && echo Flush_OK iptables -X && echo Flush_OK iptables -Z && echo Flush_OK iptables -t nat -F && echo Flush_OK #-------------------------------------------------------- # Estableciendo politicas por defecto #-------------------------------------------------------- iptables -P FORWARD DROP && echo FORWARD_DROPPED iptables -P OUTPUT ACCEPT && echo OUTPUT_ACCEPTED iptables -P INPUT DROP && echo OK INPUT_DROPPED #-------------------------------------------------------- ## Aquí comienza los filtros #-------------------------------------------------------- # Le dejamos acceso a localhost para todo, importante esta regla. iptables -A INPUT -i lo -j ACCEPT && echo Localhost_accepted iptables -A OUTPUT -o lo -j ACCEPT && echo Localhostout_accepted #-------------------------------------------------------- # Habilitar puertos 80 (www) and 443 (https) desde el firewall #-------------------------------------------------------- iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -o $Interfaz -p tcp --dport 80 --sport 1024:65535 -j ACCEPT && echo Conexion_establecida_puerto_80 iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -o $Interfaz -p tcp --dport 443 --sport 1024:65535 -j ACCEPT && echo Conexion_establecida_puerto_443 #-------------------------------------------------------- # Habilitar conexiones previamente establecidas a la interface de red, en este caso es wlan0 #-------------------------------------------------------- iptables -A INPUT -m state --state ESTABLISHED,RELATED -i $Interfaz -j ACCEPT && echo Salida_Internet #Fin del Script.Tal cual como está el script, es como lo tengo configurado en estos momentos en mi equipo, solo tengo acceso al puerto 80 y al 443 porque son los puertos www y https, en pocas palabras, tengo lo estrictamente necesario para navegar en Internet, no necesito más, si tu caso es el mismo que el mío entonces copia lo anterior en un archivo de texto, guardarlo y darles permisos de ejecución.
En mi caso lo guardé como "iptablescript". Entonces le damos permisos de ejecución.
$chmod +x iptablescript.
Y lo ejecutamos como root.
#./iptablescript.
Ahora podemos ver que nos muestra el parámetro -nvL en este caso:
[root@chucho ~]# iptables -nvL Chain INPUT (policy DROP 126 packets, 31197 bytes) pkts bytes target prot opt in out source destination 10 500 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 3 144 DROP all -- * * 0.0.0.0/0 0.0.0.0/0 ctstate INVALID 167K 227M ACCEPT all -- wlan0 * 0.0.0.0/0 0.0.0.0/0 state RELATED,ESTABLISHED Chain FORWARD (policy DROP 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 333 packets, 23316 bytes) pkts bytes target prot opt in out source destination 10 500 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0 47383 4223K ACCEPT tcp -- * wlan0 0.0.0.0/0 0.0.0.0/0 state NEW,RELATED,ESTABLISHED tcp spts:1024:65535 dpt:80 10199 1839K ACCEPT tcp -- * wlan0 0.0.0.0/0 0.0.0.0/0 state NEW,RELATED,ESTABLISHED tcp spts:1024:65535 dpt:443
Ahora muchos se preguntarán ¿Que coños significa -m RELATED y demás tonterías?. He aquí la explicación.
Como dije anteriormente, la -m significa un match, es decir, compara el tipo de conexión existente, aquí muestro los tipos de conexiones que hay:
NEW Conexión nueva
ESTABLISHED Conexión establecida anteriormente
RELATED Conexión relacionada
INVALID Conexión invalida
Entonces cuando ejecutamos esta regla en el shell:
$ sudo iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -o wlan0 -p tcp --dport 80 --sport 1024:65535 -j ACCEPT && echo Conexion_establecida_puerto_80
Estamos diciendo a netfilter, todas las conexiones de salida NUEVAS, ESTABLECIDAS y RELACIONADAS a través del puerto 80 dejalas pasar. los puertos 1024 al 65535 son los puertos por defecto asociados a ciertos programas o servicios, es recomendable usarlos porque los puertos fueras de este rango se consideran inseguros, sin embargo, si quieres que se haga a través de cualquier puerto puedes remover la parte que dice "--sport 1024:65535".
Normalmente después de cada regla coloco && echo, esto es para que después de que se ejecute la regla, el script me diga si se ejecutó correctamente, de esa forma si coloco un parámetro mal, ya se donde tengo que corregir.
Después de ejecutar el script y hacer las respectivas revisiones, si nos gusta como quedó todo, simplemente guardamos las reglas en Archlinux:
#/etc/rc.d/iptables save
De esta manera cada vez que iniciemos el demonio iptables, cargará las reglas que hemos puesto en el script automáticamente, si deseamos que iptables arranque automáticamente cada vez que encendamos el equipo, simplemente agregramos "iptables" en la sección DAEMON de nuestro archivo ubicado en /etc/rc.conf.
Ahora, si el script anterior no te es útil, puedes agregar mas reglas, en mi caso tengo una base de datos para amarok en mysql, no me interesa que nadie mas tenga acceso a ella, pero si lo deseo, simplemente puedo agregar al script una linea mas. Por ejemplo:
#!/bin/bash # ## SCRIPT IPTABLES ## Script para la protección del computador. #-------------------------------------------------------- #Asignamos un valor a la interfaz que nos interesa, esto puede ser útil si manejas muchas interfaces, y muchas reglas. En mi caso es la wlan0, si no es así DEBES cambiar este valor. #-------------------------------------------------------- Interfaz=wlan0 #-------------------------------------------------------- ## FLUSH de reglas, como vimos en las nomenclaturas anteriormente, esto nos sirve para borrar cualquier configuración de iptables que hayamos hecho anteriormente. #-------------------------------------------------------- iptables -F && echo Flush_OK iptables -X && echo Flush_OK iptables -Z && echo Flush_OK iptables -t nat -F && echo Flush_OK #-------------------------------------------------------- # Estableciendo politicas por defecto #-------------------------------------------------------- iptables -P FORWARD DROP && echo FORWARD_DROPPED iptables -P OUTPUT ACCEPT && echo OUTPUT_ACCEPTED iptables -P INPUT DROP && echo OK INPUT_DROPPED #-------------------------------------------------------- ## Aquí comienza los filtros #-------------------------------------------------------- # Le dejamos acceso a localhost para todo, importante esta regla. iptables -A INPUT -i lo -j ACCEPT && echo Localhost_accepted iptables -A OUTPUT -o lo -j ACCEPT && echo Localhostout_accepted #-------------------------------------------------------- # Habilitar puertos 80 (www) and 443 (https) desde el firewall #-------------------------------------------------------- iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -o $Interfaz -p tcp --dport 80 --sport 1024:65535 -j ACCEPT && echo Conexion_establecida_puerto_80 iptables -A OUTPUT -m state --state NEW,ESTABLISHED,RELATED -o $Interfaz -p tcp --dport 443 --sport 1024:65535 -j ACCEPT && echo Conexion_establecida_puerto_443 #-------------------------------------------------------- # Habilitar conexiones previamente establecidas a la interface de red, en este caso es wlan0 #-------------------------------------------------------- iptables -A INPUT -m state --state ESTABLISHED,RELATED -i $Interfaz -j ACCEPT && echo Salida_Internet #-------------------------------------------------------- #HABILITAMOS EL PUERTO 3306 DE MYSQL PARA LA DIRECCIÓN 192.168.0.12 (PUEDE SER EL COMPUTADOR DE UN AMIGO) #-------------------------------------------------------- iptables -A INPUT -s 192.168.0.12 -p tcp --dport 3306 -j ACCEPT iptables -A OUTPUT -d 192.168.0.12 -p tcp --dport 3306 -j ACCEPT #-------------------------------------------------------- #HABILITAMOS EL PUERTO 80 PARA QUE NUESTRO AMIG@ PUEDA NAVEGAR A NUESTRO SERVIDOR #-------------------------------------------------------- iptables -A INPUT -s 192.168.0.12 -p tcp --dport 80 -j ACCEPT iptables -A OUTPUT -d 192.168.0.12 -p tcp --dport 80 -j ACCEPT #Fin del Script.
Solo sería guardar el script, ejecutarlo, y hacer los mismos pasos anteriores para que el iptables cargue las reglas por defecto, repito:
#/etc/rc.d/iptables save.
Herramientas para probar tu firewall:
Nmap: Con nmap podemos revisar que puertos se encuentran cerrados, en el caso de los puertos TCP con este comando sabríamos que puertos están abiertos.
#nmap -sS localhost -p 1-65535
Para los puertos UDP:
#nmap -sU localhost
Iptraf: Con este programa podemos saber que conexiones se establecen y cuales no, si lo controlan bien, es una excelente herramienta para hacer depuraciones sobre el firewall.
CRÉDITOS:
Bueno, esta ha sido una guía algo larga, espero que haya sido lo mas clara posible, si alguien no entiende nada, pues agradecería que me lo hagan saber para tratar de ser lo mas claro posible. Esta pequeña guía no hubiera sido posible sin estos sitios a los cuales hay que darle todos los créditos:
http://foro.elhacker.net/tutoriales_documentacion/iptables_introduccion-t102656.0.html
http://www.estrellateyarde.org/equiv/firewall-en-linux
http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables
http://administradores.educarex.es/wiki/index.php/IpTables
Comentarios
"1. Aceptar todo por defecto e ir cerrando los puertos que necesitas. "
Se te ha olvidado un no
Me parece que voy a hacer peyas durante 4 horas y media para instalarlo porque parece complicado y si no lo es es largo
Si no la terminal no los coge (Coger en España no significa lo que significa en Argentina, Uruguay, Paraguay, lo digo porque si en Colombia significa eso que sabemos que no haya malentendidos)
PD: En Colombia "coger" significa las dos cosas, depende en el sentido que lo digas ;).. Un saludo..
Cordial saludos.
y em sigue saliendo el mismo puerto que tenía abierto por qué?
PORT STATE SERVICE
631/tcp open ipp