
У меня есть список 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