IP-Routenbefehl mit einem Bereich, nicht einem CIDR

IP-Routenbefehl mit einem Bereich, nicht einem CIDR

Ich habe eine Liste mit IPs wie diesen Länder-IPs von i-blocklist:https://www.iblocklist.com/lists.php?category=country

Sie bieten nur Bereiche ohne Abonnement an, wie zum Beispiel: 201.237.0.0-201.237.255.255

Ich muss einige dieser Listen über eine bestimmte Schnittstelle auf einem Server weiterleiten, sehe aber in der IP-Route keine Option zum Angeben eines Bereichs in der obigen Notation.

Irgendwelche Ideen?

Antwort1

DerNetzmaske Werkzeugkann sehr praktisch sein, um einen Bereich in eine CIDR umzuwandeln:

$ 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

Sie sollten auch prüfen, ob die Verwendungipsetoder deriptables GeoIP-Modul, Teil vonxtables-addonswäre nicht nützlicher, als diese Bereiche direkt zu verwenden.

Für GeoIP sehen Sie sich dieses Anwendungsbeispiel in dieser Frage/Antwort an:Ubuntu IPTables erlauben nur 1 Land

Antwort2

So etwas wie Bereichsrouting gibt es nicht. Sie können Subnetze routen (so nah an den gewünschten Bereich wie nötig) und dies mit beliebig vielen anderen unabhängigen, nicht in den Subnetzen enthaltenen IPs ergänzen, die Sie benötigen.

In Ihrem Beispiel ist 201.237.0.0-201.237.255.255 kein Bereich, sondern das Subnetz 201.237.0.0 /16. Sie können es in einem Schritt weiterleiten.

Ein Bereich wäre etwa 201.237.0.1-201.237.1.3, der in diesem Format nicht geroutet werden könnte. In diesem Szenario müssten Sie 201.237.0.0 /24 und separat 201.237.1.0 /30 routen, sodass Sie es im Grunde mit 2 Routen abdecken, aber das ist einfach. Es kann viel komplizierter werden.

Antwort3

Erweiterung der AB-Antwort - Sie können eine ganze Liste in die CIDR-Notation konvertieren mit

for each in `cut -f2 -d":" ad  | tr "-" ":"` ; do netmask $each 2>/dev/null; done

Oder zur IP/Netmask-Notation mit

 for each in `cut -f2 -d":" ad  | tr "-" ":"` ; do netmask -s $each 2>/dev/null; done

Um alle IPs aus einem bestimmten Bereich über eine bestimmte Schnittstelle zu übertragen, könnten Sie beispielsweise Folgendes tun:

Zusammengefasst könnten Sie mit dem folgenden Skript einen Befehl erstellen – entfernen Sie dabei das „Echo“ und beenden Sie den iptables-Befehl entsprechend Ihren Anforderungen:

#! /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

verwandte Informationen