comando ip route com um intervalo, não um CIDR

comando ip route com um intervalo, não um CIDR

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

informação relacionada