環境
- ラズパイ(Linux)がルーター兼 WireGuard クライアント
- 配下のデバイス(タブレット等)は eth0 経由でラズパイを通してインターネットへ
- ラズパイは wlan0 で ISP ルーター(192.168.x.1)に接続
- 全トラフィックを WireGuard(wg0)経由で VPS に流す構成
- VPS は国内 VPS サービス
タブレット(192.168.x.x)
└─ eth0 ─ ラズパイ(ルーター)
├─ wlan0 ─ ISPルーター ─ インターネット
└─ wg0 ─ VPS(国内) ─ インターネット
症状
- WireGuard 経由の WiFi で UNEXT が一切見れない
- YouTube・Amazon Prime Video は問題なし
- UNEXT の生配信は見れる、VOD だけ駄目
調査
tcpdump で通信を確認
タブレットが UNEXT に接続しようとしたタイミングで tcpdump を仕掛けた。
sudo tcpdump -i eth0 -n 'src <タブレットIP> or dst <タブレットIP>' 2>/dev/null
UNEXT のサーバーへの SYN が2回送られているが SYN-ACK が返ってこないことを確認。接続確立できていない。
VPS から UNEXT に繋がるか確認
# VPS上で実行
curl -v --max-time 5 https://unext.jp
タイムアウト。 VPS から UNEXT に繋がらない。
ISP 直接(wlan0 経由)では繋がるか確認
# ラズパイ上で wlan0 を明示して実行
curl -v --interface wlan0 https://unext.jp --max-time 5
TLS ハンドシェイクまで到達。繋がる。
VPS の IP を確認
curl http://ip-api.com/json/<VPS_IP>
結果は日本国内 IP だった。地域制限の問題ではない。
原因
国内 VPS の IP レンジが UNEXT にブロックされていた。
動画配信サービスはデータセンター・VPS・クラウドの IP レンジをまるごとブロックすることがある。地域制限というよりも、ホスティング IP 自体を弾くポリシーによるもの。
生配信が見れていた理由は、生配信サーバーの IP 帯が別系統だったため。
・・・と思われる。
あくまでも予想。私のVPSのIPだけブロックされてるかもしれない。
そこはわからん。
解決策
UNEXT の IP 帯だけ WireGuard をバイパスして、ISP 直接(wlan0)で通信させる。
iptables で UNEXT の IP 帯だけ wlan0 に MASQUERADE
sudo iptables -t nat -I POSTROUTING -s 192.168.x.0/24 -d 103.140.112.0/24 -o wlan0 -j MASQUERADE
sudo iptables -t nat -I POSTROUTING -s 192.168.x.0/24 -d 202.32.8.0/24 -o wlan0 -j MASQUERADE
永続化(wg0.conf に追記)
/etc/wireguard/wg0.conf の PostUp / PostDown に追記する。
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu; iptables -t nat -A POSTROUTING -s 192.168.x.0/24 -o %i -j MASQUERADE; iptables -t nat -A POSTROUTING -s 192.168.x.0/24 -d 103.140.112.0/24 -o wlan0 -j MASQUERADE; iptables -t nat -A POSTROUTING -s 192.168.x.0/24 -d 202.32.8.0/24 -o wlan0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -D FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu; iptables -t nat -D POSTROUTING -s 192.168.x.0/24 -o %i -j MASQUERADE; iptables -t nat -D POSTROUTING -s 192.168.x.0/24 -d 103.140.112.0/24 -o wlan0 -j MASQUERADE; iptables -t nat -D POSTROUTING -s 192.168.x.0/24 -d 202.32.8.0/24 -o wlan0 -j MASQUERADE
反映:
sudo wg-quick down wg0 && sudo wg-quick up wg0
結果
タブレットの UNEXT アプリで VOD が再生できるようになった。YouTube・Prime Video も引き続き問題なし。
余談:resolv.conf が壊れていた
調査中に /etc/resolv.conf の記述が不正であることも発覚。
# 壊れてた
nameserver 127.0.0.1,8.8.8.8
# 正しい(1行1エントリ)
nameserver 127.0.0.1
nameserver 8.8.8.8
chattr +i で上書き防止しておいた。
まとめ
| 確認コマンド | 目的 |
|---|---|
tcpdump -i eth0 -n 'src/dst <IP>' |
どのIPと通信してるか |
curl --interface wlan0 <URL> |
WGバイパスして直接疎通確認 |
curl http://ip-api.com/json/<IP> |
IPの国・AS確認 |
ip route show table 51820 |
WGのポリシールーティング確認 |
iptables -t nat -I POSTROUTING ... -o wlan0 -j MASQUERADE |
特定IP帯だけWGバイパス |
特定サービスだけ VPN をバイパスしたい場合は、iptables の POSTROUTING で宛先 IP 帯を指定して wlan0 に MASQUERADE するのが手っ取り早い。UNEXT の IP 帯が変わったら tcpdump で新しい IP を確認して追加する必要がある。