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