cf-warpに IPv4 over IPv6 をさせて Nintendo Switch の快適インターネット対戦ライフを送りたかった
が NAT が全然だめでダメだった
経緯
IPv4 PPPoE 不安定すぎ
https://gyazo.com/d66295a24c2ea11fde7ac052a4f526c9
今のセッションはなんかゴールデンタイムが近づくにつれてどんどん不安定になっていって日付変更あたりで安定しだす
ユーザー全員早寝か?
IPv6 はドドドドドドドド安定
https://gyazo.com/da5ad9e96294c9b7c5b05d17197c1d9d
(縦軸の数値に注意)
IPoEサイコー!
でも IPoE の IPv4 over IPv6 にはしたくない
なんかいろいろ面倒事が起きそう
PPPoE 両立させるのも諸事情でちょっと面倒
じゃあ早くあってほしいやつだけ自分で IPv4 over IPv6 したらいいんじゃね?
というわけで Policy Based Routing で Nintendo Switch の UDP パケットだけ WireGuard に通してみる
前提
Linux マシン
Nintendo Switch とインターネットとの通信が自身を通る状態である
e.g. フォワーディングを有効にして Nintendo Switch 側で Linux マシンをゲートウェイに指定するなど
Nintendo Switch
ローカルIPアドレスが固定されている
WireGuardの設定に関する最低限の知識がある
手順
Nintendo Switch のローカルIPアドレスを固定しておく
cf-warp でGETしたwarp.confを元に適当にコンフィグをでっちあげて wg-quick up する
そのままアップするとマシンのデフォルトゲートウェイがトンネルに吸われる
吸われたくない場合は [Interface] セクションに Table = off を書いておくこと
今回は IPv4 over IPv6 であってほしいのでwarp.conf の endpoint を IPv6 アドレスにすること
筆者の環境の場合 WireGuard が QoS を指定するせいで NTT NGN網 にパケットを捨てられていた
$ ip6tables -t mangle -A POSTROUTING -d '宛先::アドレス' -j DSCP --set-dscp 0
で強引に解決した
疎通することを適当に curl -I wireguardのインターフェース名 https://1.1.1.1 とかで確認する
/etc/iproute2/rf_tables に適当に Switch 用のレコードを書き足す
$ ip rule add Nintendo.Switchの.ローカル.IPアドレス ipproto udp table switch
$ ip rule ls
で追加できていることを確認
$ ip route add default dev wireguardのインターフェース名 table switch
これで通るはず! wireshark とかでWireGuardのインターフェースを眺めながら Switch でオンラインゲームに参加してみよう
結果!
ぜんぜんダメ
通信テストでは NAT タイプB ということになるが…
マリオメーカー2 ではごくごくごく一部の人とだけP2Pがなぜか成立する
ただしできても 2〜3人まで、4人はかなり厳しそう
相手が NAT タイプAになっている?
TTL 3 の UDPパケットを送ろうとして大失敗することがある
完全同期型のゲームのみ?
ぷよぷよテトリス S でも見られた
ぷよテトはお邪魔を送る時だけ同期 (たぶん)
これらのゲームは接続が成立するまで何回失敗しても諦めないっぽい?
こっちでTTLいじってもあっちもヨワTTLで送ってくるっぽくてだめ
Splatoon 2 ではほぼ NAT 越えに失敗する (エラーコード 2618-0513)
マリオカート8 デラックスもだめ
Endpoint-Independent Mapping らしいのに何でだろうねえ
cf. /tosuke/Cloudflare WARPのネットワーク
いやでもこれ実は IPv6 のときだけか?
IPv4でも Endpoint-Independent Mapping っぽい
これなんか WireGuard 側の問題な気がしてきた
もしくはうちの設定の問題?
おまけ
これ適当なVPS契約して WireGuard で全ポートSwitchに1:1でマッピングしたら夢の NAT Type A が手に入るのでは
そのためだけに VPS 契約するの高すぎ
じゃあ使うときだけ立てれば………!?
従量課金制インターネットの復活!!!!!!!!
でもVPSにはテレホタイムとかないしなあ