Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save lambdalisue/ef78bade10890e754c161220f9f2fcec to your computer and use it in GitHub Desktop.
Save lambdalisue/ef78bade10890e754c161220f9f2fcec to your computer and use it in GitHub Desktop.
ASAHIネットのDS-Liteの終端(AFTR)を取得するメモ

ASAHIネットのDS-Liteの終端(AFTR)を取得する

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なので、対応ルーターが少ないのも納得。

手順

仕様を見ればだいたいわかる。

Stateless DHCPv6 でDNSの情報を取得

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
 ※出力はサンプル

4over6.info のTXTレコードを取得

取得した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に対してGETリクエストを投げる

先ほど取得したURLに対して、リクエストを投げる。

TXTレコードに"t=a"が記載されている場合は、ISP側が自己署名証明書を使ってる可能性があるので、無視するオプション-kをつけるなどする。 (※手元のASAHIネットの環境では、正規の証明書が使われていた)

必須のパラメーターがあり、適当に設定して送る。 将来的にルーター毎に出力を変えたりするのかもしれない。

 # curl "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ホスト名のAAAAレコード取得

これに含まれる"aftr"に書かれているホスト名を、最初に取得したDNSサーバーに対してAAAAレコードを引けば接続先のIPv6アドレスが得られる。

 # dig dslite.example.com AAAA +short @xxxx:xxxx:xxxx:x::1
 xxxx:xxxx:xxxx:x::3

まとめ

仕様が公開されているおかげですんなり取得できた。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment