
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