![ip route 命令带有范围,而不是 CIDR](https://linux22.com/image/1558712/ip%20route%20%E5%91%BD%E4%BB%A4%E5%B8%A6%E6%9C%89%E8%8C%83%E5%9B%B4%EF%BC%8C%E8%80%8C%E4%B8%8D%E6%98%AF%20CIDR.png)
我有一个来自 i-blocklist 的 IP 列表,例如这些国家/地区的 IP:https://www.iblocklist.com/lists.php?category=country
它们仅提供无需订阅的范围,例如:201.237.0.0-201.237.255.255
我需要将其中一些列表路由到服务器上的特定接口,但我没有看到 ip route 中用于指定上述符号的范围的选项。
有任何想法吗?
答案1
$ 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