KITA Eng.

北海道でサーバー技術者として歩み出したひとが綴るblog。

数千件のIPアドレスを逆引きしまくるミッション

こちらの業界に来て、4勤務日目。 ついに、ちょっと手作業でやってらんない課題が与えられました。

ボス「ちょっと、この表のIPアドレス全部逆引きしてくれる?」

K「喜んで!」

ボス「数千件あるから、うまいことやってちょうだい!」

K「・・・」


という会話があったとか、なかったとかは、どうでもよくて… 十数件ぐらいなら、

dig -x <IPADDRESS>

をやりまくればいいわけですが、さすがに数千件分やるのは無理。 ということで、どうしたかってことですが…

Google先生に尋ねてみた

なんだかありがちな作業な気がしたので、とりあえずGoogle先生に尋ねてみたところ、

ってのが引っ掛かって、コレキタ!ってなりましたが… 紹介されていた以下のシェルスクリプトを書いてみるものの

#!/bin/sh
for ADDRESS in `cat $1`
do
nslookup $ADDRESS | grep "Name:" | sed -e "s/ */ /g" | cut -d " " -f 2
done

うまくいかない。

$ nslookup 216.58.220.196                    
Server:         127.0.1.1
Address:        127.0.1.1#53
Non-authoritative answer:
196.220.58.216.in-addr.arpa     name = nrt13s36-in-f196.1e100.net.
196.220.58.216.in-addr.arpa     name = nrt13s36-in-f4.1e100.net.

Authoritative answers can be found from:
220.58.216.in-addr.arpa nameserver = ns1.google.com.
220.58.216.in-addr.arpa nameserver = ns4.google.com.
220.58.216.in-addr.arpa nameserver = ns3.google.com.
220.58.216.in-addr.arpa nameserver = ns2.google.com.
ns1.google.com  internet address = 216.239.32.10
ns2.google.com  internet address = 216.239.34.10
ns3.google.com  internet address = 216.239.36.10
ns4.google.com  internet address = 216.239.38.10

ってな感じで出るわけなので、

grep "Name:"

してもダメなわけね。ってのはわかったから、

grep "name"

データは出てくるんだけど… 一つのIPアドレスに対して複数の結果が出てきやがるもんだから困った。 それだけなら、Excelくんやらで加工してやろうかと思ったけど、 うまくnslookupできなかったやつとか、grepできなかったやつはエラーが出るでもなく、 記録されないだけなもんだから困った…

digコマンドを見直そう!

nslookupだと、エイリアスは除くとかもできなくて、うまくいきそうにないということで、 digコマンドをお勉強してなんとかしてやろうと。 いろいろ見たけど結局

がとても参考になった。

ついでにDNSレコードの基本も再確認したら、@ITがやっぱりまとまっていてわかりやすかった。

いろいろ試行錯誤が途中あったけど、 DNSの逆引きを実行するコマンド部分としては、

 dig +noall -x <IPADDRESS> +ans +nottlid

で固まった。 が、やっぱりこの場合も、digコマンドでうまくデータを取得できなかったとき、 何もレスポンスがなく終わってしまうので、出力がなくて困った。

うまくいけばDNSの逆引き結果が返ってくる

$ dig +noall -x 74.125.204.121 +ans +nottlid
121.204.125.74.in-addr.arpa. IN PTR     ti-in-f121.1e100.net.
$

うまくいかないと音沙汰なし

$ dig +noall -x 74.125.204.255 +ans +nottlid
$

さて、うまくいかなかったときの処理をどうするか…

条件分岐処理したいけど・・・

条件分岐処理をうまくかけてあげれればいいんだろうけど、 わたくしの現在のshell scriptをつくる技量では難しそうなので、 とりあえず断念して、ExcelやらVimやらで後から成形処理するときに、 うまくエラー部分を抽出できるようにしてあげる戦法で行くことにした。

そんなわけでできたshell scriptは・・・

妥協に妥協を重ね突貫工事的に作ったので、マシンのリソースは使うわ、 ネットワークのリソースは使うわで、頻繁に使うとしたら実用性に欠けるけど… たまにしかやらないならとりあえずってとこか。

#!/bin/bash
for ADDRESS in `cat $1`
do
echo "IPADDRESS=$ADDRESS:rDNSlookup="
dig +noall -x $ADDRESS +ans +nottlid
echo ";:"
done

ということで、digコマンドの前後にechoでテキストを差し込んであげて、 digコマンドで何も出力されなくても、最低限検索したIPアドレスは記録されるようにしてみた。 1つのIPアドレスに対して1行にしたいので、この後テキストエディタで置換処理をしたりして成形。

ってなこで、一応ミッション完了なのでした。

本当はしたかったこと

実は逆引き対象のIPアドレスのリストには、かなりの数のダブりがあったりしたので、 重複している分は一回だけ、digして、すでにdigで結果を得ている部分は、 もう一度DNSに問い合わせをしないで、問い合わせ済みのデータを使う とかできたら、少しはネットワークリソースを使わずに済んだのな。 あと、処理も少しは早くなったろうに…

きっと条件分岐とかうまく使えばできるんだろうけど。 今後の課題です。


(2016/01/28追記) 3カ月経ってやっと本当はしたかったことに少し近づきました。

kitaeng.hateblo.jp