最近ネットワーク絡みの話をすることが多くなった。そんな中、BGPとかの話が面白かったので色々と調べているうちに、ホスト名からAS(Autonomous System)を確認したいな~と思うようになり、今回のお話に至る。
ASの情報をどやって取るのか?
本来ならBGPルーターにアクセスできるような環境に居ないとASの情報にはアクセスできないような気がする。Tier 1 のASが持つBGPルーターだったら間違いなく全情報を格納しているらしいが…。日本絡みだとNTT Communications。
一般人がそんな環境にいるわけないのでどうするかというと、ASの情報を提供してくれるWebServiceを使うのが手っ取り早い。
とはいえブラウザ開くのも面倒だし、他者任せもなんだかな…と思っていたら、IP-ASのデータベースを公開してくれているサイトを見つけた。
http://dev.maxmind.com/geoip/legacy/geolite/
リアルタイムじゃなくてある時点のスナップショットだけど、別に今の情報じゃなくても構わないで問題なし。上のデータベースを読み込んでくれるnode-maxmindというnode.jsのモジュールがあったので、こいつを使って簡単なスクリプトを書くことにした!
スクリプト
IPではなくホスト名からAS Numberを調べられるようにするぞ。
aslookup.coffee
dns = require('dns')
maxmind = require('maxmind')
maxmind.init('GeoIPASNum.dat')
aslookup = (hostname) ->
dns.lookup(hostname, (err, addresses, family) ->
#console.log('err:', err)
org = maxmind.getOrganization(addresses)
console.log('hostname:', hostname)
console.log('addresses:', addresses)
console.log('orgnization:', org)
return
)
module.exports = aslookup
シンプルって素晴らしい!!これをjsに変換して、またもcoffee scriptから呼び出せば完成なり。
# .jsにコンパイル
$ coffee -bc aslookup.coffee
サンプルコード
aslookup = require('./aslookup')
aslookup('stackedit.io')
aslookup('twitter.com')
aslookup('www.niconicovideo.jp')
実行結果
hostname: stackedit.io
addresses: 54.173.194.190
orgnization: AS14618 Amazon.com, Inc.
hostname: twitter.com
addresses: 199.59.148.82
orgnization: AS13414 Twitter Inc.
hostname: www.niconicovideo.jp
addresses: 210.253.127.207
orgnization: AS7506 GMO Internet,Inc
非同期処理だから出力順が変わるのは仕様…!(めんどうくさかったのだ)。
- stackeditはAWSっぽいね。
- twitterとニコニコは自分のASを持っているみたいだ。
Written with StackEdit.