
Tengo una lista de IP como estas de países de i-blocklist:https://www.iblocklist.com/lists.php?category=country
Solo brindan rangos sin suscripción, como por ejemplo: 201.237.0.0-201.237.255.255
Necesito enrutar algunas de esas listas a una interfaz específica en un servidor, pero no veo una opción en ip route para especificar un rango en la notación anterior.
¿Algunas ideas?
Respuesta1
Elmáscara de red herramientaPuede ser muy útil para convertir un rango a un CIDR:
$ netmask 201.237.0.0:201.237.255.255
201.237.0.0/16
$ netmask 201.238.3.0:201.238.9.255
201.238.3.0/24
201.238.4.0/22
201.238.8.0/23
También deberías ver si usasipseto elmódulo geoip de iptables, parte decomplementos-xtablesNo sería más útil que usar directamente esos rangos.
Para geoip, mire este ejemplo de uso en esta pregunta/respuesta:Ubuntu IPTables solo permite 1 país
Respuesta2
No existe el enrutamiento de rango. Puede enrutar subredes (tan cerca del rango deseado como necesite) y complementarlas con otras IP independientes no incluidas en las subredes que necesite.
En su ejemplo, 201.237.0.0-201.237.255.255 no es un rango, es la subred 201.237.0.0 /16. Puedes enrutarlo de una sola vez.
Un rango sería algo así como 201.237.0.1-201.237.1.3, que sería imposible enrutar con este formato. En este escenario, necesitaría enrutar 201.237.0.0 /24 y por separado 201.237.1.0 /30, por lo que básicamente lo cubre con 2 rutas, pero esa es fácil. Las cosas pueden volverse mucho más complicadas.
Respuesta3
Ampliando AB Answer: puede convertir una lista completa a notación CIDR usando
for each in `cut -f2 -d":" ad | tr "-" ":"` ; do netmask $each 2>/dev/null; done
O a la notación IP/Máscara de red con
for each in `cut -f2 -d":" ad | tr "-" ":"` ; do netmask -s $each 2>/dev/null; done
Entonces, para enviar todas las IP de un rango particular a través de una interfaz particular, podrías hacer algo como
Al unirlo, podría crear un comando con un script como se muestra a continuación: eliminando el "eco" y finalizando el comando iptables según corresponda a sus necesidades:
#! /bin/bash
TMPFILE="/dev/shm/$$.del"
for each in `cut -f2 -d":" ad | tr "-" ":"`
do
netmask -s $each 2>/dev/null;
done > $TMPFILE
while read -r each
do
ROUTE=${each%/*}
NETMASK=${each#*/}
echo /sbin/route add $ROUTE netmask $NETMASK ....
done <$TMPFILE