帶有範圍而不是 CIDR 的 ip Route 命令

帶有範圍而不是 CIDR 的 ip Route 命令

我有一個 IP 列表,例如 i-blocklist 中的這些國家的 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

您還應該看看是否使用IP集或者iptables geoip 模組, 部分xtables 插件不會比直接使用這些範圍更有用。

對於 geoip,請查看此 Q/A 中的使用範例:Ubuntu IPTables 只允許 1 個國家/地區

答案2

沒有範圍路由之類的東西。您可以路由子網路(盡可能接近您需要的所需範圍),並以您需要的子網路 IP 中未包含的其他獨立 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 答案 - 您可以使用以下命令將整個列表轉換為 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

相關內容