こんにちはhamasan05です。
この記事はKLab Engineer Advent Calendar 2025の19日目の記事です。
今回の目的と動機
安定した高速インターネットと自宅サーバの両立
その中で検討した手段が
- IPv6で自宅サーバ環境
- PPPoEとDS-Lite両方のセッションを張り、PPPoEで自宅サーバを公開する
ということで前回の続きです
Acher C6が思ったより速度が出なかったので反省を生かして
ルータにしては高スペックなものを・・・と思って周りを見渡していると
手元に予備のJ4125のマシンがありました。
これならもしかしてと思って調べ始めました。
まずはNICが二つ必要なのですが、NICが一つもない機種のため
USBのNICは必須。
rtl8153のチップがOpenWRTでサポートしているということで二つほど入手しました。
ところがところが、OpenWRTのx86標準のROMではrtl8153のドライバが組み込まれておらず
一つもNICのないモデルの場合はビルドしてしまうのがよさそうということでROMビルドから挑戦してみました。
(後から考えればUSBメモリなりに必要なものを入れてインストールも可能だったかもしれないと思いつつ
0. 構成図(ASCII)
最終的に目指す構成はこんな感じです。
┌─────────────────────────────┐
│ Internet │
└──────────────┬──────────────┘
│
┌──────────────┴──────────────┐
│ │
(IPv6 + DS-Lite IPv4) (IPv4 PPPoE)
transix IIJ PPPoE
IPv4:150.31.x.x IPv4:217.178.x.x
│ │
└──────────────┬──────────────┘
│
OpenWrt x86_64
(eth0 LAN / eth1 WAN)
│
┌──────────────┬──────────────┬──────────────┐
│ │ │
192.168.1.2 192.168.1.3 その他LAN端末
サーバ1 サーバ2 PC/スマホ
→ PPPoE出口 → PPPoE出口 → DS-Lite出口
※無線APがLANないにありますが本質ではないので割愛
※もともと配置していたWiFiルータをAPとして再配置しています
経路
DS-Lite / PPPoE
【通常端末】
192.168.1.x → OpenWrt → dslite → transix → Internet
【サーバ】
192.168.1.2 → ip rule → pppoe table → PPPoE → Internet
192.168.1.3 → ip rule → pppoe table → PPPoE → Internet
1. wslの環境を構築してソースを取得する
好みの問題ですが使い慣れているfedoraで構築しました
ビルドに必要そうなものをどんどん入れていきます
wsl --install -d FedoraLinux-43
sudo dnf update -y
sudo dnf install -y gcc gcc-c++ make automake autoconf ncurses-devel zlib-devel gawk flex bison gettext wget git rsync python3 patch perl perl-FindBin unzip
とりあえず最新版にする
git clone https://git.openwrt.org/openwrt/openwrt.git
cd openwrt
git branch -a | grep openwrt-23
git checkout -b openwrt-23.05 remotes/origin/openwrt-23.05
./scripts/feeds update -a
./scripts/feeds install -a
2. menuconfig
まずは make menuconfig を実行して、必要なモジュールを選んでいきます。
make menuconfig
このあたりはGUIで必要そうなものを入れていきます。
dsliteなど必要なものがデフォルトでは含まれていないので結構真剣に見ていきます。
何度か失敗してビルドした結果こんな感じがよさそうということになりました。
Target
- Target System → x86
- Subtarget → x86_64
- Target Profile → Generic
USB NIC(RTL8153)
kmod-usb2kmod-usb3kmod-usb-netkmod-usb-net-rtl8152
※8152を入れると8153もサポートされます
DS-Lite
kmod-ip6-tunnelkmod-sitkmod-ipip
※多分kmod-sitとkmod-ipipはなくても動きます
LuCI(任意)
luci
※Webコンソール。結局便利なので
3. ビルド
PATHの大文字小文字の区別などがあるためPATHを上書きしておくと安定です。
あと、ビルドが失敗した時に理由を知るために再ビルドするのが手間なので
V=sをつけておきます。
これで失敗した時も原因がわかってさっさと対応できます。
PATH=/usr/local/bin:/usr/bin:/bin make -j$(nproc) V=s
menuconfigでカーネルモジュールの組み込み情報を変更した時には
make target/linux/clean
が必須です。
これで必要なモジュールがないし、生成AIが嘘ついて変な誘導するわでだいぶはまりました。
出来上がった openwrt-x86-64-generic-squashfs-combined-efi.img をWindows側に送っておきます。
4. インストール
x86マシン実機にインストールする時が来ました。
ROMはライブメディアでインストールできないタイプなので軽量Linuxからddを使ってインストールします。
AlpineをUSBメディアにrufusで焼いて
OpenWRTもUSBメディアにrufusで焼いて
2本用意しておきます。
Alpine起動したら
rootでパスワードなしでログインして
setup-keymap で106キーボードを有効にします
fdisk -l でインストール先とインストールメディアを特定します。
こんな感じでOpenWRTをx86マシンにインストールしちゃいます。
mount /dev/sdb1 /mnt
dd if=/mnt/openwrt-x86-64-generic-squashfs-combined-efi.img of=/dev/sda bs=4M conv=fsync
sync
5. PPPoE/DS-Liteを設定していく
現状のコンフィグをAIにサマリしてもらったので若干実行したコマンドと相違がありますが
大体こんな感じ。
uci batch << 'EOF'
set network.lan=device='br-lan'
set network.lan.proto='static'
set network.lan.ipaddr='192.168.1.1'
set network.lan.netmask='255.255.255.0'
set network.lan.ip6assign='60'
set network.wan=device='eth1'
set network.wan.proto='pppoe'
set network.wan.metric='20' # サーバ側しか使わないので実質優先度2
set network.wan.username='XXXXXXX' # プロバイダから提供されているID
set network.wan.password='XXXXXXX' # プロバイダから提供されているPASS
set network.dslite=interface
set network.dslite.proto='dslite'
set network.dslite.peeraddr='XXXX:XXXX::XXXX:XXX' # プロバイダから提供されているAFTRアドレスを名前解決したもの
set network.dslite.mtu='1280'
set network.dslite.metric='10' # 基本こちら側を利用するので実質優先度1
set network.dslite.encaplimit='ignore'
set network.wan6=interface
set network.wan6.proto='dhcpv6'
set network.wan6.device='eth1'
set network.wan6.reqaddress='try'
set network.wan6.reqprefix='auto'
commit network
EOF
/etc/init.d/network restart
6. 追加のFW設定
uci batch << 'EOF'
add firewall.zone
set firewall.@zone[-1].name='dslite'
set firewall.@zone[-1].network='dslite'
set firewall.@zone[-1].input='ACCEPT'
set firewall.@zone[-1].output='ACCEPT'
set firewall.@zone[-1].forward='ACCEPT'
set firewall.@zone[-1].masq='1'
set firewall.@zone[-1].mtu_fix='1'
add firewall.forwarding
set firewall.@forwarding[-1].src='lan'
set firewall.@forwarding[-1].dest='dslite'
commit firewall
EOF
/etc/init.d/firewall restart
7. LAN DNS をOpenWRTで動かす
uci add_list dhcp.lan.dhcp_option="6,192.168.1.1"
uci commit dhcp
/etc/init.d/dnsmasq restart
これで宅内サーバへの経路はルータが宅内に向けてくれます。
(別サーバが担っていたのをルータに集約できました
ローカル DNSの設定
uci add dhcp domain
uci set dhcp.@domain[-1].name='XXXX.XXXX.XXX' # 契約している独自ドメイン
uci set dhcp.@domain[-1].ip='192.168.1.2'
uci commit dhcp
/etc/init.d/dnsmasq restart
8. サーバの出口をPPPoEに固定する
rt_tables
echo "100 pppoe" >> /etc/iproute2/rt_tables
rc.local
cat << 'EOF' > /etc/rc.local
ip route add default dev pppoe-wan table pppoe
ip rule add from 192.168.1.2 table pppoe
ip rule add from 192.168.1.3 table pppoe
exit 0
EOF
※再起動時の安定性を高めるなら、/etc/hotplug.d/iface/99-pppoe に書く方法もあるそうです。
※pppoe-wan の起動タイミングによっては rc.local が先に実行されて失敗する場合があるそうです。
とりあえずささっと動きそうなrc.localで実装
9. ポートフォワード
80/443
uci batch << 'EOF'
add firewall.redirect
set firewall.@redirect[-1].name='http80'
set firewall.@redirect[-1].src='wan'
set firewall.@redirect[-1].src_dport='80'
set firewall.@redirect[-1].dest='lan'
set firewall.@redirect[-1].dest_ip='192.168.1.2'
set firewall.@redirect[-1].dest_port='80'
set firewall.@redirect[-1].proto='tcp'
add firewall.redirect
set firewall.@redirect[-1].name='tls443'
set firewall.@redirect[-1].src='wan'
set firewall.@redirect[-1].src_dport='443'
set firewall.@redirect[-1].dest='lan'
set firewall.@redirect[-1].dest_ip='192.168.1.2'
set firewall.@redirect[-1].dest_port='443'
set firewall.@redirect[-1].proto='tcp'
commit firewall
EOF
/etc/init.d/firewall restart
UDPゲーム用
uci batch << 'EOF'
add firewall.redirect
set firewall.@redirect[-1].name='game'
set firewall.@redirect[-1].src='wan'
set firewall.@redirect[-1].src_dport='xxxx' # 必要なUDPポート
set firewall.@redirect[-1].dest='lan'
set firewall.@redirect[-1].dest_ip='192.168.1.3'
set firewall.@redirect[-1].dest_port='xxxx' # 必要なUDPポート
set firewall.@redirect[-1].proto='udp'
commit firewall
EOF
/etc/init.d/firewall restart
10. DDNS
OpwnWRT側でDDNSの更新ができるのですが、ちゃんとサーバ側でPPPoE側に出られるので
更新は任せておきました。
ここは必要に応じてWeb(luci)から設定が可能です。
11. ソフトウェアオフロード
速くなるらしいです!
uci set firewall.@defaults[0].flow_offloading='1'
uci commit firewall
/etc/init.d/firewall restart
完成!結果は?
試してみましたスピードテスト
早朝だったのですが、
PPPoE側は 400Mbpsこえて
DS-Lite側は600Mbpsこえて
結果大成功です!
CPU使用率はDS-Lite側で計測時に12%程度
まったくもってオーバースペックという感じですね。
そんな性能いらないやろということで、BIOSで省電力モードにしました。
高性能ルータを手に入れたのはよかったのですがいくつか問題が発生しました。
-
停電復旧時に自動復旧しない
→これはしょうがないのでBIOSで一に一回の停止時の起動を入れました。 -
メッシュがなくなった
もともと使っていた親機がメッシュに対応していたのですがAPモードだとメッシュ非対応
ということでメッシュではなく普通の中継にしました。
(APまで交換となると面倒なので実害出てきたら考えようという気持ちになりました
終わりに
あなたのルータが遅いの、実は無線規格のせいではなく
ルータのCPUがしょぼいからかもしれませんよ?
あまりルータのCPU性能など考えたこともなかったので
Ethernetの規格やWiFiの規格が速ければいけるだろぐらいにしか思っていなかった私ですが
ルーター沼にはまって気づいたのは
ルータのCPU性能大事すぎるという結論でした。
スマホの機種交換の時期になったらWiFi 6Eや7を使うことになりそうですが
その時はAPの性能がよさそうなのを選べばとりあえず有線側まだしばらく何とかなりそうかなと思いました。