きゃらりこ日誌

自宅内からグローバルアドレスを取得する方法を考えてみただけ

最近、自宅内にプライベート用のサーバを立てて遊んでいるんですが、そろそろ外出先からのアクセスできるようにしようかということで、DDNSを導入することにしました。
以前、DD-WRTを入れて遊んでたルータにDDNSのIPアドレス更新用シェルスクリプトを組み込んで遊んでいたのを思い出し、それを流用しようとしたのですが当時のメモが見当たらない&実機を引っ張り出してスクリプトを確認するのが面倒くさかったので、改めて作ることに。
さて、どうやってグローバルIPアドレスを取得方法しようか?となったわけですが、いくつか手段を考えてみました。

1. 外部ウェブサービスから取得
DDNSサービス提供元では、アクセス元のIPアドレスを返してくれるCGIを、利用者向けに提供しているので、これをwgetするのが簡単&確実です。
Windows用のDDNSクライアント DiCEも、この仕組みで動いてます。
公式で提供していないときは、どこかのDDNSサービス用のCGIをこっそり使わせてもらうって手もありますが……
固定IPを持ってるレンタルサーバに自分専用のCGIを設置するって方法が妥当ですね。

2. Tracerouteから取得
Tracerouteの出力の中にグローバルIPアドレスが出てくるので、これを使えば楽です。
またTracerouteの相手先は実在する外部サーバを指定します。
相手先の負荷が気になるなら(ごく僅なので気にしなくてもいいかも)、大量のアクセスをさばくのはお手の物で、安定性も非常に高いDNSサーバとかNTPサーバに。
ちなみにTracerouteは通信経路にある各ネットワーク機器に対して強制的にICMP Time Exceedを出させることで通信経路の機器の情報を取得しているため、TTLを制限してやれば外部ネットワーク機器との無駄なやりとりは減ると思います。

3. ルータの設定画面から取得
外部へのネットワーク負荷を極限まで減らすには、これが一番。
しかし管理画面に入るためにはパスワードがかけられていたり、またスクレイピングが面倒だったり。
またSSHやTelnetでログインすると、ログイン後の画面にグローバルIPを表示してくれるルータもあるようですが、私が使用しているルータではログインパスワードは非公開なので無理でした。

4. メールのメールヘッダから取得
昔、DDNSを使わずに自宅のグローバルアドレスを知ろうと画策していた頃、DVD/HDDレコーダのメール録画予約機能を利用して確認していたことを思い出しました。
当時使っていた東芝のレコーダは、録画予約やHDDの残り容量をメールで問い合わせると、1時間に1回返信してくれるという機能があり、返信メールのメールヘッダには送信元のグローバルアドレスが書かれるため、そこから自宅のグローバルアドレスを読み取っていました。
問題は外部のメールサーバを使うことになるため安定稼働が保証できないこと、更新周期が1時間に1回になること、手間をかけすぎているということ。
こんなまどろっこしい方法は、他に取る手段がなくなった時くらいしか使い道がないです。

ということで、一番簡単な 1.の方法を取ることに。