Uso practico de IPCHAINS by polos. thebigsnake@usa.com Este texto se basa en ejemplos practicos .... Supongamos que tenemos una red, en la cual entre las pc's conectadas tenemos una con win2000 y una con Linux (Mandrake 7.0). Puede ser linux y linux, etc, pero para hacerlo mas variado elegi esta opcion. En este caso el Server es la pc que usa Linux, que tiene asignada por ip 192.168.1.1 y el cliente es la que usa w2000, que utiliza la ip 192.168.1.12 Hagamos un scan al server desde el cliente: 21: open 23: open 25: open 79: open 98: open 110: open podemos ver los puerto que tiene abierto, y para seguir investigando hacemos un telnet al server. Trying 192.168.1.1... Connected to 192.168.1.1. Escape character is '^]'. Welcome to polos.network.com Linux Mandrake release 7.0 (Air) Kernel 2.2.14-15mdk on an i586 login: Este es un claro caso en el cual los puertos estan desprotejidos y puede acceder cualquiera. Tambien nos podrian haber escaneado desde una ip externa a la red, por ejemplo alguien que este conectado a inet (siempre y cuando estemos conectados a inet tambien :-).. Nuestra intencion, como Admin del server es la de proteger el accesso a los distintos servicios que ofrece el sistema de hosts no autorizados a utilizarlos. Para esto vamos a hacer uso de una herramienta que nos proporciona Linux, ipchains que nos ayuda a filtrar paquetes "no deseados" y permitir a los "elejidos", actuando de firewall. Comandos basicos: ipchains -A (Agrega una cadena) ipchains -D (Borra una cadena) ipchains -F (borra todas las reglas en una cadena o todas las cadenas) ipchains -N (Crea una cadena definida por el usuario) ipchains -X (borra una cadena definida por el usuario) -p (protocolo: icmp, udp, tcp) El resto de los comandos los veremos mediante los ejemplos restantes. Continuemos, el admin se sienta en su pc, y al ver que su sistema es muy vulnerable se pone paranoico y decide hacer los siguiente: Primero crea su cadena (esto no es necesario en realidad, puede usar las default , pero la crea igual :X) ipchains -N admin --->> creamos una nueva cadena con el nombre admin) ipchains -i input -j admin -->>la cadena input va a incoporar las reglas -->>de admin Listo, lo primero que se le ocurre es bloquear todos los paquetes icmp, entre los cuales se evitaria algun que otro DoS.: ipchains -A admin -d 0/0 -s 0/0 -p icmp -j DENY Voy a explicar esta cadena detalladamente: -A admin (agregar a la cadena admin la siguiente regla) -d 0/0 (a cualquier destino) -s 0/0 (desde cualquier hosts) -p icmp (el protoclo icmp) -j DENY (lo denegamos) Denegamos cualquier paquete icmp desde y hacia cualquier destino. Realizemos un ping desde el cliente: ping 192.168.1.12..... Tiempo de espere agotado Tiempo de espera agotado ........................ o un traceroute: traceroute to 192.168.1.1 (192.168.1.1), 30 hops max, 38 byte packets 1 * * El admin esta muy contento, pudo bloquear todos los paquetes icmp, pero cuando se da cuenta que esta limitando a su red, ya que no permite recibir los mensajes icmp, asi tampoco saber si algun host en su red esta "muerto" o "vivo" decide borrar la cadena anterior e introducir lo siguiente: ipchains -D admin -d 0/0 -s 0/0 -p icmp -j DENY --> Borra la regla anterior ipchains -A admin -d 0/0 -s ! 192.168.1.0/24 -p icmp -j DENY El ! significa expecion, en este caso bloquemos todos los paquetes icmp menos los provenientes de la red con ip 192.168.1.1-255. Probamos haciendo un ping hacia algun cliente, o viceversa y recibimos respuesta. Listo, otro tema pendiente es ahora el de los servicios que presta el server: ipchains -A admin -d 0/0 1:1024 -s 0/0 -j DENY -p tcp 1:1024 --->>> Especifica un rango de puertos, podemos poner un solo puerto, un rango, etc, segun nuestras necesidades. Bloquamos todos las conecciones desde cualquier host desde el puerto 1 hasta el 1024 , con protocolo tcp. Probemos hacer un ftp desde el cliente al server: ftp 192.168.1.1....... ftp:connect:tiempo de espera agotado.... Otra vez lo mismo, los clientes de la red se quejan porque no pueden acceder a los distintos servicios. El admin se acuerda del bendito ! y decide borrar las reglas anterior e insertar una nueva (Existe una opcion para remplazar las reglas de una cadena, pero al admin las borra y las vuelve a crear :X) ipchains -D admin -d 0/0 1:1024 -s 0/0 -j DENY -p tcp ipchains -A admin -d 0/0 1:1024 -s ! 192.168.1.0/24 -j DENY -p tcp Y ahora si, los hosts de la red pueden acceder a los distinos servicios que ofrecemos. Otra de las posibilidades que nos da ipchains es la de masquerade, en cual podemos dar salida a internet a la red, mediante una sola ip, la del server. (Todas las maquinas toman una misma ip en inet, la asignada al server ) Debemos tener activada la opcion de ip_forwarding, de no ser el caso hacemos un: echo "1" > /proc/sys/net/ipv4/ip_forward ipchains -P forward DENY ipchains -A forward -i ppp+ -s 192.168.1.0/24 -j MASQ -b En este caso usamos una cadena ya existene, Forward, y vemos 2 cosas nuevas .... -i ppp0 especifica una interfaz (eth0, etc. El mas es un "comodin") MASQ (utilizacion de Masquerade) -b bidireccional. (no es obligacion utilizarla) Algunas cosas a aclarar: En -s (source) podemos poner una ip especifa. el /24 indica la mascara de sub-red (255.255.etc). Bueno el Admin esta muy contento, ya que puede decidir quien quiere qeu acceda a sus servicios y quienes no. Estas son alguna de las posibilidad que tenemos al alcance de nuestra mano con ipchains existen muchas mas, como por ejemplo no permitir que las pc's de la red accedan a ciertas paginas web, etc. Como el admin no tiene ganas de teclear todo esto cada vez que accede al sistema tiene tres opciones, agregar los comandos al archivo de inicio (para que se ejecuten cuando se carge linux), crear un script y hacer que tambien se ejecute al inicio, o crear un script para que lo ejecute lo necesite, con menu y todo :X. Creacion del Firewall Script... =========================================================================== luego de copiar esto a donde queramos darle permisos de ejecucion. Cortar aqui. ========================================================================== #!/bin/sh fire=/sbin/ipchains #Definimos en fire donde se encuentra ipchains masq=255.255.255.0 #definimos la mascara de subre red=192.168.1.0/24 #definimos toda la red (ip + mascar de sub-red) forward=/proc/sys/net/ipv4/ip_forward #Para activar ip_forwarding portrange=1:1024 #Definimos el rango de puertos #Creamos el Menu echo "######################INICIANDO FIREWALL############################" echo "...................................................................." echo "................Sistema Protegido por XXXXX Security................" echo "...................................................................." echo "####################################################################" echo echo "[1] Ingresar Opciones [2] Borrar opciones" read elegir; #leemos la opcion case $elegir in #en caso de que elegir sea X 1)echo " [1] Bloquear TODOS los accesos (inclusive los nuestros) " echo " [2] Permitir accesos solamente a la red" echo " [3] Bloquear TODOS los icmp" echo " [4] Aceptar paquetes icmp de la red" echo " [5] Dar conexion a inet a la red" echo echo "Ingrese opcion" read opcion; case $opcion in 1) $fire -A input -p tcp -d 0/0 $portrange -s 0/0 -j DENY #para que podamos acceder nosotros o alguna pc en especial, en -s poner # ! ip echo "######--OPERACION COMPLETADA --#########################" ;; 2) $fire -A input -p tcp -d 0/0 $portrange -s ! $red -j DENY echo "######--OPERACION COMPLETADA --#########################" ;; 3) $fire -A input -p icmp -d 0/0 -s 0/0 -j DENY echo "######--OPERACION COMPLETADA --#########################" ;; 4) $fire -A input -p icmp -d 0/0 -s ! $red -j DENY ;; 5) $fire -P forward DENY echo 1 > $forward $fire -A forward -i ppp+ -s $red -j MASQ -b echo "######--OPERACION COMPLETADA --#########################" ;; esac esac case $elegir in #si eligio la opcion 2 2) echo "Borrar cadenas del firewall" echo echo "[1] Borrar cadena: Bloquear TODOS los accesso" echo "[2] Borrar cadena: Permitir accesos a la red" echo "[3] Borrar cadena: Bloquear TODOS los icmp" echo "[4] Borrar cadena: Bloqueat icmp's de la red" echo "[5] Dar acceso a ineternet a la red" echo "[6] BORRAR TODAS LAS REGLAS EN TODAS LAS CADENAS" echo echo "Elija opcion: " read borrar; case $borrar in 1) $fire -D input -p tcp -d 0/0 $portrange -s 0/0 -j DENY echo "######--OPERACION COMPLETADA --#########################" ;; 2) $fire -D input -p tcp -d 0/0 $portrange -s ! $red -j DENY echo "######--OPERACION COMPLETADA --#########################" ;; 3) $fire -D input -p icmp -d 0/0 -s 0/0 -j DENY echo "######--OPERACION COMPLETADA --#########################" ;; 4) $fire -A input -p icmp -d 0/0 -s ! $red -j DENY ;; 5) $fire -D forward -i ppp+ -s $red -j MASQ -b echo "######--OPERACION COMPLETADA --#########################" ;; 6) $fire -F input $fire -F forward ;; esac esac =============================================================================== CORTAR AQUI =============================================================================== Esto es todo por ahora... para mas informacion sobre ipchains: man ipchains podemos leer el how-to de ipchains, etc.