1

У меня есть список IP-адресов, таких как эти страны, из i-blocklist: https://www.iblocklist.com/lists.php?category=country

Они предоставляют только диапазоны без подписки, например: 201.237.0.0-201.237.255.255

Мне нужно направить несколько из этих списков на конкретный интерфейс на сервере, но я не вижу опции в ip route, чтобы указать диапазон в приведенной выше записи.

Есть идеи?

3 ответа3

2

Маска подсети инструмент может быть очень удобно , чтобы преобразовать диапазон в 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

Вы также должны увидеть, что при использовании ipset или модуля iptables geoip часть xtables-addons не будет более полезной, чем непосредственное использование этих диапазонов.

Для geoip, посмотрите на этот пример использования в этом Q/A: IPTables Ubuntu позволяют только 1 стране

1

Нет такой вещи, как дальность маршрутизации. Вы можете направить подсети (так близко к желаемому диапазону, как вам нужно) и дополнить их тем количеством других независимых, не включенных в IP-адреса подсетей, которые вам нужны.

В вашем примере 201.237.0.0-201.237.255.255 - это не диапазон, это подсеть 201.237.0.0 /16. Вы можете направить его в один выстрел.

Диапазон будет выглядеть как 201.237.0.1-201.237.1.3, который невозможно будет маршрутизировать в этом формате. В этом сценарии вам потребуется маршрут 201.237.0.0 /24 и отдельно 201.237.1.0 /30, так что вы в основном покрываете его двумя маршрутами, но это простой. Все может стать намного сложнее.

0

Расширяя ответ AB - вы можете преобразовать весь список в нотацию CIDR, используя

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

Или для обозначения IP/Netmask с

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

Таким образом, чтобы протолкнуть все IP-адреса из определенного диапазона через определенный интерфейс, вы можете сделать что-то вроде

Собрав его вместе, вы можете создать команду со скриптом, как показано ниже: удалите "echo" и завершите команду iptables в соответствии с вашими требованиями:

#! /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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .