
Eu tenho uma lista de IPs como estes países da i-blocklist:https://www.iblocklist.com/lists.php?category=country
Eles fornecem apenas intervalos sem assinatura, como: 201.237.0.0-201.237.255.255
Preciso rotear algumas dessas listas para uma interface específica em um servidor, mas não vejo uma opção em ip route para especificar um intervalo na notação acima.
Alguma ideia?
Responder1
Omáscara de rede ferramentapode ser muito útil para converter um intervalo em um 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
Você também deve ver se está usandoipsetou omódulo geoip iptables, parte decomplementos xtablesnão seria mais útil do que usar diretamente esses intervalos.
Para geoip, veja este exemplo de uso nestas perguntas e respostas:Ubuntu IPTables permite permitir apenas 1 país
Responder2
Não existe roteamento de intervalo. Você pode rotear sub-redes (o mais próximo possível do intervalo desejado) e complementá-las com quantos outros IPs independentes não incluídos nas sub-redes você precisar.
No seu exemplo, 201.237.0.0-201.237.255.255 não é um intervalo, é a sub-rede 201.237.0.0 /16 . Você pode encaminhá-lo de uma só vez.
Um intervalo seria algo como 201.237.0.1-201.237.1.3, o que seria impossível de rotear nesse formato. Nesse cenário, você precisaria rotear 201.237.0.0/24 e 201.237.1.0/30 separadamente, então você basicamente cobre isso com 2 rotas, mas essa é fácil. As coisas podem ficar muito mais complicadas.
Responder3
Expandindo a resposta AB - você pode converter uma lista inteira em notação CIDR usando
for each in `cut -f2 -d":" ad | tr "-" ":"` ; do netmask $each 2>/dev/null; done
Ou para a notação IP/Máscara de rede com
for each in `cut -f2 -d":" ad | tr "-" ":"` ; do netmask -s $each 2>/dev/null; done
Então, para enviar todos os IPs de um intervalo específico através de uma interface específica, você poderia fazer algo como
Juntando tudo, você poderia criar um comando com um script como abaixo - removendo o "echo" e finalizando o comando iptables conforme apropriado para suas necessidades:
#! /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