ケータイのキャリアを WILLCOM に変えたついでに、 自宅のバックアップ回線も WILLCOM に変更した (メインの回線は Bフレッツ)。 マルチパック割引につられた (^^;) ため。 ケータイとの抱き合わせ割引でなくても フレッツより安い らしい。 普段はほとんど使わない (死活確認パケットを飛ばすだけ) バックアップ回線なので、 1円でも安いほうが助かる。
そして MNP が巷を賑わす昨今、なぜ MNP 対象外の WILLCOM かというと、 W-ZERO3[es] が 使いたかったから (^.^) であるが、 eメールの送受信と PHSへの通話が全て 定額料金に含まれるというのもうれしい。 おかげで一ヶ月の電話代が半額になった。
ウィルコムADSLサービスは、 アッカ・ネットワークスの ADSL サービスを使っていて、 アッカでは市販モデムを利用できるサービスは行なっていないという。 つまりアッカが(ウィルコムユーザ向けに) レンタルするモデムを使えということ。 それまで使っていたモデム (買い取り) が無駄になってしまうし、 このレンタルモデムはモデムといいつつルータ機能まで含んでいるので、 バックアップ回線として使いにくい機器だと困るなぁと躊躇したのも事実だが、 月額費用が 2000円ほど安くなる (モデムが買い取り可能ならもっと安くなるのに...) という誘惑には勝てず、乗り換えてしまった。
私が何のためにバックアップ回線を契約しているかというと、 メイン回線が落ちたときにも、 外部から自宅のサーバへログイン可能とするためである。 だから IP アドレスが固定割当てでないのであればダイナミックDNS などの 仕掛けを併用して、 外部からアクセスする際の IP アドレスが常に調べられなければならない。 反面、内部から外部へのアクセス (つまりいわゆる一般的なインターネットの利用法) には全くといっていいほど使用しないわけで、 普通の ADSLサービスの利用方法とは大きく異なる。 レンタルルータ込みのサービスだと、 提供側が想定する「標準的な」利用方法を「押し付けられる」リスクがあるわけで、 なるべくなら利用したくない、という思いがあった。 まあ、後述するようにそれは杞憂だったのであるが。
届いたレンタルモデム WARPSTAR Aterm WD735GV をいろいろいじっていると、 PPPoE パケットをスルーして、 ルータ機能を使わないことも可能であることがわかり一安心。 PPPoE の認証のとき必要となるログインID とパスワードも、 レンタルモデムから無事読み出すことができた。 というわけでしばらく (数日ほど) モデムとしてのみ使っていたのであるが、 レンタルモデムにルータ機能がついているのなら それを使いたくなるのが技術者のサガだろう。
ただし、外部からログイン可能、という条件だけは譲れない。 バックアップ回線としての唯一の存在意義だからだ。 それまで使っていたルータは、ダイナミックDNS サービスに対応していたので、 gcd.iobb.net を DNS で引けばルータの WAN 側の IP アドレスを 取得することができた。 今回のレンタルモデムには、少なくともマニュアルには、 WAN 側の IP アドレスを取得する方法は書かれていないし、 「クイック設定Web」インタフェースを見ても WAN 側の IP アドレスを取得できるページは見当たらない (「通信情報ログ」以外は)。
もちろん、このレンタルモデムを経由して外部にアクセスすれば、 WAN 側の IP アドレスが送信元アドレスとなるパケットが飛ぶので、 それをもとにダイナミックDNS に登録してくれるサービスがあれば いいのであるが、 そういったダイナミックDNS サービスを見つけるより、 WAN 側の IP アドレスを取得する方法を見つけるほうが早かった。
さてどうしたものか、と思って ダイナミックDNSサービス iobb.net のプロトコルを調べるためにダンプしておいた Aterm WD735GV との通信内容を眺めていると、 Aterm WD735GV が送信したマルチキャスト パケットを見つけた:
17:13:16.645897 IP (tos 0x0, ttl 4, id 2784, offset 0, flags [DF], length: 298) 192.168.1.251.1900 > 239.255.255.250.1900: [udp sum ok] UDP, length: 270 0x0000: 4500 012a 0ae0 4000 0411 b845 c0a8 01fb E..*..@....E.... 0x0010: efff fffa 076c 076c 0116 484b 4e4f 5449 .....l.l..HKNOTI 0x0020: 4659 202a 2048 5454 502f 312e 310d 0a48 FY.*.HTTP/1.1..H 0x0030: 4f53 543a 2032 3339 2e32 3535 2e32 3535 OST:.239.255.255 0x0040: 2e32 3530 3a31 3930 300d 0a4e 543a 2075 .250:1900..NT:.u 0x0050: 706e 703a 726f 6f74 6465 7669 6365 0d0a pnp:rootdevice.. 0x0060: 4e54 533a 2073 7364 703a 616c 6976 650d NTS:.ssdp:alive. 0x0070: 0a55 534e 3a20 7575 6964 3aXX XXXX XXXX .USN:.uuid:XXXXX 0x0080: XXXX XXXX XXXX XXXX XXXX XXXX 3a3a 7570 XXXXXXXXXXXX::up 0x0090: 6e70 3a72 6f6f 7464 6576 6963 650d 0a43 np:rootdevice..C 0x00a0: 4143 4845 2d43 4f4e 5452 4f4c 3a20 6d61 ACHE-CONTROL:.ma 0x00b0: 782d 6167 653d 3132 300d 0a4c 6f63 6174 x-age=120..Locat 0x00c0: 696f 6e3a 2068 7474 703a 2f2f 3139 322e ion:.http://192. 0x00d0: 3136 382e 312e 3235 313a 3238 3639 2f75 168.1.251:2869/u 0x00e0: 706e 702f 726f 6f74 6465 7669 6365 2e78 pnp/rootdevice.x 0x00f0: 6d6c 0d0a 5345 5256 4552 3a20 4947 442d ml..SERVER:.IGD- 0x0100: 4854 5450 2f31 2e31 2055 506e 502f 312e HTTP/1.1.UPnP/1. 0x0110: 3020 5550 6e50 2d44 6576 6963 652d 486f 0.UPnP-Device-Ho 0x0120: 7374 2f31 2e30 0d0a 0d0a st/1.0....
こんな、家庭用の安物ルータ (しかもモデムと称している) でさえ UPnP (Universal Plug and Play) をサポートしているような時代になったとは... シリアルケーブルでつないだ端末でルータ設定をしていたころが懐かしい... という感慨はサテオキ、 まずは 読みやすいように整形してみる (Universally Unique Identifier の部分は伏せ字)。
NOTIFY * HTTP/1.1 HOST: 239.255.255.250:1900 NT: upnp:rootdevice NTS: ssdp:alive USN: uuid:XXXXXXXXXXXXXXXXX::upnp:rootdevice CACHE-CONTROL: max-age=120 Location: http://192.168.1.251:2869/upnp/rootdevice.xml SERVER: IGD-HTTP/1.1 UPnP/1.0 UPnP-Device-Host/1.0
機器の詳細は、http://192.168.1.251:2869/upnp/rootdevice.xml を見よ、 と言っているのでアクセスしてみると、 レスポンス中に次のような記載がある:
<service> <serviceType>urn:schemas-upnp-org:service:WANPPPConnection:1</serviceType> <serviceId>urn:upnp-org:serviceId:WANPPPConn1</serviceId> <controlURL>/upnp/control/WANPPPConn1</controlURL> <eventSubURL>/upnp/event/WANPPPConn1</eventSubURL> <SCPDURL>/upnp/WANPPPConn1.xml</SCPDURL> </service>
実は UPnP を使うのはこれが初めてだったりする (^^;) のだが、 WANPPPConn1 という名称からしておそらくこれが「接続先1」を意味するのだろう。 サービスの詳細は、SCPDURL に書いてある URL を見ればよいのだろうと、 http://192.168.1.251:2869/upnp/WANPPPConn1.xml にアクセスしてみると、 GetExternalIPAddress というメソッドがあることが分かる:
<action> <name>GetExternalIPAddress</name> <argumentList> <argument> <name>NewExternalIPAddress</name> <direction>out</direction> <relatedStateVariable>ExternalIPAddress</relatedStateVariable> </argument> </argumentList> </action>
試しに呼び出してみる:
#!/usr/bin/perl use SOAP::Lite; my $soap = SOAP::Lite ->ns('urn:schemas-upnp-org:service:WANPPPConnection:1') ->proxy('http://192.168.1.251:2869/upnp/control/WANPPPConn1'); my $som = $soap->GetExternalIPAddress(); my $ip = $som->valueof('//GetExternalIPAddressResponse/NewExternalIPAddress'); print "$ip\n";
するとあっさり Aterm WD735GV の WAN 側 IP アドレスを取得できてしまった。
「use SOAP::Lite;」の部分を、 「use SOAP::Lite +trace => debug;」に変更すると、 http リクエストとレスポンスの内容を見ることができる。 これを真似して http リクエストを手で打ってみる (やはり、どんなプロトコルでも一度は手で打ってみないと... ^^;) と、こんな感じ:
% telnet 192.168.1.251 2869 Trying 192.168.1.251... Connected to 192.168.1.251. Escape character is '^]'. POST /upnp/control/WANPPPConn1 HTTP/1.1 Host: 192.168.1.251:2869 Accept: text/xml Accept: multipart/* Accept: application/soap Content-Length: 503 Content-Type: text/xml; charset=utf-8 SOAPAction: "urn:schemas-upnp-org:service:WANPPPConnection:1#GetExternalIPAddress" <?xml version="1.0" encoding="UTF-8"?> <soap:Envelope xmlns:namesp1="urn:schemas-upnp-org:service:WANPPPConnection:1" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" soap:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> <soap:Body> <namesp1:GetExternalIPAddress xsi:nil="true" /> </soap:Body> </soap:Envelope> HTTP/1.1 200 OK CONTENT-LENGTH: 423 CONTENT-TYPE: text/xml; charset="utf-8" SERVER: IGD-HTTP/1.1 UPnP/1.0 UPnP-Device-Host/1.0 EXT: <?xml version="1.0"?> <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/"> <SOAP-ENV:Body> <m:GetExternalIPAddressResponse xmlns:m="urn:schemas-upnp-org:service:WANPPPConnection:1"> <NewExternalIPAddress>222.147.27.89</NewExternalIPAddress> </m:GetExternalIPAddressResponse> </SOAP-ENV:Body> </SOAP-ENV:Envelope>
たかがルータの IP アドレスを取得するために、 これだけ沢山のデータをやり取りするのもどうかと思うが...
Atermの管理画面をwgetで取得してWAN側のIPを確認する方法もあります。
wget –http-user=admin –http-passwd=パスワード “http://192.168.1.251/info_main.html”
取得したhtmlからIPの抜き出しが必要になりますが…
Comment by らく — 2006年11月22日 @ 19:13
Aterm 系は LAN 側から telnet で入れたりします。
http://www.tatsuyoshi.net/toyota/tech/20061024/index.html
Comment by B2 — 2006年11月24日 @ 17:26