Gestion y Monitoreo de Redes Construyendo un firewall de Host (Ubuntu/Debian) Notas: ------ * Comandos que empiezan con un "$" implica que deberia ejecutar el comando como un usuario general - no como root. * Comandos que empiezan con un "#" implica que deberia trabajar como el usuario root. * Comandos con lineas mas especificas (como "GW-RTR>" o "mysql>") implica que esta ejecutando el comando en un equipo remoto o dentro otro programa. * Si una linea termina con un "\" esto indica que el comando sigue en la proxima linea y Ud. deberia tratar el comando si como fuera en una sola linea. Exercicios Parte I ---------------- 0. Haz un log in en su PC o abre una ventana de terminal como el usuario sysadmin. 1. Creating an initial firewall ---------------------------- 1. Creando un firewall ------------------- Creamos un firewall simple para entender como se lo hace. Haremos una regla muy simple - bloqueamos acceso a ping a su PC. Es un buen ejemplo, pero no queremos hacer esto en la vida real. Ping es demasaido util para bloquear: Haz lo siguiente: $ sudo iptables -A INPUT -p icmp --icmp-type echo-request -i lo -j DROP Revisamos si la regla de Firewall esta funcionando: $ ping localhost Deberia fallar. Apreta ctrl-c para salir del comando ping. Si queria hacer esta regla permanente se lo haria: $ sudo iptables-save > /etc/iptables.rules $ sudo vi /etc/network/interfaces En el archivoe "interfaces" va a ver algo como: >>> # El interfaz de la red principal auto eth0 iface eth0 inet static address 67.218.55.101 netmask 255.255.255.192 network 67.218.55.64 broadcast 67.218.55.127 gateway 67.218.55.65 # dns-* options are implemented by the resolvconf package, if installed dns-nameservers 67.218.55.67 dns-search pacnog.bluesky.as <<<< Al fin de esta entrada, despues que la linea que dice "dns-search" deberai agregar algo asi: pre-up iptables-restore < /etc/iptables.rules Ahora graba el archivo y sale (":wq" en vi). Ahora cada vez que su maquina inicializa las reglas de iptables estaran aplicadas. 2. Removiendo la regla de iptables que bloquea ping ------------------------------------------------ Para remover una regla es simple. Hay dos maneras do hacerlo. Puede hacer: $ sudo iptables -D INPUT -p icmp --icmp-type echo-request -i lo -j DROP Ahora intenta hacer un ping a su maquina: $ ping localhost Deberia estar funcionando de nuevo. Pero, ya grabo la regla en /etc/iptables.rules. Esto significa que cada vez que la maquina se reinicializa la regla de bloquear ping por el interfaz "eth0" regresaria. Puede hacer lo siguiente: $ sudo iptables -F Esto bota todas las reglas. O, puede dejar las cosas como estan. En ambos casos, ejecuta: $ sudo iptables-save > /etc/iptables.rules Y, ahora tendreas y archivo sin reglas de iptables que va a estar cargada la proxima vez que la maquina se reinicializa. 3. Creamos unas regals de iptables estrictas ----------------------------------------- Para probar esto probablemente va a querer de hacer lo siguiente: $ su - [el clave de usuario root] # cd # vi firewall.sh En este archivo agrega lo siguiente: >>>> #!/bin/bash iptables -F iptables -P INPUT DROP iptables -P FORWARD DROP iptables -A INPUT -i lo -j ACCEPT iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A INPUT -p tcp --dport 22 -j ACCEPT iptables -A INPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --dport 443 -j ACCEPT iptables -A INPUT -p udp --dport 53 -j ACCEPT iptables -A INPUT -p tcp --dport 53 -j ACCEPT iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT <<<< Ahora graba y sale de este archivo (":wq" in vi). Haz que el archivo sea ejectuable: # chmod 755 firewall.sh Corre las reglas de su nuevo firewall: # ./firewall.sh Ahora hacemos algunas pruebas. Puede acceder los servicios corriendo en su maquina desde otra maquina (ssh, web, ping, algo mas?). Si tiene problemas intenta de entender que esta bloqueando el servicio y agregra una regla en iptables para dejar pasar los paquetes. Hay miles de reglas de iptables que uno puede agregar - incluyendo reglas dinamicas que pueden manejar ataques de DDos, los escaneos de puertos abierto, permitir acceso solo de algunas direcciones y/o rangos, etc., etc. Aqui hay algunas referencias buenas que hablan con mas profundidad sobre la tema: https://help.ubuntu.com/community/IptablesHowTo http://www.shanghaiwebhosting.com/ssh-hosting/typical-iptables-firewall-rules-for-a-server-that-hosts-websites http://forcespike.altervista.org/articles/setting-firewall-with-iptables.php http://blogs.techrepublic.com.com/10things/?p=539 http://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables http://wiki.vpslink.com/HOWTO:_Building_IPTables_rules http://www.pizon.org/articles/building-a-linux-firewall-with-iptables.html Puede ver que grupo de reglas esta corriend si escribe: # iptables -L Para hacer las reglas de firewall permanente tiene que hacer: # iptables-save > /etc/iptables.rules Abajo hay una descripcion de cada regla en el grupo de reglas de iptables que corremos: # Limpiar todo las reglas de iptables de memoria iptables -F # bota todo los paquetes en la cadena INPUT en las tablas Filter iptables -P INPUT DROP # boto todo los paquetes en la cadena FORWARD y en las tablas Filter iptables -P FORWARD DROP # accepta todo los paquetes en nuestro interfaz de loopback iptables -A INPUT -i lo -j ACCEPT # permitirnos conectar saliendo de nustra maquina iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # permita connexiones entrando a puerto 22 (ssh) iptables -A INPUT -p tcp --dport 22 -j ACCEPT # permita connexiones entrando a puerto 80 (htpt) iptables -A INPUT -p tcp --dport 80 -j ACCEPT # permita connexiones entrando a puerto 443 (https) iptables -A INPUT -p tcp --dport 443 -j ACCEPT # permita conexiones entrando udp en el puerto 53 (dns) iptables -A INPUT -p udp --dport 53 -j ACCEPT # permita conexciones entrando de tcp en el puerto 53 (dns) iptables -A INPUT -p tcp --dport 53 -j ACCEPT # permita pedidos de icmp del tipo 8 (ECHO o ping) iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT # rechaza todo lo demas que llega hasta aqui. Esto es inferido, pero lo hacemos explicitamenete. iptables -A INPUT -j REJECT iptables -A FORWARD -j REJECT Ahora esta corriendo un servidor con un firewall que le permite salir, pero solo permite acceso a los servicios que esta corriendo.