要約
- macOSは、IPv4よりIPv6を優先する
- IPv6が「使えそうだが実際は壊れている」環境だと、通信不能になる
- IPv6を「リンクローカルのみ」に変更すると、安定する
- DNS手動設定は、切り分けと安定性向上に有効
- 再起動直後だけ繋がる症状は、IPv6切り替えが原因の可能性がある
はじめに
個人のMacでインターネット接続ができなくなりました。
Wi-Fi・有線どちらも「接続済み」と表示されるのに、Webページは開かない。
再起動をすると、一瞬つながり、その後すぐに切れるという症状です。
同じネットワークに接続している別のPCは正常だったため、
回線やルーターではなく、Mac側の問題だと判断しました。
この記事では、
- 実際に行った解決方法
- DNSの仕組みと役割
- IPv4 / IPv6の違いと、今回なぜ問題になったのか
を、体験ベースでまとめます。
今回の解決方法
今回の原因として考えられるのは、IPv6の自動構成による通信経路の不整合でした。
実施した設定変更
- IPv6を「リンクローカルのみ」に変更
- DNSを手動で指定(1.1.1.1 / 8.8.8.8)
これにより通信は安定し、再起動後も問題は再発していません。
接続が安定した後、IPv6自動構成に戻しても、繋がるようになりました。
(一時的な問題だったのかもしれません)
*追記
DNSを指定(1.1.1.1 / 8.8.8.8)にすると、
GitHubなど一部のサイトのみ接続できなくなりました。
使用している回線によってはNGみたいです。
これ以降の文章は、備忘録として書き残します。
なぜ「接続済み」なのに繋がらなかったのか
macOSでは、IPv4とIPv6の両方が利用可能な場合、IPv6を優先して通信します。
今回の環境では、
- IPv6アドレスは割り当てられている
- しかし、IPv6の外部通信経路が正常に機能していない
という状態だった可能性があります。
その結果、
- ネットワーク設定:接続済み
- 実際の通信:IPv6経由で失敗
という食い違いが発生していました。
再起動直後だけ一瞬つながったのは、
- 起動直後はIPv4で通信 → IPv6が有効化 → 切り替わった瞬間に失敗
という挙動によるものと認識しています。
起動直後
[ Mac ] ---- IPv4 ----> OK
数秒後
[ Mac ] ---- IPv6 ----X--> 通信不可
DNSとは
DNS(Domain Name System)は、
ドメイン名とIPアドレスを対応付ける分散型データベースです。
DNSの役割
- 人間は
example.comのような名前を使う - ネットワーク通信は IPアドレス(IPv4 / IPv6)で行われる
DNSは、この
「名前 → IPアドレス」変換(名前解決) を担います。
[ ブラウザ ]
|
| example.com ?
v
[ DNSサーバ ]
|
| 93.184.216.34
v
[ Webサーバ ]
実際のDNS問い合わせの流れ(簡略)
- ブラウザが
example.comを解決しようとする - OSが設定されているDNSサーバへ問い合わせ
- DNSサーバが対応するIPアドレスを返す
- そのIPアドレスへ通信を開始
DNSが正しく動作しない場合、
IP通信自体は正常でも、Webサイトは開けません。
DNSを手動設定した意味
通常、DNSは以下から自動設定されます。
- ルーター
- 回線事業者(ISP)
しかし、ISP提供DNSは、
- IPv6対応が不完全
- キャッシュ不整合
- 応答遅延
を起こす可能性があります。
今回設定した
-
1.1.1.1(Cloudflare) -
8.8.8.8(Google)
は、グローバルAnycast構成で可用性が高く、IPv6対応も安定しています。
これは、
「名前解決を信頼できる外部DNSに明示的に任せる」
という設定変更です。
グローバルAnycast構成とは
ネットワークの世界には、アドレスの種類が4つあります。
- Unicast :1対1(普通のサーバ)
- Broadcast:1対多(IPv4のみ、IPv6では廃止)
- Multicast:1対多(動画配信など)
- Anycast :1対“最適な1”
AnycastのDNS(Cloudflare / Google)
1.1.1.1
├ 東京
├ 大阪
├ シンガポール
├ ロンドン
├ ニューヨーク
└ …世界中に同じIP
- IPは同じ
- 中身(実体)は世界中に分散
- 「一番近くて、今生きてる場所」に自動的にルーティングする
なぜ可用性が高いのか
- サーバが落ちてもIPは生きてる(1つが死んでも、自動で別の場所へ)
- DDoSに異常に強い(1拠点が潰れても大丈夫)
- ISP障害に巻き込まれにくい(別経路に逃げられる)
IPv4 / IPv6とは何か
どちらも インターネット上で通信相手を識別するためのアドレス体系です。
IPv4
- 32bitアドレス
- 例:
192.168.1.1 - 約43億個のアドレス空間
- NAT前提の運用が一般的
IPv6
- 128bitアドレス
- 例:
2001:db8::1 - 事実上無限に近いアドレス数
- NAT不要を前提とした設計
今回IPv6が問題になった理由
macOSは仕様として、
- IPv6が利用可能と判断されると、IPv4よりIPv6を優先する
今回のように、
- IPv6アドレスは取得できる
- しかしIPv6経路が途中で破綻している
という状態では、
IPv6優先が裏目に出て通信不能になります。
正常
[ Mac ] ---- IPv4 ----> [ Internet ]
破綻
[ Mac ] ---- IPv6 -X--> [ Internet ]
「リンクローカルのみ」にした意味
IPv6を「リンクローカルのみ」に設定すると、
- LAN内(fe80::/10)のIPv6通信のみ有効
- インターネット通信ではIPv6を使用しない
という状態になります。
LAN内通信
[ Mac ] ---- IPv6 (fe80::) ----> OK
インターネット
[ Mac ] ---- IPv4 ----> OK
結果として、
インターネット通信はIPv4のみを使用
となり、通信が可能になります。
調べた感じでは、個人利用で実用上のデメリットはほぼない認識です。
なぜDNS変更だけでは直らなかったのか
DNSは「宛先を調べる仕組み」であり、
通信経路そのものを修復するものではありません。
今回の問題は、
- 宛先は正しく分かっている
- そこへ至るIPv6の経路が壊れている
状態だったため、
- DNS変更:効果なし
- IPv6制御:解決
という結果になりました。
次は、エンジニアらしく解決しよう
今回は、AIに相談しながら先述の方法で解決しました。
今後は、同様の不具合が発生した時に、まずは検証しようと思いました。
ifconfig:今の「自分の状態」を見る
ifconfig
- Macが今どんなIPアドレスを持っているか
- IPv4 / IPv6 が 割り当てられているかどうか
-
inet→ IPv4アドレス -
inet6→ IPv6アドレス -
inet6 fe80::xxxx
→ リンクローカルIPv6(LAN内専用) -
inet6 2400:xxxx や 2001:xxxx
→ グローバルIPv6(インターネット用)
netstat -rn:どの経路を通る予定かを見る
netstat -rn
- 通信の行き先ルール(ルーティングテーブル)
-
default(IPv4のデフォルトルート) -
::/0(IPv6のデフォルトルート) -
::/0が存在する
→ IPv6で通信しようとしている
ping6:IPv6で通信できるか試す
ping6 google.com
- IPv6通信が実際に成功するか
- 応答が返る
-> IPv6は正常
ping 8.8.8.8
上記が成功の場合 → IPv4は正常
まとめ
- macOSで「接続済みなのに通信不可」は、IPv6の不具合の可能性あり
- IPv6自動構成は、環境次第で不安定になる
- DNS手動設定は、安定性と切り分けに有効
同じ症状で困っている人の助けになれば幸いです。