Saltar al contenido

Bloquear China con iptables

Puede que se de el caso de que halles algún problema con tu código o trabajo, recuerda probar siempre en un entorno de testing antes añadir el código al proyecto final.

Solución:

Bloque de China usando ipset

No puede agregar manualmente unos pocos miles de direcciones IP a sus iptables, e incluso hacerlo automáticamente es una mala idea porque puede causar mucha carga de CPU (o eso he leído). En su lugar, podemos usar ipset, que está diseñado para este tipo de cosas. ipset maneja grandes listas de direcciones IP; simplemente crea una lista y luego le dice a iptables que use esa lista en una regla.

Nota; Supongo que la totalidad de lo siguiente se realiza como root. Realice los ajustes necesarios si su sistema está basado en sudo.

apt-get install ipset

A continuación, escribí un pequeño script de Bash para hacer todo el trabajo, que debería poder comprender a partir de los comentarios que contiene. Crea un archivo:

nano /etc/block-china.sh

Esto es lo que desea pegar en él:

# Create the ipset list
ipset -N china hash:net

# remove any old list that might exist from previous runs of this script
rm cn.zone

# Pull the latest IP set for China
wget -P . http://www.ipdeny.com/ipblocks/data/countries/cn.zone

# Add each IP address from the downloaded list into the ipset 'china'
for i in $(cat /etc/cn.zone ); do ipset -A china $i; done

# Restore iptables
/sbin/iptables-restore < /etc/iptables.firewall.rules

Guarda el archivo. Hágalo ejecutable:

chmod +x /etc/block-china.sh

Esto no ha hecho nada todavía, pero lo hará en un minuto cuando ejecutemos el script. Primero, necesitamos agregar una regla en iptables que se refiera a esta nueva lista de ipset que define el script anterior:

nano /etc/iptables.firewall.rules

Agregue la siguiente línea:

-A INPUT -p tcp -m set --match-set china src -j DROP

Guarda el archivo. Para ser claros, mis iptables.firewall.rules completos ahora se ven así:

*filter

#  Allow all loopback (lo0) traffic and drop all traffic to 127/8 that doesn't use lo0
-A INPUT -i lo -j ACCEPT
-A INPUT -d 127.0.0.0/8 -j REJECT

#  Accept all established inbound connections
-A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# Block anything from China
# These rules are pulled from ipset's china list
# The source file is at /etc/cn.zone (which in turn is generated by a shell script at /etc/block-china.sh )
-A INPUT -p tcp -m set --match-set china src -j DROP

#  Allow all outbound traffic - you can modify this to only allow certain traffic
-A OUTPUT -j ACCEPT

#  Allow HTTP and HTTPS connections from anywhere (the normal ports for websites and SSL).
-A INPUT -p tcp --dport 80 -j ACCEPT
-A INPUT -p tcp --dport 443 -j ACCEPT

#  Allow SSH connections
#
#  The -dport number should be the same port number you set in sshd_config
#
-A INPUT -p tcp -m state --state NEW --dport 22 -j ACCEPT

#  Allow ping
-A INPUT -p icmp -j ACCEPT

#  Log iptables denied calls
-A INPUT -m limit --limit 5/min -j LOG --log-prefix "iptables denied: " --log-level 7

#  Drop all other inbound - default deny unless explicitly allowed policy
-A INPUT -j DROP
-A FORWARD -j DROP

COMMIT

En este momento, nada ha cambiado con el servidor porque no se han aplicado nuevas reglas; para hacerlo, ejecute el script block-china.sh:

/etc/block-china.sh

Esto debería mostrar algunos resultados, ya que extrae una nueva lista de direcciones IP basadas en chino y luego, después de unos segundos más o menos, se completará y lo devolverá a un símbolo del sistema.

Para probar si funcionó, ejecute:

iptables -L

