解決編はこちら → WireGuard 経由で UNEXT が見れない問題を解決した話 | 怠惰技術ブログ
概要
WireGuard 経由の WiFi で UNEXT の VOD だけ見れないという問題を調査した。症状・仮説・コマンド・結果の思考トレースを残しておく。
最初の症状整理
- UNEXT の VOD が見れない(くるくるのままタイムアウト)
- 生配信は見れる
- YouTube・Prime Video は問題なし
この時点での仮説:
- MTU の問題(大きいパケットが通らない)
- QUIC(UDP)の問題
- DRM 認証の問題
- VPS 側のブロック
Step 1: MTU を疑う
WireGuard はオーバーヘッドがあるので MTU が小さくなる。大きいパケットが詰まってないか確認。
ping -M do -s 1400 8.8.8.8
結果:
From 192.168.x.254 icmp_seq=1 Frag needed and DF set (mtu = 1420)
ping: sendmsg: Message too long
1400 バイトは通らない。 1300 バイトは通った。MTU の壁が確認できた。
TCPMSS clamping を確認
sudo iptables -t mangle -L FORWARD -n -v
TCPMSS tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp flags:0x06/0x02 TCPMSS clamp to PMTU
すでに設定済みだった。TCP はケアされている。
Step 2: QUIC(UDP)を疑う
TCPMSS clamping は TCP にしか効かない。UNEXT が QUIC(HTTP/3)を使っていたら効果がない。
sudo tcpdump -i any -n 'udp port 443' 2>/dev/null | head -20
結果:UDP 443 のトラフィックあり。QUIC を使っていることを確認。
QUIC をブロックして TCP にフォールバックさせる
sudo iptables -I FORWARD -p udp --dport 443 -j DROP
YouTube が速くなった。Prime Video も見れた。しかし UNEXT は依然タイムアウト。
QUIC が原因ではないと判断。
Step 3: 通信先 IP を特定する
Kindle(タブレット)の IP を特定してから、UNEXT 再生中のトラフィックを絞り込む。
sudo tcpdump -i eth0 -n 'src <タブレットIP> or dst <タブレットIP>' 2>/dev/null
再生ボタンを押した瞬間のログ:
<タブレットIP>.47328 > 192.168.x.254.53: A? scene01c.nxtv.jp.
<タブレットIP>.36148 > 103.140.112.106.443: Flags [S], seq ...
<タブレットIP>.36148 > 103.140.112.106.443: Flags [S], seq ... ← SYN再送
103.140.112.106 への SYN が2回送られているが SYN-ACK が返ってこない。接続確立できていない。
Step 4: VPS から直接疎通確認
ラズパイ経由(WireGuard 経由)で繋がらないなら、VPS 自体が UNEXT に繋がるか確認する。
# VPS上で実行
curl -v --max-time 5 https://unext.jp
タイムアウト。 VPS から UNEXT に到達できない。
Step 5: ISP 直接(WireGuard バイパス)で確認
WireGuard を経由しない場合はどうか。
# ラズパイ上で wlan0 を明示
curl -v --interface wlan0 https://unext.jp --max-time 5
TLS ハンドシェイクまで到達。繋がる。
これで「WireGuard(VPS)経由だと UNEXT に繋がらない」ことが確定した。
Step 6: VPS の IP を確認
国外 IP が原因の地域制限を疑って VPS の IP を調べた。
curl http://ip-api.com/json/<VPS_IP>
結果は日本国内 IPだった。地域制限ではない。
Step 7: 原因の結論
国内 IP なのに UNEXT に繋がらない → VPS・データセンターの IP レンジごとブロックされている。?
動画配信サービスはクラウド・VPS の IP レンジをまるごとブロックするポリシーを持っていることがある。Netflix などと同じ仕組み。
生配信が見れていた理由は、配信サーバーの IP 帯が VOD サーバーと異なるため、ブロック対象外だったと考えられる。
あくまでも推測だが、調べようがない。
とはいえ、今回は良い暇つぶしになった。
調査で使ったコマンドまとめ
| コマンド | 何を確認したか |
|---|---|
ping -M do -s <size> <IP> |
MTU の壁がどこにあるか |
iptables -t mangle -L FORWARD -n -v |
TCPMSS clamping の有無 |
tcpdump -i any -n 'udp port 443' |
QUIC トラフィックの有無 |
iptables -I FORWARD -p udp --dport 443 -j DROP |
QUIC をブロックして TCP フォールバック確認 |
tcpdump -i eth0 -n 'src/dst <IP>' |
特定デバイスの通信先確認 |
curl -v --max-time 5 https://unext.jp |
VPSから直接疎通確認 |
curl --interface wlan0 <URL> |
WGバイパスして直接疎通確認 |
curl http://ip-api.com/json/<IP> |
IPの国・AS確認 |
解決編
調査で原因が特定できたので、iptables で UNEXT の IP 帯だけ WireGuard をバイパスして解決した。