将来の自分への備忘録、及び同じ症状に苦しむ方向けに公開。
結論
- Rakuten Mobile 5G 回線を使用していると、ブラウジング中に
net::ERR_CONNECTION_RESETが頻発することがある - 原因は Rakuten Mobile のネットワーク内にある中間装置 (BIG-IP と思われる) が TCP 接続に RST を注入しているためだと考えられる
- VPN (WireGuard など) を使用することで回避できる
症状
- スピードテストは正常 (高速)
- Web ページの読み込みが遅い、または失敗する
- Chrome 開発者ツールで
net::ERR_CONNECTION_RESETが頻発 - 特定のサイトではなくランダムに発生
- MTU を調整しても完全には解決しない
推定原因
tcpdump で RST パケットをキャプチャすると、以下のようなパケットが観測される:
$ tcpdump -i eth0 -n 'tcp[tcpflags] & (tcp-rst) != 0' -v
...
172.217.213.100.443 > 192.168.x.x.58932: Flags [R.], ... length 46 [RST+ BIG-IP: [0x2664c65:2574] No fl]
142.250.199.46.443 > 192.168.x.x.58661: Flags [R.], ... length 46 [RST+ BIG-IP: [0x2664c65:2574] No fl]
通常の TCP RST は length 0 だが、このパケットは length 46 で BIG-IP: ... という文字列を含んでいる。
Google の複数の IP アドレスから同一のシグネチャを持つ RST が来ていることから、Google ではなく経路上の中間装置が RST を注入していると考えられる。
[PC] → [ルーター] → [Rakuten 5G] → [CGNAT/DPI (BIG-IP?)] → [Internet] → [Google]
↑
ここで RST が注入されていると推測
(送信元 IP を Google に偽装)
解決策
VPN (WireGuard) を使用することにした。中間装置は TCP ヘッダを解析できなくなるため、 RST を注入できなくなる。
[PC] → [ルーター] → [Rakuten 5G] → [中間装置] → [Internet] → [VPN Server]
↑
UDP でカプセル化されているため
TCP セッションが見えない
調査の詳細
以下、原因特定に至るまでの調査過程を記録しておく。
MTU 問題の疑い (初期仮説)
最初は MTU 問題を疑った。Path MTU Discovery テストを実施:
# MTU 1500 でテスト → 失敗
$ ping -D -s 1472 google.com -c 5
556 bytes from xxx.xxx.xxx.xxx: frag needed and DF set (MTU 1440)
# MTU 1400 でテスト → 失敗
$ ping -D -s 1372 google.com -c 5
36 bytes from xxx.xxx.xxx.xxx: frag needed and DF set (MTU 1380)
# MTU 1300 でテスト → 成功
$ ping -D -s 1272 google.com -c 5
5 packets transmitted, 5 packets received, 0.0% packet loss
経路上の実効 Path MTU は 1380 だった。
クライアント側の MTU を調整:
# Linux
sudo ip link set eth0 mtu 1340
# macOS
sudo ifconfig en0 mtu 1340
# Windows (管理者権限の PowerShell)
netsh interface ipv4 set subinterface "イーサネット" mtu=1340 store=persistent
ブラウジングは改善したが、ERR_CONNECTION_RESET は継続した。
ルーターで MSS Clamping を設定
ルーター側で TCP MSS Clamping を設定:
iptables -t mangle -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1340
tcpdump で確認すると MSS は正しく適用されていた:
$ tcpdump -i <wan_interface> -n 'tcp[tcpflags] & (tcp-syn) != 0' -v
192.168.x.x.12345 > 160.251.209.90.25252: ... options [mss 1340, ...]
しかし、ERR_CONNECTION_RESET は継続。この時点で MTU/MSS 問題ではないことがわかった。
RST パケットの調査
RST パケットをキャプチャ:
tcpdump -i <wan_interface> -n 'tcp[tcpflags] & (tcp-rst) != 0' -v
結果は前述の通り、BIG-IP のシグネチャを含む RST が観測された。
診断に使用したコマンド
# MTU テスト (DF フラグ付き ping)
ping -D -s 1472 google.com -c 5
# TCP SYN パケットの MSS 確認
tcpdump -i <interface> -n 'tcp[tcpflags] & (tcp-syn) != 0' -v
# TCP RST パケットのキャプチャ
tcpdump -i <interface> -n 'tcp[tcpflags] & (tcp-rst) != 0' -v
# MSS Clamping の設定 (Linux ルーター)
iptables -t mangle -I FORWARD 1 -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --set-mss 1340
その他メモ
- 常識的な使い方をしている方だと思うが、こんな頻繁に RST が出るのは正しい挙動?
- パケットの “No fl” == “No flow found” の断片?
- キャリアグレード NAT のセッション管理コケてるとか?