Ahora debería ver una nueva regla que bloquea a China; la salida debería verse así:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere
REJECT     all  --  anywhere             loopback/8           reject-with icmp-port-unreachable
ACCEPT     all  --  anywhere             anywhere             state RELATED,ESTABLISHED
DROP       tcp  --  anywhere             anywhere             match-set china src
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:http
ACCEPT     tcp  --  anywhere             anywhere             tcp dpt:https
ACCEPT     tcp  --  anywhere             anywhere             state NEW tcp dpt:ssh
ACCEPT     icmp --  anywhere             anywhere
LOG        all  --  anywhere             anywhere             limit: avg 5/min burst 5 LOG level debug prefix "iptables denied: "
DROP       all  --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     all  --  anywhere             anywhere

¡Casi termino! Esto funciona y seguirá funcionando en los reinicios. Pero las direcciones IP cambian y esa lista se volverá obsoleta con el tiempo. Si desea extraer y aplicar una lista actualizada de IP, puede ejecutar el script block-china.sh nuevamente.

También podemos configurar la máquina para que lo haga automáticamente a través de un trabajo cron:

crontab -e

Agregue una línea como esta:

* 5 * * * /etc/block-china.sh

Esto ejecutará /etc/block-china.sh a las 5 am todos los días. El usuario que ejecuta el script deberá ser root o tener privilegios de root.

fuente

Usando iptables para identificar automáticamente, y luego bloquear, los malos para ssh se pueden hacer usando el recent módulo. El siguiente segmento debe venir después tu genérico ESTABLISHED,RELATED línea:

[…]
$IPTABLES -A INPUT -i $EXTIF -s $UNIVERSE -d $EXTIP -m state --state ESTABLISHED,RELATED -j ACCEPT

[…]
# Secure Shell on port 22.
#
# Sometimes I uncomment the next line to simply disable external SSH access.
# Particulalry useful when I am rebooting often, thereby losing my current BADGUY table.
# $IPTABLES -A INPUT -i $EXTIF -m state --state NEW -p tcp -s $UNIVERSE -d $EXTIP --dport 22 -j DROP

# Dynamic Badguy List. Detect and DROP Bad IPs that do password attacks on SSH.
# Once they are on the BADGUY list then DROP all packets from them.
# Sometimes make the lock time very long. Typically to try to get rid of coordinated attacks from China.
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j LOG --log-prefix "SSH BAD:" --log-level info
$IPTABLES -A INPUT -i $EXTIF -m recent --update --hitcount 3 --seconds 90000 --name BADGUY_SSH -j DROP
$IPTABLES -A INPUT -i $EXTIF -p tcp -m tcp --dport 22 -m recent --set --name BADGUY_SSH -j ACCEPT

Ahora, el problema reciente (el último año o dos) con China es que se han vuelto muy inteligentes y, muy a menudo, una vez que se les bloquea una dirección IP, simplemente cambian a otra en la misma subred y continúan. Esto corre el riesgo de quedarse sin entradas de tabla recientes predeterminadas (creo que el valor predeterminado es 200). Superviso esto y luego busco el segmento de IP real y bloqueo permanentemente todo el segmento. En mi caso, no me importa el daño colateral, es decir, bloquear a alguien inocente:

#
# After a coordinated attack involving several sub-nets from China, they are now banned forever.
# List includes sub-nets from unknown origin, and perhaps Hong Kong
#
$IPTABLES -A INPUT -i $EXTIF -s 1.80.0.0/12   -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.148.0.0/14 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 27.152.0.0/13 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.229.0.0/16 -d $UNIVERSE -j DROP
$IPTABLES -A INPUT -i $EXTIF -s 43.255.0.0/16 -d $UNIVERSE -j DROP
[…]

Donde en lo anterior:

# The location of the iptables program
#
IPTABLES=/sbin/iptables

#Setting the EXTERNAL and INTERNAL interfaces and addresses for the network
#
EXTIF="enp4s0"
INTIF="enp2s0"
EXTIP="...deleted..."
INTNET="192.168.111.0/24"
INTIP="192.168.111.1/32"
UNIVERSE="0.0.0.0/0"

Puede obtener la lista completa de direcciones IP para China, o cualquier país, en iptables u otro formato aquí. Sin embargo, la lista es sorprendentemente larga y bastante dinámica. Yo mismo, decidí no bloquear toda la lista.

Es posible que desee instalar algo como fail2ban para que bloquee los ips que intentan iniciar sesión en su servidor y fallan.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *