CIDR ではなく範囲を指定した ip route コマンド

CIDR ではなく範囲を指定した ip route コマンド

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

また、ipsetまたはiptables geoip モジュール、 一部のxtables アドオンこれらの範囲を直接使用するよりも便利ではありません。

geoip については、この Q/A の使用例をご覧ください。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

関連情報