• PTR _services._dns-sd._udp.local.
  • A/AAAA [ソースアドレス].in-addr.arpa.

をやりたい。node 付属の dns で mdns クエリを行うとうまくいかなかった。mdns のライブラリを使うと以下のようになった。_services._dns-sd._udp.local. ひいたときにソースアドレスがなぜか取得できないので若干めんどうなことになっている……

//#!/usr/bin/env node

const mdns = require('mdns');

function getServiceWithBrowser(browser, timeout) {
	if (!timeout) timeout = 500;

	return new Promise(function (resolve, reject) {
		const ret = [];
		browser.on('serviceUp', function(service) {
			ret.push(service);
		});
		//browser.on('serviceDown', function(service) {
		//	console.log("service down: ", service);
		//});
		browser.start();
		setTimeout( () => {
			browser.stop();
			resolve(ret);
		}, timeout);
	});
}

function getAllServices(timeout) {
	return getServiceWithBrowser(mdns.browseThemAll(), timeout);
}

function getServiceForType(type, timeout) {
	return getServiceWithBrowser(mdns.createBrowser(type), timeout);
}

async function run () {
	const services = await getAllServices();
	const results = await Promise.all(services.map( (s) => getServiceForType(s.type)));
	const hosts = results.reduce(
		(r, i) => (
			i.forEach((i) => r.set(i.host, i.addresses)),
			r
		),
		new Map()
	);
	for (let [name, addresses] of hosts.entries()) {
		console.log(name);
		for (let address of addresses) {
			console.log("\t", address);
		}
	}
}

run();
  1. トップ
  2. tech
  3. LAN 内の mDNS に応答するホストを列挙したい

excite光をつかってたので、移行が楽な excite MEC光 という IPoE サービスにしてみました。IPv6 ネイティブかつ DS-Lite による IPv4 接続サービスです。

事前に調べてもさっぱりわからない点があったのでまずそれを検証しました。

ルーターの挙動

  • 貸与ルーター (Aterm WG1810HP) の挙動
    • LAN側は IPv6 ネイティブ接続されるのか? → される。ルーターがRA+DHCPv6 stateless をやってくれる。グローバルIPアドレスが割り当てされる。
    • LAN側の IPv4 アドレスはどうなるのか? → ルータで設定したプライベートIPアドレスがDHCPでくばられる。
    • これまで通りに IPv4 PPPoE セッションははれるのか?
      • レンタルルータだとそもそも設定がなくて貼れない。PPPoE 接続情報自体 excite からもらえない。

この Aterm WG1810HP(MF) は DS-Lite 対応品となっている。DS-Lite 対応ルーターなら他のものも利用可となっているが、このルーターは常に強制的にレンタルする必要がある。

強制レンタルはまぁ許せるけど、それならレンタル料金 (100円/月) を月額料金に含めて書けよと思う。

DS-Lite IPv4 で UPnP のポート解放はできるか

答: できない

DS-Lite では NAT が自宅内ルーターではなく VNE ゲートウェイ (AFTR) 側で行われる (CGN/キャリガグレードナット)ので、手動でポート解放というのが原理的に不可能。それでは UPnP には対応しているのか?という疑問

iijmio ひかりでも答えている。「IPoE接続サービスのDS-Lite方式でのIPv4サービスでは、UPnPによる外部ホストからお客様宅のコンピュータへの通信路確立は行えません。外部へのサービス公開が必要な場合、PPPoE接続を併用されるか、IPv6の利用をご検討ください。」

Mac

デュアルスタック

インターフェイスで IPv6 を有効にすればそれだけで IPv6 ネイティブで繋がるようになる。

なぜか設定でリンクローカルだけの割当になっている端末があったのが罠かった。

Android

デュアルスタック

ZenFone3 (Android 8.0.0)

無線LAN経由で IPv6 接続される。特に設定はなし。

PS4

IPv4 接続

NATタイプ: 2

Nintendo Switch

IPv4 接続

NAT タイプ: B

nasne

IPv4 接続

torne mobileアプリから自宅nasneへ直接接続する機能があるが、機能するか?

アプリから nasne 設定を開くと「通信モード」が表示される。これがNATの状況っぽい? これまでの PPPoE だと通信モードA だった。

