Grepping per gamme CIDR


10

Di tanto in tanto voglio estrarre gli intervalli CIDR dai miei file di registro di Apache. Questo è facile per intervalli che ricadono sui confini naturali (/ 8, / 16 e / 24) ma non è così facile per altri intervalli come / 17 e / 25.

Esempi:

# 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

Queste regex ignorano gli indirizzi IP che includono zeri iniziali, ad esempio 192.168.001.001, che non è un problema nei file di registro di Apache ma potrebbe trovarsi in altri file di registro. Le stampanti in particolare sembrano apprezzare gli zeri iniziali. È abbastanza facile aggiungere gli zero opzionali al regex, ma rende tutto un po 'più difficile. Ci deve essere un modo più semplice.

Esiste un modo semplice per selezionare le righe da un file che corrispondono a qualsiasi intervallo CIDR?

Verranno prese in considerazione estensioni regex di fantasia così come strumenti diversi (come awko perlse necessario, ma voglio che sia un one-liner) se semplificano il lavoro. Idealmente, quello che mi piacerebbe è qualcosa di simile

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

Anche uno strumento che converte un intervallo CIDR nella regex appropriata sarebbe OK.

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

o

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

Punti bonus se la tua risposta copre anche IPv6.



Risposte:


17

Non v'è, ovviamente, uno strumento per questo: grepcidr.

Non è incluso di default in nessun sistema di cui sia a conoscenza, ma è possibile scaricarlo da qui ed è sia nel repository di pacchetti Ubuntu sia nella raccolta di porte di FreeBSD.

(La versione 2.0 funziona anche con reti IPv6)


2
Se hai bisogno della funzionalità IPv6, qualcosa di orribile potrebbe essere hackerato insieme usando Net :: CIDR in perl ...
voretaq7

Ho anche creato un piccolo strumento CLI basato su Node.js per cidr-grepping IPv4
Michele Pangrazzi,

5

Lo rgxgstrumento da riga di comando rilasciato di recente genera espressioni regolari che corrispondono a tutti gli indirizzi in un blocco CIDR:

$ 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])

o

$ 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})

Per ulteriori informazioni, consultare http://rgxg.sf.net .

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.