Greifen nach CIDR-Bereichen

10

Von Zeit zu Zeit möchte ich CIDR-Bereiche aus meinen Apache-Protokolldateien herausgreifen. Dies ist einfach für Bereiche, die an die natürlichen Grenzen fallen (/ 8, / 16 und / 24), aber nicht so einfach für andere Bereiche wie / 17 und / 25.

Beispiele:

# 192.168.0.0/16: (easy)
grep " 192\.168\." access_log

# 192.168.128.0/17: (more thought required)
grep -E " 192\.168\.(12[89]|1[3-9][0-9]|2[0-5][0-9])\." access_log

# 192.168.0.0/17: (more thought required)
grep -E " 192\.168\.([0-9]|[0-9][0-9]|1[01][0-9]|12[0-7])\." access_log

# 192.168.128.0/18: (straining my brain)
grep -E " 192\.168\.(1[2-8][0-9]|19[01])\." access_log

Diese regulären Ausdrücke ignorieren IP-Adressen, die führende Nullen enthalten, z. B. 192.168.001.001was in Apache-Protokolldateien kein Problem darstellt, aber in anderen Protokolldateien enthalten sein kann. Insbesondere Drucker scheinen die führenden Nullen zu mögen. Es ist einfach genug, die optionalen Nullen zum regulären Ausdruck hinzuzufügen, aber es macht das Ganze nur ein bisschen schwieriger. Es muss einen einfacheren Weg geben.

Gibt es eine einfache Möglichkeit, Zeilen aus einer Datei auszuwählen, die einem beliebigen CIDR-Bereich entsprechen?

Ausgefallene Regex-Erweiterungen werden ebenso berücksichtigt wie verschiedene Tools (wie awkoder perlfalls erforderlich, aber ich möchte, dass es sich um einen Einzeiler handelt), wenn sie die Arbeit erleichtern. Im Idealfall möchte ich so etwas wie

grep "[:CIDR 192.168.128.0/18:]" access_log

Ein Tool, das einen CIDR-Bereich in den entsprechenden regulären Ausdruck konvertiert, ist ebenfalls in Ordnung.

$ cidr2regex 192.168.0.0/18
192\.168\.(1[2-8][0-9]|19[01])\.[0-9]{1,3}

oder

$ grep -E "$(cidr2regex 192.168.0.0/18)" access_log

Bonuspunkte, wenn Ihre Antwort auch IPv6 abdeckt.

Ladadadada
quelle

Antworten:

17

Es ist nicht überraschend, dass es dafür ein Werkzeug gibt : grepcidr.

Es ist standardmäßig nicht in jedem mir bekannten System enthalten, aber Sie können es von hier herunterladen und es befindet sich sowohl im Ubuntu-Paket-Repository als auch in der FreeBSD-Ports-Sammlung.

(Version 2.0 funktioniert auch mit IPv6-Netzwerken)

voretaq7
quelle
2
Wenn Sie IPv6-Funktionalität benötigen, könnte etwas Schreckliches mit Net :: CIDR in Perl zusammen gehackt werden ...
voretaq7
Ich habe auch ein kleines Node.js-basiertes CLI-Tool für IPv4-Cidr-Grepping erstellt
Michele Pangrazzi
5

Das kürzlich veröffentlichte rgxgBefehlszeilentool generiert reguläre Ausdrücke, die mit allen Adressen in einem CIDR-Block übereinstimmen:

$ rgxg cidr 192.168.128.0/18
192\.168\.(19[01]|1[3-8][0-9]|12[89])\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])

oder

$ rgxg cidr 2001:db8:a:b:c:d::/112
2001:0?[Dd][Bb]8:0?0?0?[Aa]:0?0?0?[Bb]:0?0?0?[Cc]:0?0?0?[Dd]((::[0-9A-Fa-f]{1,4}|::|:0?0?0?0(::|:[0-9A-Fa-f]{1,4}))|:0\.0(\.(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9]?[0-9])){2})

Weitere Informationen finden Sie unter http://rgxg.sf.net .

hvhaugwitz
quelle