Cuando DesdeLinux solo tenía pocos meses de vida escribí un tutorial extremadamente simple de entender sobre iptables: iptables para novatos, curiosos, interesados (1ra parte) . Haciendo uso de metáforas como comparar nuestro ordenador con nuestra casa, nuestro firewall con la puerta de la casa, así como otros ejemplos expliqué de forma amena, sin tantos tecnicismos ni conceptos complicados qué es un firewall, qué es iptables y cómo empezar a usarlo y configurarlo. Esta es la continuación, la 2da parte del anterior tutorial de iptables 
Sucede que hace pocos días usando un AP (Access Point) Linksys puse una Wifi en casa de mi novia, aunque la localidad no es de las más conocedoras en cuanto a tecnología, o sea, no es que haya muchos peligros de cracking, siempre es buena idea tener una excelente seguridad tanto en la Wifi como en los ordenadores.
La seguridad de la Wifi no la comentaré acá, pues no es el objetivo del post, me centraré en la configuración de iptables que actualmente uso en mi laptop.
Lo siguientes comandos son ejecutados en una terminal, necesitan ser ejecutados con privilegios de administrador, yo antepondré sudo a cada comando, ustedes pueden hacerlo igual o evitar usar sudo ejecutando los comandos directamente como root
En el anterior post había explicado que es necesario en un firewall primero denegar todo tráfico entrante, para ello:
sudo iptables -P INPUT DROP
Luego debemos permitir que nuestro propio ordenador tenga permiso para entrar datos:
sudo iptables -A INPUT -i lo -j ACCEPT
Así como también aceptar paquetes de peticiones que se originen en nuestro ordenador:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Para una mejor comprensión de estas líneas, recomiendo leer la primera mitad del anterior artículo: iptables para novatos, curiosos, interesados (1ra parte)
Hasta aquí nuestro ordenador puede navegar sin problemas a internet, pero nadie de ningún otro entorno (LAN, internet, Wifi, etc) podrá acceder de ninguna forma a nuestro ordenador. Vamos a empezar ya a configurar iptables según nuestras necesidades.
Usando ulogd para sacar los logs de iptables a otro archivo:
Por defecto los logs de iptables van en el log del kernel, del sistema, o algo así … en Arch por defecto, ahora mismo ni siquiera recuerdo dónde van, es por ello que yo uso ulogd para que los logs de iptables estén en otro archivo.
sudo iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ULOG
Dando acceso a mi servidor privado:
Yo no uso VirtualBox ni nada similar para virtualizar, yo tengo mi servidor privado virtualizado con Qemu+KVM el cual debe poder conectarse a mi laptop como tal, con las reglas de iptables que acabo de especificar arriba no podrá, es por eso que tengo obligatoriamente que darle permiso a la IP de mi servidor virtual para que pueda acceder a mi laptop:
sudo iptables -A INPUT -i virbr0 -p tcp -s 192.168.122.88 -j ACCEPT
Vamos a detallar esta línea, es importante que ustedes entiendan qué significa cada parámetro, pues se van a repetir mucho de ahora en adelante:
O sea y a modo de resumen, voy a aceptar paquetes que provengan desde la IP 192.168.122.88, pero en caso de que deseen entrar paquetes que vengan desde esa IP PERO! entran desde una interfaz que no sea virbr0, o sea, digamos que intentan entrar paquetes desde la IP 192.168.122.88 pero son de un ordenador en nuestra red Wifi, si ese es el caso, los paquetes serán rechazados. ¿por qué? Porque claramente especificamos que sí, aceptamos paquetes desde 192.168.122.88 sí, pero y solo pero, también tienen que entrar desde la interfaz virbr0 (interfaz de red interna, virtual), si los paquetes provienen desde otra interfaz (LAN, RAS, Wifi, etc) entonces no serán aceptados. Especificando la interfaz como pueden apreciar podemos restringir aún más, podemos tener un mejor control sobre lo que entra (o no entra) en nuestro ordenador.
Aceptando ping desde cualquier IP de la Wifi de casa:
Desde algún otro ordenador que se conecte a la Wifi, si intenta hacer ping a mi laptop deseo permitirlo. ¿motivo? La idea también es que en próximas semanas enlazar la PC de la casa de al lado a la red, así compartir información sería menos compleja, más fluida, cuando yo empiece a hacer pruebas para enlazar la desktop a la Wifi, necesitaré hacer ping a mi laptop para comprobar la conectividad, si mi laptop no me devuelve el ping puedo pensar que el AP está fallando, o que hubo algún error al acceder a la Wifi, es por ello que deseo permitir el ping.
sudo iptables -A INPUT -i wlo1 -p icmp -s 192.168.1.0/24 -d 192.168.1.51 -j ACCEPT
O sea y para explicar esto de forma corrida, acepto que me hagan ping (protocolo icmp) cuyo destino sea específicamente mi IP, siempre y cuando vengan desde alguna IP como 192.168.1.__ pero además, no pueden provenir desde cualquier interfaz de red, tienen que entrar específicamente desde mi interfaz de red de Wifi (wlo1)
Aceptar SSH solo para una IP:
A veces necesito conectarme por SSH desde mi smartphone para controlar la laptop, es por ello que debo permitir el acceso SSH a mi laptop desde las IPs de mi Wifi, para ello:
sudo iptables -A INPUT -i wlo1 -p tcp -s 192.168.1.0/24 -d 192.168.1.51 --dport 22 -j ACCEPT
De esta línea lo único diferente o que merece destacarse es: –dport 22 (puerto de SSH que uso)
O sea, acepto intentos de conexión a mi laptop por el puerto 22, siempre que estos vengan desde alguna IP de mi wifi, tienen también que tener como destino específico mi IP y además venir por la interfaz wlo1, o sea, la de mi wifi (no la de la lan, etc)
Permitiendo que vean un sitio web suyo:
No es mi caso, pero si alguno de ustedes tiene un sitio web hosteado y no desean denegarle el acceso a nadie, o sea, que todos desde cualquier parte puedan acceder a ese sitio web, es mucho más simple de lo que pueden pensar:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
O sea, aquí están permitiendo todo tráfico entrante (tcp) por el puerto 80. Como ven, no especifico desde qué IPs o red sí permito el acceso, al no especificar un rango de IP a permitir, iptables asume que deseo permitirle el acceso a todos los rangos de IPs existentes, o sea, a todo el mundo
Otras combinaciones:
Tengo otras muchas reglas como son por ejemplo, aceptar ping para IPs de la LAN de mi casa (para esta es básicamente la misma línea anterior, cambiando los rangos de IPs), que es más de lo mismo que recién les expliqué arriba… en mi laptop como tal no uso cosas realmente complejas, eso de limitar las conexiones, anti DDoS, eso lo dejo para los servidores, en mi laptop no lo necesito
En fin, hasta aquí el artículo.
Como pueden ver, trabajar con iptables no es tan complejo ni mucho menos, una vez te armas un script en el cual escribes tus reglas es muy simple luego modificarlo, agregar o quitar reglas a tu firewall.
No me considero un experto en el tema ni mucho menos, no obstante cualquier duda que puedan tener la comentan acá, intentaré ayudarles en todo cuanto pueda.
Saludos

