Empowered by expect

希望は体力

IPアドレスのリストアップと集約(prips, aggregate)ついでにgrepcidr

きっかけ

@m4g さんのツイートでいろんなツールを思い出したのでまとめておきます

prips (print IP address)

私も以前同様のツールを探して、blacknonさんのブログでpripsを知りました。

orebibou.com

ここではRPMLinuxでのインストールと動作確認を記します。

pripsのインストール

$ git clone https://gitlab.com/prips/prips.git
$ cd prips
$ make

$ make test
prove t
t/01-cidr.t ...... ok
t/02-range.t ..... ok
t/03-skip.t ...... ok
t/04-format.t .... ok
t/05-except.t .... ok
t/06-cidrize.t ... ok
t/07-features.t .. skipped: The feature-check tool does not seem to be present
All tests successful.
Files=7, Tests=74,  1 wallclock secs ( 0.06 usr  0.02 sys +  0.34 cusr  0.12 csys =  0.54 CPU)
Result: PASS
$ sudo make install
$ hash -r

pripsの使用例

まずはヘルプを見てみます。

$ prips -h
usage: prips [options] <start end | CIDR block>
        -c              print range in CIDR notation
        -d <x>          set the delimiter to the character with ASCII code 'x'
                        where 0 <= x <= 255
        -h              display this help message and exit
        -f <x>          set the format of addresses (hex, dec, or dot)
        -i <x>          set the increment to 'x'
        -e <x.x.x,x.x>  exclude a range from the output, e.g. -e ..4. will
                        not print 192.168.4.[0-255]

        prips --help | --version | --features

Report bugs to Peter Pentchev <roam@ringlet.net>

元々のお題をであるCIDRを入れたらレンジ内のIPアドレスを列挙する、をやってみます。

prips 203.0.113.0/29
203.0.113.0
203.0.113.1
203.0.113.2
203.0.113.3
203.0.113.4
203.0.113.5
203.0.113.6
203.0.113.7

残念ながらCIDR表記指定などのオプションは無いので、末尾に/32を付けたい場合はsedします。

$ prips 203.0.113.0/29 | sed -e 's/$/\/32/g'
203.0.113.0/32
203.0.113.1/32
203.0.113.2/32
203.0.113.3/32
203.0.113.4/32
203.0.113.5/32
203.0.113.6/32
203.0.113.7/32

aggregate

ついでに関連ツールも書いていきます。
aggregateはその名の通りCIDR表記のアドレスリストを集約するツールです。

aggregateのインストール

epelにパッケージがあるのでyumで導入できます。

yum install aggregate

そっち系の方は
yum install aggregate-ios
も便利かもしれません。

ソースコードからコンパイルしたい方はこちらから。
みんな大好きBIND DNSサーバーのISCさんのサーバーから入手できます。
https://ftp.isc.org/isc/aggregate/

aggregate使用例

簡単な例として、先ほどのpripsコマンドで作ったIPアドレス一覧(/32表記)を/29に戻します。

$ prips 203.0.113.0/29 | sed -e 's/$/\/32/g'  | aggregate
aggregate: maximum prefix length permitted will be 32
203.0.113.0/29


/32も含め入力データはCIDR表記でなければいけませんが、サブネットマスク計算などメンドクサイことをパッとやってくれます。

grepcidr

grepcidrはCIDR表記のレンジやIPアドレスについて包含関係を判定するコマンドです。

当時yunazunoさんのブログで知りました。
yunazuno.hatenablog.com

grepcidrのインストール

atomic repoを用いてyumでインストールできます。

# curl -s https://updates.atomicorp.com/installers/atomic | sh
# yum --enablerepo=atomic install grepcidr
===================================================================================================================================
 Package                       アーキテクチャー            バージョン                            リポジトリー                 容量
===================================================================================================================================
インストール中:
 grepcidr                      x86_64                      2.0-1.el7.art                         atomic                       21 k

トランザクションの要約
===================================================================================================================================
インストール  1 パッケージ

grepcidrの使用例

man grepcidrに様々な例が載っています。

somescript | grepcidr -vf whitelist > blacklist
  • v はgrep同様 "含まない"条件指定になるので、この例はスクリプトが出力するIPアドレス(レンジ)リストから許可リストを除外して拒否リストを作っています。
grepcidr "192.168.0.1-192.168.10.13" iplog

このようにCIDR表記ではなく範囲指定で抽出することもできます。

(難点: grep cidrとタイプしてしまいがち)

sort

IPアドレスのソートは以下のsortコマンドオプションが使えます。

sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4
$ cat sampleIPaddress.list
203.0.113.64
192.0.2.12
198.51.100.230
192.0.2.1
$ cat sampleIPaddress.list | sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4
192.0.2.1
192.0.2.12
198.51.100.230
203.0.113.64

/32表記でも同じ結果が得られます。

$ cat sampleIPaddress.list
203.0.113.64/32
192.0.2.12/32
198.51.100.230/32
192.0.2.1/32
$ sort -n -t '.' -k 1,1 -k 2,2 -k 3,3 -k 4,4 sampleIPaddress.list
192.0.2.1/32
192.0.2.12/32
198.51.100.230/32
203.0.113.64/32

まとめ

IPアドレスやCIDRは小数でもない直接扱いにくい形式ですが、先人のみなさまが便利ツールを提供してくださっているので便利にシュッと使っていきたいですね。