ASAHIネットがDS-Lite対応したので、 自宅の適当なLinuxルーターにて設定しようとして詰まったAFTR取得に関するメモ。
Linuxルーターを使ってる人向けのニッチなものだけど、情報として残しておく。
そもそもISP(ASAHIネット)側がどうやってAFTRを公開しているのか? どうやらDHCPv6の仕様にAFTRに関するものがあるらしい。 ただ、テストプログラムを作ってパケットを投げて応答を見たところ、どんなOptionリクエストを投げても固定値(DNS recursive nameserver/Domain Search List/Simple Network Time Protocol Server)しか帰ってこない…
もしかしてブラックボックスや固定値?と思ったが、どうやら日本独自の仕様があるらしい。
日本のIPv4 over IPv6の技術が複数あるので、それらの情報公開について仕様を策定してある模様。 仕様の初版は2020/08/13なので、対応ルーターが少ないのも納得。
仕様を見ればだいたいわかる。
DNSで 4over6.info
のTXTレコードを引く必要があるが、Stateless DHCPv6で取得できるDNSサーバーに対してクエリを投げる必要がある。
もちろん8.8.8.8
などのPublic DNSでも引けないし、ASAHIネットのIPv4 DNSサーバーでも情報は引けない。
自環境ではStateless DHCPv6を有効化せずにDNSサーバーはpublic DNSに投げているので、ASAHIネットのDNS情報を取得できていない。 適当にDHCPv6のInformation Request(DNS)を投げるプログラムを作ったので、これを使って情報を取得する。
# infreqv6 br0
xxxx:xxxx:xxxx:x::1
xxxx:xxxx:xxxx:x::2
※出力はサンプル
取得したDNSサーバーに対して、TXTレコードを取得する。
# dig 4over6.info TXT +short @xxxx:xxxx:xxxx:x::1
"v=v6mig-1 url=https://example.com/cpe/v1/config t=b"
※出力はサンプル
先ほど取得したURLに対して、IPv6にてリクエストを投げる。
TXTレコードに"t=a"が記載されている場合は、ISP側が自己署名証明書を使ってる可能性があるので、無視するオプション-k
をつけるなどする。
(※手元のASAHIネットの環境では、正規の証明書が使われていた)
必須のパラメーターがあり、適当に設定して送る。 将来的にルーター毎に出力を変えたりするのかもしれない。
# curl -6 "https://example.com/cpe/v1/config?vendorid=acde48-v6pc_swg_hgw&product=V6MIG-ROUTER&version=0_00&capability=dslite" > result.json
できあがったresult.jsonファイルは以下のような内容になっている。
{
"ttl": 61200,
"token": "xxxxxxxxxxxxxxxxx",
"service_name": "v6 コネクト",
"enabler_name": "v6 コネクト",
"dslite": {
"aftr": "dslite.example.com"
},
"order": [
"dslite"
]
}
これに含まれる"aftr"に書かれているホスト名を、最初に取得したDNSサーバーに対してAAAAレコードを引けば接続先のIPv6アドレスが得られる。
# dig dslite.example.com AAAA +short @xxxx:xxxx:xxxx:x::1
xxxx:xxxx:xxxx:x::3
仕様が公開されているおかげですんなり取得できた。
無事にAFTRを取れました、ありがとうございます。
自分のデバイスでは、gcc など入れ難かったので、別の方法で
DNS recursive nameserver の情報を取ってみました。
/tmp/dhcp.pcap を wireshark で開いたら見れます。