Continúar leyendo...

Sucede que hace pocos días usando un AP (Access Point) Linksys puse una Wifi en casa de mi novia, aunque la localidad no es de las más conocedoras en cuanto a tecnología, o sea, no es que haya muchos peligros de cracking, siempre es buena idea tener una excelente seguridad tanto en la Wifi como en los ordenadores.
La seguridad de la Wifi no la comentaré acá, pues no es el objetivo del post, me centraré en la configuración de iptables que actualmente uso en mi laptop.
Lo siguientes comandos son ejecutados en una terminal, necesitan ser ejecutados con privilegios de administrador, yo antepondré sudo a cada comando, ustedes pueden hacerlo igual o evitar usar sudo ejecutando los comandos directamente como root
En el anterior post había explicado que es necesario en un firewall primero denegar todo tráfico entrante, para ello:
sudo iptables -P INPUT DROP
Luego debemos permitir que nuestro propio ordenador tenga permiso para entrar datos:
sudo iptables -A INPUT -i lo -j ACCEPT
Así como también aceptar paquetes de peticiones que se originen en nuestro ordenador:
sudo iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
Para una mejor comprensión de estas líneas, recomiendo leer la primera mitad del anterior artículo: iptables para novatos, curiosos, interesados (1ra parte)
Hasta aquí nuestro ordenador puede navegar sin problemas a internet, pero nadie de ningún otro entorno (LAN, internet, Wifi, etc) podrá acceder de ninguna forma a nuestro ordenador. Vamos a empezar ya a configurar iptables según nuestras necesidades.
Usando ulogd para sacar los logs de iptables a otro archivo:
Por defecto los logs de iptables van en el log del kernel, del sistema, o algo así … en Arch por defecto, ahora mismo ni siquiera recuerdo dónde van, es por ello que yo uso ulogd para que los logs de iptables estén en otro archivo.
sudo iptables -A INPUT -p tcp -m tcp --tcp-flags FIN,SYN,RST,ACK SYN -j ULOG
Dando acceso a mi servidor privado:
Yo no uso VirtualBox ni nada similar para virtualizar, yo tengo mi servidor privado virtualizado con Qemu+KVM el cual debe poder conectarse a mi laptop como tal, con las reglas de iptables que acabo de especificar arriba no podrá, es por eso que tengo obligatoriamente que darle permiso a la IP de mi servidor virtual para que pueda acceder a mi laptop:
sudo iptables -A INPUT -i virbr0 -p tcp -s 192.168.122.88 -j ACCEPT
Vamos a detallar esta línea, es importante que ustedes entiendan qué significa cada parámetro, pues se van a repetir mucho de ahora en adelante:
-A INPUT : Estoy diciendo que voy a declarar una regla para tráfico entrante
-i virbr0 : Declaro que la interfaz por la cual aceptaré el tráfico no es etho (LAN) ni wlan0 (Wifi), digo específicamente que es mi interfaz virbr0, o sea, la interfaz de red virtual (interna) mediante la cual se comunica mi laptop con mi servidor virtual (y viceversa)
-p tcp : Especifico el protocolo, los más usados son UDP y TCP, aquí en realidad bastaba con no poner esto pero… es una costumbre especificar el tipo de protocolo a aceptar
-s 192.168.122.88 : La source, fuente de los paquetes. O sea, la regla se refiere a paquetes que provengan específicamente desde la IP 192.168.122.88
-j ACCEPT : Ya aquí digo lo que quiero hacer con los paquetes que coincidan con lo antes dicho, en este caso aceptar.
O sea y a modo de resumen, voy a aceptar paquetes que provengan desde la IP 192.168.122.88, pero en caso de que deseen entrar paquetes que vengan desde esa IP PERO! entran desde una interfaz que no sea virbr0, o sea, digamos que intentan entrar paquetes desde la IP 192.168.122.88 pero son de un ordenador en nuestra red Wifi, si ese es el caso, los paquetes serán rechazados. ¿por qué? Porque claramente especificamos que sí, aceptamos paquetes desde 192.168.122.88 sí, pero y solo pero, también tienen que entrar desde la interfaz virbr0 (interfaz de red interna, virtual), si los paquetes provienen desde otra interfaz (LAN, RAS, Wifi, etc) entonces no serán aceptados. Especificando la interfaz como pueden apreciar podemos restringir aún más, podemos tener un mejor control sobre lo que entra (o no entra) en nuestro ordenador.
Aceptando ping desde cualquier IP de la Wifi de casa:
Desde algún otro ordenador que se conecte a la Wifi, si intenta hacer ping a mi laptop deseo permitirlo. ¿motivo? La idea también es que en próximas semanas enlazar la PC de la casa de al lado a la red, así compartir información sería menos compleja, más fluida, cuando yo empiece a hacer pruebas para enlazar la desktop a la Wifi, necesitaré hacer ping a mi laptop para comprobar la conectividad, si mi laptop no me devuelve el ping puedo pensar que el AP está fallando, o que hubo algún error al acceder a la Wifi, es por ello que deseo permitir el ping.
sudo iptables -A INPUT -i wlo1 -p icmp -s 192.168.1.0/24 -d 192.168.1.51 -j ACCEPT
-A INPUT : Lo mismo que antes, hago referencia a tráfico entrante
-i wlo1 : Similar a antes. En el caso anterior especifiqué la interfaz virtual, en este caso especifico otra interfaz, la de mi wifi: wlo1
-p icmp : Protocolo icmp, icmp = ping. O sea, no estoy permitiendo SSH ni nada similar, permito solamente ping (icmp)
-s 192.168.1.0/24 : La fuente de los paquetes, o sea, siempre que los paquetes vengan desde una IP 192.168.1.? serán aceptados
-d 192.168.1.51 : IP de destino, o sea, mi IP.
-j ACCEPT : Indico qué hacer con los paquetes que coincidan con lo anterior, aceptar.
O sea y para explicar esto de forma corrida, acepto que me hagan ping (protocolo icmp) cuyo destino sea específicamente mi IP, siempre y cuando vengan desde alguna IP como 192.168.1.__ pero además, no pueden provenir desde cualquier interfaz de red, tienen que entrar específicamente desde mi interfaz de red de Wifi (wlo1)
Aceptar SSH solo para una IP:
A veces necesito conectarme por SSH desde mi smartphone para controlar la laptop, es por ello que debo permitir el acceso SSH a mi laptop desde las IPs de mi Wifi, para ello:
sudo iptables -A INPUT -i wlo1 -p tcp -s 192.168.1.0/24 -d 192.168.1.51 --dport 22 -j ACCEPT
De esta línea lo único diferente o que merece destacarse es: –dport 22 (puerto de SSH que uso)
O sea, acepto intentos de conexión a mi laptop por el puerto 22, siempre que estos vengan desde alguna IP de mi wifi, tienen también que tener como destino específico mi IP y además venir por la interfaz wlo1, o sea, la de mi wifi (no la de la lan, etc)
Permitiendo que vean un sitio web suyo:
No es mi caso, pero si alguno de ustedes tiene un sitio web hosteado y no desean denegarle el acceso a nadie, o sea, que todos desde cualquier parte puedan acceder a ese sitio web, es mucho más simple de lo que pueden pensar:
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
O sea, aquí están permitiendo todo tráfico entrante (tcp) por el puerto 80. Como ven, no especifico desde qué IPs o red sí permito el acceso, al no especificar un rango de IP a permitir, iptables asume que deseo permitirle el acceso a todos los rangos de IPs existentes, o sea, a todo el mundo

Otras combinaciones:
Tengo otras muchas reglas como son por ejemplo, aceptar ping para IPs de la LAN de mi casa (para esta es básicamente la misma línea anterior, cambiando los rangos de IPs), que es más de lo mismo que recién les expliqué arriba… en mi laptop como tal no uso cosas realmente complejas, eso de limitar las conexiones, anti DDoS, eso lo dejo para los servidores, en mi laptop no lo necesito

En fin, hasta aquí el artículo.
Como pueden ver, trabajar con iptables no es tan complejo ni mucho menos, una vez te armas un script en el cual escribes tus reglas es muy simple luego modificarlo, agregar o quitar reglas a tu firewall.
No me considero un experto en el tema ni mucho menos, no obstante cualquier duda que puedan tener la comentan acá, intentaré ayudarles en todo cuanto pueda.
Saludos
Continúar leyendo...