自分の環境から外に出ていくときのグローバルIPアドレス(外向きIPアドレス、外部IPアドレス)を取得する方法として外部のWEB サービスを利用するやり方がよく紹介されている。
例えばこんなのだ。
curl http://httpbin.org/ip
httpbin.orgはIPアドレスをjsonで取れるので、WEBサービスは構成が替わりやすくてスクレイピングの処理を書くのがだるいというデメリットもあまりない。
しかしIPアドレスを取得するもっとも安定した方法といえばDNSである。
DNSサーバはWEBサーバよりも可用性が高くなるように設計されているので、より安定して使える。レスポンスも早い。
それにDNSプロトコルはHTTPに比べれば出力フォーマットがかなり狭い範囲に標準化されているので、IPを取るだけならこちらのほうが扱いやすい。
DNSから自分の環境から外に出ていくときのグローバルIPを取得するにはdigコマンドを使う。
次のコマンドはopendns.comのリゾルバに問い合わせている。opendns.comにmyip.opendns.comを問い合わせると自分の外向きIPアドレスが返ってくる。
dig myip.opendns.com @resolver1.opendns.com
... 出力省略 ...
;; ANSWER SECTION:
myip.opendns.com. 0 IN A 123.123.123.123
... 出力省略 ...
IPアドレスだけ取りたいときは+shortを付ける。
dig +short myip.opendns.com @resolver1.opendns.com
123.123.123.123
GoogleのDNSでも同じことができるが、ドメインではなくTXTレコードを使って問い合わせる。
dig -t txt o-o.myaddr.l.google.com @8.8.8.8
... 出力省略 ...
;; ANSWER SECTION:
myip.opendns.com. 0 IN A 123.123.123.123
... 出力省略 ...
こちらも+shortで短く出来る。
dig +short -t txt o-o.myaddr.l.google.com @8.8.8.8
"123.123.123.123"
"edns0-client-subnet 123.123.123.123/32"
タイプする文字数はどちらも変わらないけど、opendns.comのほうが覚えやすいし+sohrtの出力がスッキリしている。