Skip to content

Instantly share code, notes, and snippets.

@stkchp
Last active April 8, 2024 05:31
Show Gist options
  • Star 30 You must be signed in to star a gist
  • Fork 4 You must be signed in to fork a gist
  • Save stkchp/4daea9158439c32d7a70a255d51e568b to your computer and use it in GitHub Desktop.
Save stkchp/4daea9158439c32d7a70a255d51e568b 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に対して、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ホスト名のAAAAレコード取得

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

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

まとめ

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

@axot
Copy link

axot commented Dec 3, 2022

無事にAFTRを取れました、ありがとうございます。
自分のデバイスでは、gcc など入れ難かったので、別の方法で
DNS recursive nameserver の情報を取ってみました。

$ cat /tmp/dhcp6c.conf
interface igb0 {
	information-only;
	request domain-name-servers;
	request domain-name;
};

$ sudo /usr/local/sbin/dhcp6c -f -D -d -c /tmp/dhcp6c.conf igb0

$ sudo tcpdump -w /tmp/dhcp.pcap -X -nnn -i igb0 port 547 and ip6

/tmp/dhcp.pcap を wireshark で開いたら見れます。

@sibradzic
Copy link

sibradzic commented Feb 25, 2023

root@OpenWrt:~# nslookup -type=txt 4over6.info $(sed -n 's|^nameserver \([0-9]\{4\}\)|\1|p' /tmp/resolv.conf.d/resolv.conf.auto | head -n1) | sed -n 's|^4over6.info.*url=\(.*\) .*|\1|p'
https://prod.v6mig.v6connect.net/cpe/v1/config

root@OpenWrt:~# wget -6 "https://prod.v6mig.v6connect.net/cpe/v1/config?vendorid=acde48-v6pc_swg_hgw&product=V6MIG-ROUTER&version=0_00&capability=map_e,dslite,lw4o6,hubspoke" -q -O - | jsonfilter -e '@.dsli
te.aftr'
dslite.v6connect.net

@enezmmt
Copy link

enezmmt commented Jul 13, 2023

استثمار اموال

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