Sunday, April 5, 2015

ホスト名からASの情報を引き出したかった

最近ネットワーク絡みの話をすることが多くなった。そんな中、BGPとかの話が面白かったので色々と調べているうちに、ホスト名からAS(Autonomous System)を確認したいな~と思うようになり、今回のお話に至る。

ASの情報をどやって取るのか?

本来ならBGPルーターにアクセスできるような環境に居ないとASの情報にはアクセスできないような気がする。Tier 1 のASが持つBGPルーターだったら間違いなく全情報を格納しているらしいが…。日本絡みだとNTT Communications。

一般人がそんな環境にいるわけないのでどうするかというと、ASの情報を提供してくれるWebServiceを使うのが手っ取り早い。

  • cyclops
  • whoisコマンド
    • ここのwhoisサーバーはAS Numberまで出してくれる…!

とはいえブラウザ開くのも面倒だし、他者任せもなんだかな…と思っていたら、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.