※この記事は原文を私が書き、Google Gemini 3.1 Proに「なんかいい感じにmdに加工して」と頼んだものです。口調はAIっぽいかもしれませんが、内容は人間が書いています。
【OpenWrt】Steamの爆速DLとマイクラ鯖(25565)公開を両立したくてIPoE+PPPoEを共存させた話
はじめに(ダサいポート番号からの脱却)
身内向けにマイクラサーバーを公開するため、独自ドメインをとってCloudflareにDNSレコードを登録した。
でも、うちの環境だとポート25565の開放ができず、泣く泣く minecraft.mydomain:34567 みたいな宛先を身内に入力してもらっていた。
……なんかダサくて嫌だ。
「ルーターにOpenWrtを焼いたら25565ポート開けられるんじゃね?」
ということで、自宅のルーター(WSR-2533DHP3)をOpenWrt化し、サーバーマシンへ転送させることにした。
(※ちなみにWi-Fi APは別で用意しているので、このOpenWrtルーターは電波を吹いていない)
(本当はk3s環境で導入しているMetalLBがL2モードでちゃんと動かないから、ルーターにBGPを喋らせたかった。というのがOpenWrt化の8割位を占めていたりする。)
IPoEとの出会い、そして絶望
それからしばらくして、ふと気になった。
「21時以降、Steamのゲームダウンロード速度が10MB/sしか出ないの遅すぎないか?」
マイクラサーバーを動かしているk3sクラスタを組んだとき、LAN全体でIPv6を無効化したのがマズかったか?と思い有効化してみたが、効果なし。
契約しているBIGLOBE光についてちょっと調べてみると、どうやらこういうことらしい。
- 世の中には「PPPoE」と「IPoE」って接続方式がある
- 今うちで動いてるのはPPPoEで、IPoEの方が圧倒的に速い
- IPv6オプションが有効ならIPoEが使える。というか普通はそっちを使うらしい
「じゃあIPoE使おうぜ!!」とテンションが上がったのも束の間、IPoE(MAP-E)について調べると、サーバー公開には絶望的に向かないことが発覚した。 - ポート制限環境に逆戻りする(自由にポートが開けられない)
- IPv4アドレスを赤の他人と共有することになる
身内向けとはいえ、マイクラサーバーをホストしている身としては死活問題である。今使ってるPPPoEならその辺何も気にせずやれてるのになぁ……。
「せや! PPPoEとIPoE両方使えるようにして、マイクラサーバーだけPPPoE使わせたろ!」
ということで、変態ルーティング構築の幕が開けた。
やりたいこと・構成
- 目的: BIGLOBE光環境で、IPoE(MAP-E)とPPPoEを両方使えるようにOpenWrtを上手いこといじり倒す。身内からのマイクラアクセスだけPPPoEに流す。
- ルーター: OpenWrt (WSR-2533DHP3)
- マイクラサーバー: k3s上のコンテナ。Nginx IngressのMetalLB経由でLAN内に足を出している状態(BGP運用)。
手順
1. MAP-Eを生やす
実はMAP-E部分の設定はほとんど既出。先人たちに圧倒的感謝。
とりあえずパッケージを入れて再起動する。
opkg update
opkg install map
reboot
再起動後、以下の神記事の手順4から参考にさせてもらった。
NanoPi R2S+OpenWRT 21.02.0でBIGLOBEのMAP-E接続
https://blog.osakana.net/archives/11679
設定に使うパラメータは、自分のIPv6アドレス(/64までぜんぶ)を下のサイトに突っ込んで計算させれば一発で出てくる。
これでインターフェース(map-wan_map)にグローバルIPv4アドレスが生えたらMAP-Eの設定はOK!
2. mwan3でよしなにやる(実は必須だった)
この記事を書きながら「今回のホストするだけのユースケースなら、mwan3要らなくてnetworkのmetric設定だけでいけたんじゃね?」と思った。
……が、試しにmwan3を止めてみたら外部からアクセス不可になった。
どうやらmwan3は、conntrackやらfwmarkやらを管理してくれていて、非対称ルーティングの防止に一役買っているらしい。ただのマルチWAN管理だと思っててゴメンな。
ということで大人しく設定する。
opkg install mwan3
インストールすると /etc/config/mwan3 が生えるので、こんな感じで設定した。
(ちなみにmetricは付けないとダメらしいので、IPoE側を優先させるために wan: 20, map-wan_map: 10 にしてある)
config globals 'globals'
option mmx_mask '0x3F00'
option local_source 'lan'
config interface 'wan'
option enabled '1'
list track_ip '1.0.0.1'
list track_ip '1.1.1.1'
list track_ip '8.8.8.8'
list track_ip '8.8.4.4'
option family 'ipv4'
option reliability '2'
config interface 'wan_map'
option enabled '1'
list track_ip '1.0.0.1'
list track_ip '1.1.1.1'
list track_ip '208.67.222.222'
list track_ip '208.67.220.220'
option family 'ipv4'
option reliability '1'
config member 'wan_m2_w10'
option interface 'wan'
option metric '2'
option weight '10'
config member 'map_m1_w10'
option interface 'wan_map'
option metric '1'
option weight '10'
config policy 'default_policy'
list use_member 'map_m1_w10'
list use_member 'wan_m2_w10'
config rule 'default_rule_v4'
option dest_ip '0.0.0.0/0'
option use_policy 'default_policy'
option family 'ipv4'
3. MAP-E経由でICMPが返ってこない問題の修正
mwan3 statusを叩いたら、なぜかインターフェースがdownしていて気づいた。
どうやら map.sh が悪さをしてICMPが返ってこない問題があるらしい。マジかよ。
以下の記事を参考に、よく分からん人向けワンライナーを実行して粉砕した。
OpenWrtでフレッツ光&光コラボ IPoE(DS-Lite/MAP-E/IPIP)に繋ぐには【HGWも可】
https://qiita.com/kouhei-ioroi/items/cf0c6228c5c1faef415a
# cd /lib/netifd/proto && wget https://github.com/fakemanhk/openwrt-jp-ipoe/raw/main/map.sh.new && chmod 755 map.sh.new && mv map.sh.new map.sh && service network restart
4. MetalLB向けの通信がルーター内で迷子になる問題(最大の罠)
ここが一番ハマった。
PPPoEのIP宛てに飛んできたマイクラサーバーの通信が、どういうわけかルーター内で消滅している。
パケットの気持ちになって調べてみると、ルーター内でこんなアホみたいなコントが起きていた。
- WAN (PPPoE) からパケットが来る
- DNATで宛先がMetalLBのIPに書き換えられる前に、mwan3によって「お前WANから来たな」というマーク(fwmark)を付けられる
- その後DNATされて、宛先がLAN内のMetalLB IPになる
- 経路検索のとき、マークが付いちゃってるせいでBGPで学習したmainテーブルではなく、mwan3管理のwan用テーブルを見に行ってしまう
- ルーター「あー、そんな宛先(MetalLBのIP)の経路、このテーブルにねえわ〜w」
- パケット、Uターンして消滅。ウケる。
これを直すために、「LAN内(192.168.0.0/16)宛ての通信は問答無用で main テーブルを見ろ」というルールを追加してやった。
ip rule add to 192.168.0.0/16 lookup main pref 10
おわりに
これでようやくすべてが繋がり、Steamの爆速ダウンロード環境と、ダサくないポート番号でのマイクラサーバー公開を両立できた。
ここには書いてない試行錯誤が山のようにあったが、コアになる設定は多分これだけでいけるはず。
頑張れ、いつかルーターリプレースした時にもう一度これをやる未来の俺。
この記事、かなりふんわりというか、雰囲気で設定触ってるので、なにか間違いがあったら指摘いただけると助かります。ちゃんと理解するにはWAN側に抜けれなくなったりで時間が足りなかった。