Header Ads

Blockports

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 "blockports.txt", y en ella incluimos algunos puertos. La selección 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
9090
9101
9102
9103
9030
9031
9050
9150
4662
4672
6881
6882
6883
6884
6885
6886
6887
6888
6889
853
5353
161
631
Como podemos ver la cantidad de puertos supera el límite. Y ahora la regla con Ipset para bloquear el tráfico desde (src) y hacia (dst) estos puertos, dejando registros con ulog2:
### BLOCKPORTS ###
# Remove or add ports to block
# Default list: CHARGEN (19), SSH (22), TELNET (23), 6to4 (41,43,44,58,59,60,3544), FINGER (79), SSDP (2869,1900,5000), RDP-MS WBT Server (3389), RFB-VNC (5900), TOR Ports (8008,8443,9001:9004,9101:9103,9030,9031,9050,9150), SqueezeCenter/Cherokee/Openfire (9090), P2P (4662,4672,6881:6889), DNS over TLS (853), Multicast (5353), SNMP (161), IPP (631)
ipset -F
ipset -N -! blockports bitmap:port range 0-65535
for ports in $(cat blockports.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.