IPoE/DS-Lite だとにした直後は通信モード Cで、視聴不可だったが、同一ネットワークから一度つないだら通信モードBになって見れるようになった。

  1. トップ
  2. tech
  3. IPv6 ネイティブ環境に移行 (IPoE + DS-Lite)

おおざっぱにいうと

  • 家庭内のルーター(B4)で IPv4 パケットを IPv6 にカプセル化 (IP IP tunnel)
  • IPv4 ネットワーク接続点 (AFTR) でカプセル化を解き、アドレス変換 (NAT) をして外にアクセスする

だけ。

細かいところで疑問点があったので RFC6333 を見てみた

AFTRのNATの挙動

RFC6333 の B.1.2. Translation Details あたりにAFTR のNATとしての挙動が書いてある。

  • B4 は IPv4 パケットを、AFTR 向け IPv6 パケットにする
  • AFTR は IPv6 パケットから IPv4 パケットをとりだす
  • AFTR はB4グローバルIPv6アドレス・プライベートIPv4アドレスと、グローバルIPv4アドレス・ポートなどをマッピングする
  • AFTR はパケットのIPv4ヘッダを書きかえて IPv4 ネットワークで送信する
  • AFTR はやってくるパケットの宛先グローバルIPアドレス・ポートをもとに、マッピングテーブルから送信すべき B4 IPv6 アドレス・プライベートIPv4アドレスなどを得る
  • AFTR はパケットのIPv4ヘッダを書きかえて、IPv6 パケットにして B4 へ送信する
  • B4 は IPv6 パケットから IPv4 パケットをとりだす
  • B4 は IPv4 パケットを LAN に送信する

NATテーブルは例は RFC6333に書いてあるので引用しておく。結局一番知りたいのはこれだった。

        +------------------------------------+--------------------+
        |         Softwire-Id/IPv4/Prot/Port | IPv4/Prot/Port     |
        +------------------------------------+--------------------+
        | 2001:db8:0:1::1/10.0.0.1/TCP/10000 | 192.0.2.1/TCP/5000 |
        +------------------------------------+--------------------+

            Dual-Stack Lite Carrier-Grade NAT Translation Table

B4側のプライベートIPv4アドレスは勝手に決めていいのか

だいたいいいけど、 DS-Lite では 192.0.0.0/29 が予約されているので、ルーターのLAN側のDHCPでこのレンジが払出されないようにしないとまずいっぽい。

DS-Lite ルーターがデフォルトで 192.168.10.0/24 とかになっているのはこのへんの事情なんだろう。

  1. トップ
  2. tech
  3. DS-Lite の挙動の理解

スペック

  • Wi-Fi は 802.11ac(2.4 GHz / 5 Ghz)1x2 MISO Wi-Fi
  • イーサネット (ACアダプタにある) は 100Mbps

MISO は Multi Input Single Output。ダウンロードだけ2本のストリームという意味っぽい?

802.11ac 最低だと1ストリームあたり86.7Mbpsなので、2本だと 173.4Mbps。実際 Chromecast Ultra がどこまで対応しているのか謎。

スペック的には実は Wi-Fi のほうが高いが、Wi-Fi は AP と接続している端末が増えるほど遅くなるのでなんともいえない。専用の AP を立てられて、電波が空いてるなら Wi-Fi のほうが早い可能性がある。

ちなみにうちでは有線LAN接続してる。

  • 既存のインターフェイスを妨げない
    • 今まで使えるものはそのままにする。アクチュエーターが既存の操作の邪魔をしないこと
    • 「生活」に持ちこむ学習コストを最小限にする。少しずつ便利にする
  • 必要ないならインターフェイスを変えない
    • 今までと似た体験にする。アフォーダンス (形の意味) を変えない
    • 必要がないならインターフェイスを追加しない (ゼロクリックを動くことを目指す)
  • それ手でやればよくない?
    • 意味がないことを自動化しても意味がない。家族にも便利であること

インターフェイスの罠としては「定期的に音声で通知する」みたいなのは意外と使えない。というのも、人間だんだん慣れてきて、同じ音が定期的に鳴っていても聞こえなくなるため。視覚に訴えるほうがいいのかも?

  1. トップ
  2. tech
  3. おうちハックで必要なこと