現象について
discordのテキストチャットがいつまで経っても読み込めない。
VCには入れるのに。でも必ず閲覧できないわけでもない。
たまに読み込みに成功することもある。
半年前ぐらいからちょいちょい遭遇するようになっていた。

現象再現時のスクショ。(IPv4アドレスとRay IDは伏せています。)
discord.comの公式サイトより、アプリのダウンロードページへ行くと、このようなエラーページが出る。
短絡的な原因
エラーページから分かる通り、discordはCloudflareでホストされており、
Error 1015 であることから、アクセス過多による一時的なIP BAN処置をされていることがわかる。
なぜ?
もちろんBANされるほどのリクエストを送った記憶は無い。
うちはBIGLOBEのv6オプションを契約しています。
v6オプションはMAP-E方式によるIPoE接続なのですが、
こいつは複数の契約者でグローバルIPv4アドレスを共有しています。
恐らく、私に割り当てられた共有IPアドレスを使用する契約者全員がオタクで、
全員が夜な夜なdiscordにアクセスすることで、IPがBANされる。
ありえそうな話です。
また、公式サイト、テキストチャットの両者でBANされていることから、
それらは同じドメインを使用していることが予想できます。
RFC 7597 - Mapping of Address and Port with Encapsulation (MAP-E) 日本語訳
によれば、クライアントに割り当てるIDはポートセットID(PSID)と呼ばれ、
1oct確保されているため、実運用上の人数はわかりませんが、おそらく最大255人で共有することが可能であることが読み取れます。
解決策
主に2つあります。
IPv4アドレスを変える
手っ取り早いのはこれです。ルータの電源を落とし、コーヒーを一杯飲んで、電源を入れて再起動すれば、降ってくるグローバルIPアドレスは変わっていて、IP BANを回避できる「かも」
IPv6でアクセスする
共有しているIPv4アドレスが悪いなら、IPv6アドレスでアクセスすればいいじゃない。
今回これで解決してみましょう。
discord.comにIPv6でアクセスしてみる
discordで使用されるドメインは5種類あって、詳しくは調べていないですが、
| ドメイン | 主な用途例 |
|---|---|
| discord.com. | 公式サイト、テキストチャット |
| discordapp.com. | アプリケーション上のメディア |
| discordapp.net. | アプリケーション上のメディア |
| discord.gg. | サーバ招待リンク |
| discord.media. | 画像 |
のように、いくつか用途ごとに分かれています。
今回は、テキストチャットが問題になっているため、discord.comにのみ焦点を当てます。
そもそもネイティブにIPv6でアクセスできるかDNSをdigって調べてみる。
>Resolve-DnsName -Name discord.com
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
discord.com A 300 Answer 162.159.138.232
discord.com A 300 Answer 162.159.128.233
discord.com A 300 Answer 162.159.135.232
discord.com A 300 Answer 162.159.137.232
discord.com A 300 Answer 162.159.136.232
いや、IPv6非対応かよ。
ここで物語終了かと思ったが、Cloudflare上で動作していることから、IPv6アドレスの割り当てはあるらしいとの情報を見つけたので、それでアクセスしてみる。
2606:4700::/96の接頭辞に、IPv4アドレスのdecimalをhexに変換した接尾辞を持つらしい。
これに習ってdiscord.comのIPv4アドレスからIPv6アドレスへの変換を行ったテーブルは以下となる。
| IPv4 | IPv6 |
|---|---|
| 162.159.128.233 | 2606:4700::a29f:80e9 |
| 162.159.135.232 | 2606:4700::a29f:87e8 |
| 162.159.136.232 | 2606:4700::a29f:88e8 |
| 162.159.137.232 | 2606:4700::a29f:89e8 |
| 162.159.138.232 | 2606:4700::a29f:8ae8 |
reddit : Discord works on IPv6 if you force it : r/ipv6
Discord works on IPv6 if you force it : r/ipv6
これを踏まえて、自身のDNSサーバに以下のルールを追加します。
- discord.comの問い合わせの応答には上記変換によって求めたIPv6アドレスを回答する
> Resolve-DnsName -Name discord.com
Name Type TTL Section IPAddress
---- ---- --- ------- ---------
discord.com AAAA 1 Answer 2606:4700::a29f:8ae8
これで、IPv6で通信する準備はできました。
(おま環) win11でIPv6通信ができない
IPv6接続可否サイトを確認しに行くと通信できていない。
一応、ルータとの疎通確認もしてみる。
> ping -6 -t (ルータのIPv6リンクローカルアドレス)
(ルータのIPv6リンクローカルアドレス) に ping を送信しています 32 バイトのデータ:
(ルータのIPv6リンクローカルアドレス) からの応答: 時間 <1ms
(ルータのIPv6リンクローカルアドレス) からの応答: 時間 <1ms
要求がタイムアウトしました。
要求がタイムアウトしました。
要求がタイムアウトしました。
(ルータのIPv6リンクローカルアドレス) からの応答: 時間 <1ms
(ルータのIPv6リンクローカルアドレス) からの応答: 時間 <1ms
(ルータのIPv6リンクローカルアドレス) からの応答: 時間 <1ms
(ルータのIPv6リンクローカルアドレス) からの応答: 時間 <1ms
...
切断と接続を交互に繰り返しており、
IPv6の近隣探索要請ができていない挙動を見せている。
おま環だが、ファイアウォールからなぜか近隣探索要請(ICMPv6)の受信許可設定が消えていた。
以下を追加することで

コア ネットワーク - 近隣探索要請 (ICMPv6 受信) 受信許可にしよう
ググると、ICMPエコー要求もファイアウォールから消えていたという人もいるようなので、似たような現象の人はそこも確認してみると良いかも。
動作確認
無事、テキストが表示されるようになりました。

おま環でやや回り道しましたが、直せてよかったです。
解決策のヒントをくださった某氏、ありがとうございました。
余談
実は近隣探索要請の設定をやるだけで解決したんじゃないか、と薄々思っている。
この現象にあっている人、実はそんなにいないんじゃないか...
ま、まぁ色々知れる良い機会ではあったので良しとしようではないか。
ブラウザ等のアプリケーションは基本、IPv6通信を優先するよう(DNSフォールバックに依る)だが、YAMAHAルータのデフォルトはファームウェアのアップロード、ダウンロード以外はIPv4優先らしい。
24.16 DNS フォールバック動作をルーター全体で統一するか否かの設定
これは、普段フロント界隈に属する人とかにとってはトラップだよな。と思う。
今回IPの通信TYPEが何であるかの判断に使用した拡張機能はこれ
IPvFoo - Chrome ウェブストア
WireSharkで確認しましたが、テキストチャットはHTTPS
VC,画面共有はWebRTCを使用しているようでした。
参考
Windows 11 で IPv6 でのインターネット接続ができなくなる | ブチザッキ
Discord works on IPv6 if you force it : r/ipv6
24.16 DNS フォールバック動作をルーター全体で統一するか否かの設定
Unboundでお手軽DNSシンクホール - 俺の外付けHDD


