Tras las inspiradoras entradas de Eugenia, se me ocurrió que sería buena idea continuar con la saga siguiendo la estructura de sus artículos: simplicidad, claridad de conceptos y temática a priori conocida pero sobre la cual siempre conviene refrescar conceptos.
Ahí va una de puertos y firewalls 😉
¿Qué es un puerto de red?
Un puerto de red es una interfaz no física mediante la cual dos máquinas intercambian datos a través de un servicio concreto. Según el modelo OSI (Open System Interconnection) su administración se corresponde con la capa 4 (transporte).
Cada puerto debe estar identificado por un número que lo hace único y permite asociarlo a un servicio determinado, de tal forma que las aplicaciones puedan saber qué tipo de información encontrarán en él. Gracias a esta identificación unívoca, es posible la multiplexación (en su acepción correspondiente a redes y modelo OSI), o lo que es lo mismo, la posibilidad de enviar información desde varias aplicaciones de forma simultánea a través de una conexión.
El número de puerto se indica mediante una palabra (cadena finita de bits) de 16 bits, por lo que existen 2¹⁶ = 65535 puertos diferentes. Aunque en principio podemos utilizar cualquiera de ellos para cualquier servicio, la IANA¹ (Internet Asigned Names Authority) establece una relación estándar puerto-servicio, en virtud de la cual clasificamos los puertos de red en:
- Puertos bien conocidos: los inferiores al 1024. Suelen estar reservados para procesos del sistema y como su nombre indica son utilizados por protocolos «bien conocidos» como pueden ser https, ftp, ssh, etc. Su utilización requiere permisos de administrador. Suelen ir del lado del servidor.
- Puertos registrados: Los comprendidos entre el 1024 y el 49151. Son de libre aplicación y además existe un listado en la IANA que especifica que protocolo usa cada uno de ellos.
- Puertos dinámicos o privados: del 49152 al 65535. Son puertos efímeros o de uso temporal. Normalmente son utilizados por la máquina cliente.
¹ En Debian, podéis echar un vistazo al fichero /etc/services para ver una relación de los puertos y servicios a los que se encuentran asociados.
¿Cómo puedo saber qué puertos tengo abiertos en mi máquina?
A pesar de que existen diversas aplicaciones on-line que escanean los puertos más comunes de tu máquina para comprobar si están abiertos, la mejor opción es utilizar una herramienta propia. En sistemas GNU/linux contamos con netstat:
user@machine:~ $ netstat -tuna Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:46479 0.0.0.0:* LISTEN tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN tcp 0 0 192.168.1.162:32795 74.125.230.228:80 ESTABLISHED tcp6 0 0 ::1:25 :::* LISTEN tcp6 0 0 :::39940 :::* LISTEN tcp6 0 0 :::111 :::* LISTEN udp 0 0 0.0.0.0:51873 0.0.0.0:* udp 0 0 0.0.0.0:800 0.0.0.0:* udp6 0 0 :::800 :::* udp6 0 0 :::111 :::* udp6 0 0 :::5353 :::* udp6 0 0 :::53554 :::* udp6 0 0 :::54643 :::*
Los parámetros -t y -u indican a netstat que muestre las conexiones realizadas mediante los protocolos TCP y UDP respectivamente, podéis filtrar la salida a vuestro antojo (muy recomendable echar un ojo al man de netstat).
Gestión de puertos: iptables y ufw (uncomplicated firewall)
Como ya sabéis, netfilter es el framework encargado de manipular y procesar paquetes de red en el kernel linux. E iptables una de las herramientas más potentes construídas sobre dicho framework, un firewall que permite configurar las tablas, cadenas y reglas de netfilter. Por tanto, la mejor manera de gestionar el tráfico de paquetes desde y hacia nuestra máquina es hacer uso de la mencionada herramienta.
Sin embargo, la configuración de iptables se puede complicar más de la cuenta, así que optaremos por utilizar otra aplicación que nos permita hacerlo de forma más sencilla. Me refiero a ufw, un sencillo y completo firewall que nos ayudará en la tarea y que además dispone de interfaz gráfica (gufw). Podéis encontrarlo sin problema en los repositorios Debian.
root@machine:~ # aptitude install ufw
Como cada máquina es un mundo y además cumple una serie de funciones, es imposible dar una receta universal a seguir al pie de la letra. Sin embargo, una buena forma de proteger nuestras máquinas es cerrar de forma predeterminada todos los puertos y luego abrir tan sólo aquellos que necesitemos. Veamos cómo hacerlo:
1) Arrancamos el firewall
root@machine:~ # ufw enable
2) Cerramos todos los puertos de forma predeterminada
root@machine:~ # ufw default deny
3) Añadimos reglas para abrir los puertos que nos interesen. Se puede indicar el nombre del servicio o bien del puerto:
root@machine:~ # ufw allow ssh
root@machine:~ # ufw allow 21
Si en algún momento queremos eliminar alguna de las reglas creadas basta con teclear:
root@machine:~ # ufw delete allow ssh
Además, podemos ver el estado del firewall mediante:
root@machine:~ # ufw status
Y activar un registro de logs, que se almacenarán en /var/log/messages, tecleando:
root@machine:~ # ufw logging on
Por último decir que también se podría haber realizado el proceso inverso, esto es, abrir todos los puertos por defecto (idem que el punto 2, pero con el parámetro allow) e ir cerrando uno por uno (idem que el punto 3, pero indicando deny). Si echáis un ojo al manual veréis que también es posible permitir o denegar las conexiones desde una determinada IP o rango de IP’s, permitir el acceso a una IP a un sólo servicio y casi tantas combinaciones en forma de reglas como se os ocurran.
root@machine:~ # ufw allow from 192.168.1.0/24
root@machine:~ # ufw allow from 192.168.1.0/24 to any app ssh
Y eso es todo de momento, como veis ha sido una entrada bastante generalista en la que se ha tratado lo más básico de entre lo básico. A ver si con esta pequeña introducción se anima alguno de los que saben mucho más de esto que yo a presentar alguna herramienta molona o a profundizar más en el tema (sí, va por vosotros tres, canallas ;)).
¡Saludos!
16 ideas sobre “De puertos y firewalls (básico)”
Siempre viene bien un repaso por los conceptos, y cuando simplificáis las cosas se acercan los nuevos.
🙂
Qué bueno Debish -;) Esta es la idea, empezar desde cero y darle una continuidad como lo hace Euge y harás tú. Genial bro !!!
Muy bueno, ahora estaría genial un poco de nmap 🙂
Saludos y gracias…
Básico, pero interesante. Muy bueno el artículo. Habrá que seguir los siguientes. 🙂
Debish, te lo comenté por mail, pero lo repito aquí: EXCELENTE ARTÍCULO!! Sumamente prolijo, esclarecedor y profesional. No se podía esperar menos de usted 😀
SOS GROSO, DEBISH, SABELO!! 😀
@Picholeiro @Makova @hexborg Me alegro de que os haya gustado, se trataba precisamente de eso, de dar un repasillo a ciertos conceptos básicos que a veces tenemos un poco oxidados.
Dabo, la primera piedra ya está puesta, ahora ¡a construir! 🙂
Euge ¡que me sacas los colores, mujer! 😉
Desde el principio como debe ser ,que estos post esta muy bien, como el de n1mh, para todos, para los que empiezan y buscan aprender y para el que ya lo sabe (o eso se cree :p) .
Wow, que entrada más currada, mola. Iptables «a pelo» siempre me ha dado una pereza tremenda y ufw todavía no lo he probado. Yo todavía ando con arno-iptables-firewall, que de momento no me ha fallado.
Un saludo!
Muy bueno!!! Nunca me anime a eso de iptables, a ver si ahora con este programita lo hago.
Si no me ven de nuevo es porque me mande alguna xD
@israelmgo Esa es la idea, que sea para todos los públicos 😉
@aguila arno tiene en común con ufw la sencillez de configuración (al menos a nivel básico) y también la filosofía «lo cierro todo, abro lo que necesito» Si funciona ¿para qué cambiar? 🙂
@Cr1ogen Dale y nos cuentas qué tal fue 😀
Excelente artículo, me gusta como se explican los contenidos, simples y sin alegorias que no sirven para nada.
Gracias Salu2
@phantom Gracias a tí por pasarte 😉
Excelente articulo, yo soy de los que prefiere iptables, pero desconocia hasta ahora ufw. Solo decir que en algunos casos para un usuario domestico los routers tambien permiten gestionar las conexiones de puertos.
Creo que es mas conveniente cerrar todo y abrir lo que se vaya a usar que lo contrario.
¿Alguien conoce lo suficiente pf ( packet filter) como para compararlo a grosso modo con iptables?, las unicas comparaciones que he visto eran de gente de desarrollo de eta herramienta y son bastante parciales.
Debish, es un lujo leerte
Un lujo es tener lectores como tú, que siempre que comentan aportan algo nuevo al contenido del post.
Me alegra leerte por aquí cnicolas 😉
Que buen articulo, realmente excelente. Muy claro y con todo lo necesario.
Muchas gracias.
Saludos.
Gracias Carlos, me alegro de que te haya sido de provecho.
Saludos.