も
以下は
テクニック編
他の デバイスと 直接疎通できるか 確認する
> tailscale ping mydevicepong from mydevice (100.X.Y.Z) via DERP(tok) in 10mspong from mydevice (100.X.Y.Z) via DERP(tok) in 10mspong from mydevice (100.X.Y.Z) via [2001:db8::1]:41641 in 8ms
直接疎通できるまで
ファイアウォール等で tailnet内からの アクセスを 判別する
100.64.0.0/10
からの

トラブル編
/etc/resolv.conf
が 勝手に 書き換えられる
デフォルトのnameserver 100.100.100.100
に
tailscale up --accept-dns=false
と*.ts.net
の100.100.100.100
に
[upstream.0]...
[upstream.1]bootstrap_ip = "100.100.100.100"endpoint = "100.100.100.100"name = "Tailscale IPv4"timeout = 5000type = "legacy"ip_stack = "v4"
[listener.0]ip = "127.0.0.1"port = 53
[listener.0.policy]name = "IPv4"rules = [{ "*.ts.net" = ["upstream.1"] }] # *.ts.netの解決を100.100.100.100に委譲networks = [{ "network.0" = ["upstream.0"] }]
> drill @127.0.0.1 mydevice.tailxxxxx.ts.net;; ->>HEADER<<- opcode: QUERY, rcode: NOERROR, id: 5354;; flags: qr aa rd ra ; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0;; QUESTION SECTION:;; mydevice.tailxxxxx.ts.net. IN A
;; ANSWER SECTION:mydevice.tailxxxxx.ts.net. 52 IN A 100.X.Y.Z
;; AUTHORITY SECTION:
;; ADDITIONAL SECTION:
;; Query time: 0 msec;; SERVER: 127.0.0.1;; WHEN: Tue Aug 13 22:30:58 2024;; MSG SIZE rcvd: 55
ホスト名も
nameserver ::1nameserver 127.0.0.1search tailxxxxx.ts.net .
> ping -c3 mydevicePING mydevice.tailxxxxx.ts.net (100.X.Y.Z) 56(84) バイトのデータ64 バイト応答 送信元 100.X.Y.Z: icmp_seq=1 ttl=64 時間=8.38ミリ秒64 バイト応答 送信元 100.X.Y.Z: icmp_seq=2 ttl=64 時間=8.36ミリ秒64 バイト応答 送信元 100.X.Y.Z: icmp_seq=3 ttl=64 時間=8.15ミリ秒
--- mydevice.tailxxxxx.ts.net ping 統計 ---送信パケット数 3, 受信パケット数 3, 0% packet loss, time 2002msrtt min/avg/max/mdev = 8.152/8.296/8.383/0.102 ms
Tailscaleを 使っていると IPv6リンクローカルアドレスが 使えない
Linuxでtailscale0
)に、tailscale0
を
> ip route show table all | grep fe80::/64fe80::/64 dev tailscale0 proto kernel metric 256 pref medium # <= ここが問題fe80::/64 dev eth0 proto kernel metric 256 pref medium
したがって、
[Match]Name=tailscale0
[Network]KeepConfiguration=yesDHCP=noIPv6AcceptRA=noLinkLocalAddressing=no
[Link]RequiredForOnline=no
> ip route show table all | grep fe80::/64fe80::/64 dev eth0 proto kernel metric 256 pref medium
subnet内の 端末で Tailscaleを 動かすと、 経路が 冗長に なる
これは
状況と10.10.0.0/24
)10.10.0.2
)を--advertise-routes=10.10.0.0/24
)
この10.10.0.3
)に
問題は、10.10.0.4
)10.10.0.3
)と
> traceroute 10.10.0.3traceroute to 10.10.0.3 (10.10.0.3), 30 hops max, 60 byte packets 1 100.X.Y.Z (100.X.Y.Z) 19.593 ms 19.822 ms 21.156 ms # <= 冗長! 2 10.10.0.3 (10.10.0.3) 21.559 ms 22.790 ms 23.459 ms
これを
解決策1:subnet routerに/23
で 広告させる
tailscale up --advertise-routes=10.10.0.0/23
かなり/24
、/23
)が
解決策2:より 高い 優先度の ルールを 追加 (Linux)
Linuxでは
...[RoutingPolicyRule]To=10.10.0.0/24Table=mainPriority=5205
無事まともな
> traceroute 10.10.0.3traceroute to 10.10.0.3 (10.10.0.3), 30 hops max, 60 byte packets 1 10.10.0.3 (10.10.0.3) 1.167 ms 1.301 ms 1.145 ms
環境依存編
(OpenWRTなど) 記憶領域が 少ない 端末で 使う
古いルータなどで
やっている/usr/bin/tailscale
、/usr/bin/tailscaled
が
(Windows) 複数ユーザで 使う
Windowsの
脚注
-
ところで
この IP範囲は、 ISPが キャリアグレードNAT (?)を 行う際に 用いる IP範囲でもある。 したがって インターネット側と 接続されている デバイスの 場合、 ISPに よっては、 この 判別が 厳密に 機能しない 可能性も ある。 ↩ -
「WAN」と
書いてあるが、 この 端末 (OpenWRT)は 別の ルータの 配下に ぶら下がっている ため、 WAN側が 「LAN内」に なる。 ↩ -
二つの
ルールの 優先度は 同等なので、 起動順に よって 挙動が 変わる。 試しに この 状態から Tailscaleと systemd-networkdの デーモンを 再起動すると、 ルールの 順序が 替わってリンクローカルアドレスが 使える (LAN内の デバイスに アクセスできる)ようになり、 問題の 所在に 気づけた。 ↩ -
KeepConfiguration=yes
というのが ミソ。 これが ないと Tailscaleが 設定した 内容が systemd-networkdに 抹消されてしまう。 詳細は マニュアルを 参照。 ↩ -
Androidで
どうなるかは よく わからないが、 たぶん 問題ないのだろう。 ↩ -
具体的には
27MB以上の 空きが あれば よいらしい。 ↩