команда ip route с диапазоном, а не CIDR

команда ip route с диапазоном, а не CIDR

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

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

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

Есть идеи?

решение1

Theсетевая маска инструментможет быть очень удобно преобразовать диапазон в 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 посмотрите пример использования в этом разделе вопросов и ответов:Ubuntu IPTables разрешает только 1 страну

решение2

Нет такого понятия, как маршрутизация диапазона. Вы можете маршрутизировать подсети (настолько близко к желаемому диапазону, насколько вам нужно) и дополнять это любым количеством других независимых, не включенных в подсети 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, так что вы в основном покрываете его двумя маршрутами, но это просто. Все может стать намного сложнее.

решение3

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

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

Или для обозначения IP/сетевой маски с помощью

 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

Связанный контент