ip route 命令带有范围,而不是 CIDR

ip route 命令带有范围,而不是 CIDR

我有一个来自 i-blocklist 的 IP 列表,例如这些国家/地区的 IP:https://www.iblocklist.com/lists.php?category=country

它们仅提供无需订阅的范围,例如:201.237.0.0-201.237.255.255

我需要将其中一些列表路由到服务器上的特定接口,但我没有看到 ip route 中用于指定上述符号的范围的选项。

有任何想法吗?

答案1

网络掩码 工具将范围转换为 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-插件不会比直接使用这些范围更有用。

对于 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,因此您基本上用 2 条路由覆盖它,但这很简单。事情可能会变得复杂得多。

答案3

扩展 AB Answer - 您可以使用以下方式将整个列表转换为 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

相关内容