Bloquee China con iptables

10

Acabo de iniciar sesión en un servidor GitLab y noté que tenía 18.974 inicios de sesión fallidos desde la última vez que revisé el servidor, casi 5 días. Revisé los Ip y parece que casi todos eran de China e intentaron acceder con SSH y Brute Force. Comencé a bloquear algunos Ip, pero luego me di cuenta de que es una gran pérdida de tiempo y una mejor idea sería bloquear todo el país.

¿Hay alguna forma en que pueda bloquear TODA China o cualquier otro país con iptables?

Encontré algunos artículos en Internet, pero casi todos son scripts de bash. Soy un novato en Linux, así que realmente no entiendo todos esos scripts. Encuentro iptables realmente interesante y quiero aprender más al respecto.

Algunas ideas ? ¡Gracias!

Caranfil Alegzandru
fuente
44
Resolví el mismo problema de una manera diferente. Fortalecí SSH en el servidor GitLab de mi cliente al desactivar la autenticación basada en contraseña y desafío y solo permitir el inicio de sesión con claves SSL. ¿Tal vez eso funcionaría en tu situación? El bloqueo de los rangos de IP puede reducir el "ruido", pero no le brindará una protección real contra la fuerza bruta.
blendenzo
Hasta ahora no funcionó. el servidor de gitlab todavía está activo y tuve 0 robo. El acceso a Ssh se realiza solo con las teclas ssh y deshabilité el inicio de sesión raíz. Es solo que quiero aprender iptables tan mal ...
Caranfil Alegzandru
1
También puede cambiar su ssh a un puerto no predeterminado en su enrutador. Eso redujo mis intentos de ataque de ssh bot de cientos por día a cero.
Mármol orgánico

Respuestas:

7

Usando iptables para identificar automáticamente, y luego bloquear, los malos para ssh pueden hacerse usando el recentmódulo. El siguiente segmento debe venir después de su ESTABLISHED,RELATEDlínea genérica :

...
$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, a menudo, una vez que se bloquean de 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 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.

Doug Smythies
fuente
Este ^! Podría ser la mejor respuesta que he recibido. Puede ser una pregunta tonta, pero supongo que todas estas reglas van en un script bash, ¿verdad? Todavía tengo algunos problemas para entender iptables pero me parece fascinante.
Caranfil Alegzandru
Sí, uso un script bash. Algunos, y yo también los utilicé, usan un método directo de restauración de iptables, que es más rápido de cargar. Cambié porque incluyo algunos comandos que no son iptables en el mismo script.
Doug Smythies
12

Bloque de China usando ipset

No puede agregar manualmente algunos 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 cambio, 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 hace como root. Ajuste en consecuencia si su sistema está basado en sudo.

apt-get install ipset

Luego, escribí un pequeño script de Bash para hacer todo el trabajo, que deberías poder entender de los comentarios que contiene. Crea un archivo:

nano /etc/block-china.sh

Esto es lo que quieres pegar:

# 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. Hazlo ejecutable:

chmod +x /etc/block-china.sh

Esto aún no ha hecho nada, 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 el script anterior define:

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, mi iptables.firewall.rules completo ahora se ve 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 IP basadas en chino y luego, después de unos segundos, se completará y lo regresará 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 continuará trabajando en reiniciar. 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 nuevamente el script block-china.sh.

También podemos configurar la máquina para que lo haga automáticamente mediante un trabajo cron:

crontab -e

Agregue una línea como esta:

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

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

fuente

Surjit Sidhu
fuente
¿Por qué limitarlo a solo el protocolo TCP? Parece funcionar sin especificar el protocolo. Sugiera utilizar las listas agregadas más nuevas, ya que son mucho más cortas:wget http://www.ipdeny.com/ipblocks/data/aggregated/cn-aggregated.zone
Doug Smythies
No hay nada aquí que restaure el conjunto de ip después de reiniciar.
Doug Smythies
4

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

Kyle H
fuente
También podría usar el firewall csf y bloquear todos los países que quiera de los archivos de configuración. Lo que pasa es que realmente quiero usar iptables para poder aprender más al respecto.
Caranfil Alegzandru
Tendría que ver qué países tienen asignados los bloques de direcciones IP para determinar a quién bloquear. Sin embargo, no estoy seguro de si sería súper preciso o no. Puede usar iptables -L para mostrar las reglas actuales de iptables, iptables-save para mostrar qué comandos se ejecutaron para crear dichas reglas, luego diseñar sus propias reglas y probar usando máquinas de prueba para obtener más información. Así es como lo aprendí.
Kyle H
0

Puede usar el módulo geoip para iptables: https://linoxide.com/linux-how-to/block-ips-countries-geoip-addons/

Una vez que nuestro sistema se actualice y se instalen las dependencias, ahora instalaremos los xtables-addons en nuestra máquina. Para hacerlo, descargaremos el último tarball del sitio oficial del proyecto xtables-addons usando wget. Una vez que se haya descargado, extraeremos el tarball, luego lo compilaremos e instalaremos en nuestra máquina.

wget http://downloads.sourceforge.net/project/xtables-addons/Xtables-addons/xtables-addons-2.13.tar.xz
tar xf xtables-addons-2.13.tar.xz
cd xtables-addons-2.13
./configure
make
make install [...]

A continuación, ejecutaremos un módulo llamado xt_geoip que viene con la extensión xtables-addons que descarga la base de datos GeoIP de MaxMind y la convierte en una forma binaria reconocida por xt_geoip. Una vez que se haya descargado, lo crearemos y los moveremos a la xt_geoipruta requerida , es decir /usr/share/xt_geoip.

cd geoip
./xt_geoip_dl
./xt_geoip_build GeoIPCountryWhois.csv
mkdir -p /usr/share/xt_geoip/
cp -r {BE,LE} /usr/share/xt_geoip/

Aquí está la sintaxis básica para usar iptables con el módulo geoip para bloquear el tráfico que se origina o se destina a un país. Aquí, necesitamos usar el código ISO3166 de dos letras en lugar del país, por ejemplo, EE. UU. Para Estados Unidos, IE para Irlanda, IN para India, CN para China, etc.

iptables -m geoip --src-cc country[,country...] --dst-cc country[,country...]
Markus Lenger
fuente
0

Que se utiliza para IP2 Lista Firewall para generar iptables para China.

El archivo tiene el siguiente formato. Ejecútelo en el shell y debería estar bloqueando todas las direcciones IP de China.

iptables -A INPUT -s 8.8.8.8/24 -j DROP
Michael C.
fuente