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

1

Eu tenho uma lista de IPs, como esses do país, da i-blocklist: link

Eles fornecem apenas intervalos sem assinatura, como: 201.237.0.0-201.237.255.255

Eu preciso encaminhar algumas dessas listas para uma interface específica em um servidor, mas não vejo uma opção no ip route para especificar um intervalo na notação acima.

Alguma idéia?

    
por hacktek 16.04.2018 / 07:24

3 respostas

2

A máscara de rede ferramenta pode 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á usando o ipset ou o módulo de geoip do iptables , parte de xtables-addons não seria mais útil do que usar diretamente esses intervalos.

Para o geoip, veja este exemplo de uso neste Q / A: Ubuntu IPTables permitem somente 1 país

    
por 16.04.2018 / 07:42
1

Não existe roteamento de intervalo. Você pode rotear sub-redes (o mais próximo da faixa desejada que você precisa) e suplementar isso com quantas outras independentes não estiverem incluídas nos IPs de sub-redes que você precisa.

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 rotear isso de uma só vez.

Um intervalo seria algo como 201.237.0.1-201.237.1.3, o que seria impossível rotear sob este formato. Neste cenário, você precisaria rotear 201.237.0.0 / 24 e separadamente 201.237.1.0 / 30, então você basicamente o cobre com 2 rotas, mas é fácil. As coisas podem ficar muito mais complicadas.

    
por 16.04.2018 / 09:55
0

Expandindo em A.B Answer - 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 notação de IP / Netmask com

 for each in 'cut -f2 -d":" ad  | tr "-" ":"' ; do netmask -s $each 2>/dev/null; done

Então, para empurrar todos os IPs de um determinado intervalo através de uma interface específica, você poderia fazer algo como

Juntando você pode criar um comando com um script como abaixo - removendo o "echo" e finalizando o comando iptables conforme apropriado para seus requisitos:

#! /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
    
por 16.04.2018 / 09:25