モチベーション
サーバへのアクセスログを眺めている際、「このIPどこかで見たよな、、」となるケースがちょこちょことあります。
最近はWAFの面倒を見ることが多く、遮断ログに正常通信の誤遮断が結構混ざる関係でちょこちょこと調べないといけないのですが、「これ前にシステム関連系で使うって言われてホワイトリストに入れたやつじゃなかったっけか、、?」となることがあります。
そういった情報は構成管理の一環できちんとまとめて常時検索できるようにしておけ、、という話ではあるのですが、開発と運用でチームが別れてるとなかなか面倒なわけで。
そういうときのために、コンフィグなどのファイルに含まれているIPアドレスを引っこ抜くスクリプトを作ることにしました。
普通にGREPじゃだめなん?
grep -nrIe <対象ファイル>とかとすればいいのでは、、?と言われる気はします。
IPドンピシャならそれでいいのですけれど、configファイルの中で登録するときは/24などのレンジで登録しているので、ログ監視などで見つけた/32のIPをそのまま調べるとうまく行きません。
なら"192.168.0."とかキーワードを工夫すりゃいいのでは?というのもまぁありなのですが、その場合/8,/16,/24のように切りがいいレンジじゃないとゴミを巻き込みます。
いうほどめんどくさくもないのでは、、?と言われるような気はしますが、ちょこちょこと痒いところに手がどく動作をさせたいという事もありますので、スクリプトとして実装してみることにします。
作ってみたもの
こんな。
一個前に投稿したレンジ集約スクリプトとセットでまとめてます。
基礎技術は似てるんで。
使ってみると
% python3 ~/iptools-nfw/ipgrep.py -v 192.168.0.0/24 ${HOME}/iptools-nfw/tests/sample01.txt
/home/uname/iptools-nfw/tests/sample01.txt:1,0:192.168.0.0
/home/uname/iptools-nfw/tests/sample01.txt:2,0:192.168.0.1
/home/uname/iptools-nfw/tests/sample01.txt:3,0:192.168.0.255
はい。まぁ、シンプルに意図通りに動くものですね。
一応 -m という検索モードを絞るオプションもつけてます。
通常だと、第1引数のレンジに含まれるもの(include)と、第1レンジを含むもの(included)の両方を出力します。
例えば、192.168.0.0/24を第1引数にしている場合、検索対象の中に含まれる192.168.0.0/25(include)、192.168.0.0/16(included)の両方を出力します。
これを制限して出力したい場合、-mのオプションを使います。
実装してみてのいろいろ
本来用途以外にも、ファイル内のIPアドレスをマスクしないといけないときに 0.0.0.0/0を検索するという方法で使う、というようなこともできます。
現状はそこまで便利という感じはしないのは事実なのですが、dnsを引くと該当IPに相当するFQDNを検索する、といような応用機能は作ってみてもいいかもしれません。
これも、つかいながらおいおい修正していきたいと思います。
とりあえず今のところはそんなで。