Grepping для диапазонов CIDR

10

Время от времени я хочу извлекать диапазоны CIDR из моих файлов журналов Apache. Это легко для диапазонов, которые попадают на естественные границы (/ 8, / 16 и / 24), но не так просто для других диапазонов, таких как / 17 и / 25.

Примеры:

# 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

Эти регулярные выражения игнорируют IP-адреса, которые содержат начальные нули, например 192.168.001.001, что не является проблемой в файлах журнала Apache, но может быть в других файлах журнала. В частности, принтерам нравятся лидирующие нули. Достаточно просто добавить необязательные нули к регулярному выражению, но это только делает все это немного сложнее. Должен быть более легкий путь.

Есть ли простой способ выбрать строки из файла, которые соответствуют любому диапазону CIDR?

Необычные расширения регулярных выражений будут рассматриваться как различные инструменты (например, awkили, perlесли необходимо, но я хочу, чтобы они были однострочными), если они облегчат работу. В идеале то, что я хотел бы, это что-то вроде

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

Инструмент, который преобразует диапазон CIDR в соответствующее регулярное выражение, также будет в порядке.

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

или

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

Бонусные баллы, если ваш ответ также охватывает IPv6.

Ladadadada
источник

Ответы:

17

Неудивительно, что для этого есть инструмент grepcidr.

По умолчанию она не включена ни в одну из известных мне систем, но вы можете скачать ее отсюда , и она также есть в репозитории пакетов Ubuntu и в коллекции портов FreeBSD.

(Версия 2.0 работает и с сетями IPv6)

voretaq7
источник
2
Если вам нужна функциональность IPv6, то что-то ужасное может быть взломано вместе с помощью Net :: CIDR в perl ...
voretaq7
Я также создал небольшой CLI-инструмент на основе Node.js для анализа IPv4 cidr
Michele Pangrazzi,
5

Недавно выпущенный rgxgинструмент командной строки генерирует регулярные выражения, соответствующие всем адресам в блоке 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])

или

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

Для получения дополнительной информации см. Http://rgxg.sf.net .

hvhaugwitz
источник