Header Ads

Bloqueo multipuertos

Para bloquear muchos puertos con Iptables, basta con usar la opción multiport, sin embargo tiene un límite máximo de 15 puertos. Uno más y genera error:
iptables -A INPUT -p tcp -m multiport --dports 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16 -J DROP
iptables v1.4.21: too many ports specified 
Sobre el módulo "multiport" el manual cita:
This module matches a set of source or destination ports. Up to 15 ports can be specified. A port range (port:port) counts as two ports
Entonces se puede reducir un poco el problema. Por ejemplo si hay hasta 7 rangos (+1 puerto único), se puede hacer algo como:
iptables -A INPUT -p tcp -m multiport --dport 1:5,10:50,6666 -j DROP
Pero más allá de esto no hay nada que podamos hacer (excepto parchear el kernel de linux con una versión modificada de Iptables sin la limitante, algo que no es recomendable) y al sobrepasar el límite de los 15 puertos tendríamos que crear otra regla igual para poner los restantes puertos.
Afortunadamente hay una solución mucho más eficiente, que permite bloquear gran cantidad de puertos con tan solo unas pocas reglas. Hablamos de Ipset
Si no lo tenemos instalado, lo hacemos con sudo apt -y install ipset. Ahora creamos una ACL que incluya los puertos a o bloquear, que para este ejemplo llamaremos "ports.txt", y en ella incluimos algunos puertos, por ejemplo: CHARGEN, SSH, TELNET, 6to4, FINGER, SSDP, RDP-MS WBT Server, RFB-VNC, y los más comunes de TOR y P2P (aunque sería bueno agregar también LLMNR (5355), NetBIOS-NS (137:139,445), Multicast (5353), SNMP (161) y muchos otros, pero ya esto queda en manos del sysadmin)
19
22
23
41
43
44
58
59
60
3544
79
2869
1900
5000
3389
5900
8008
8443
9001
9002
9003
9004
9101
9102
9103
9030
9031
9050
9150
4662
4672
6881
6882
6883
6884
6885
6886
6887
6888
6889
Como podemos ver, son 40 puertos. Y ahora la regla con Ipset para bloquear el tráfico desde (src) y hacia (dst) estos puertos, dejando registros con ulog2:
ipset -F
ipset -N -! blockports bitmap:port range 0-65535
for ports in $(cat ports.txt); do
	ipset -A blockports $ports
done
for srcdst in `echo src dst`; do
	iptables -t mangle -A PREROUTING -m set --match-set blockports $srcdst -j NFLOG --nflog-prefix 'Blockports'
	iptables -t mangle -A PREROUTING -m set --match-set blockports $srcdst -j DROP
	iptables -A INPUT -m set --match-set blockports $srcdst -j NFLOG --nflog-prefix 'Blockports'
	iptables -A INPUT -m set --match-set blockports $srcdst -j DROP
	iptables -A FORWARD -m set --match-set blockports $srcdst -j NFLOG --nflog-prefix 'Blockports'
	iptables -A FORWARD -m set --match-set blockports $srcdst -j DROP
	iptables -A OUTPUT -m set --match-set blockports $srcdst -j NFLOG --nflog-prefix 'Blockports'
	iptables -A OUTPUT -m set --match-set blockports $srcdst -j DROP
done
Lo que hemos hecho es un flush de reglas ipset, luego nombramos la regla como blockports,  agregamos la lista y el rango con "bitmap:port" y todos los puertos de red, cargamos nuestra lista con un "cat" y finalmente bloqueamos los puertos con reglas iptables.

Con la tecnología de Blogger.