¿Rangos de puertos en iptables? Optimiza la configuración de reglas con el parámetro multiport

Recuerdo que cuando apenas estaba familiarizado con el firewall iptables tendía a crear reglas a tutiplén, en verso y creo que hasta con rima. Con la experiencia a base de darte tortazos vas corrigiendo errores y tiendes a optimizar recursos, especialmente tiempo.

Imaginemos que queremos definir una regla que permita acceso en los puertos 80,443 y 587 utilizando protocolo TCP. Forma poco productiva de hacerlo:

iptables -A INPUT -p tcp -dport 80 -j ACCEPT
iptables -A INPUT -p tcp -dport 443 -j ACCEPT
iptables -A INPUT -p tcp -dport 587 -j ACCEPT

Si quisiéramos crear una regla para los puertos del 1024 al 2048 tendríamos una auténtica pesadilla ante nosotros:

iptables -A INPUT -p tcp -dport 1024 -j ACCEPT
iptables -A INPUT -p tcp -dport 1025 -j ACCEPT
iptables -A INPUT -p tcp -dport 1026 -j ACCEPT
iptables -A INPUT -p tcp -dport 1027 -j ACCEPT
...

El parámetro multiport en iptables simplifica la tarea de definir reglas que afecten a varios puertos. Por ejemplo, para permitir el acceso a nuestra máquina en un rango de puertos TCP de 1024 a 2048, haríamos:

iptables -A INPUT -p tcp --match multiport --dports 1024:2048 -j ACCEPT

Si por el contrario quisiéramos dar únicamente acceso a varios puertos individuales, podemos agruparlos:

iptables -A INPUT -p tcp --match multiport --dports 80,443,587 -j ACCEPT

Especial atención al protocolo que definimos en la regla, ya que en este caso es únicamente TCP. Para UDP tendremos que hacer otra regla aparte, por ejemplo:

iptables -A INPUT -p udp --match multiport --dports 80,443,587 -j ACCEPT

Esto se debe a que si especificamos dports (destination ports) no es compatible con definir varios protocolos en la misma regla. Lo mismo se aplica para sports (source ports).