839の日記

趣味の話を書くブログです。

ミニPC(N150)+OpenWrtで10Gbpsルーターを作る

背景

1Gbps回線+RTX830から10Gbps回線にするにあたってRTX1300が欲しかったのですが、流石に高いのでもっといい選択肢はないものか…と考えていたときに以下のツイートを見かけたのがキッカケです。*1 稼働し始めて1週間ぐらい経ち、概ね問題もなさそうなのでまとめていますが長期的なリスクは未検証である点を留意してください。

下準備

R2 Max - Next-Gen 10G Firewall Gateway Server, Updated to Intel Twin Lake-N N150, N355 – iKOOLCORE CPUはN150、NICはAQC113C x2, i226 x2のミニPCです。

RTX1300所有者が退役させて切り替えるぐらいなので良いのでは?と思いつつ商品ページを見に行き、日本円だと結局だといくらなのか確認するためにチェックアウト操作をしていたら誤購入しました(ガチ)。 即キャンセルすればキャンセルはできるかなと思ったものの、まぁ押してしまったし作るか~と気持ちを切り替えて到着を待ちました。 自分が購入したタイミングはちょうどN150に切り替わったタイミングでメモリ、ストレージ無しのPaypal払いで約5万でした。

メモリはCrucialのCT8G48C40S5 4000円、ストレージはmicroSDSanDisk 32GB MAX Endurance 1915円で購入しました。 最初はPVEで運用する想定もありストレージに余っているSSD(1TB)を使っていたのですが、PVE化は断念(後述)して容量の使い道がなくなったのでmicroSDに移行しました。 SSDにする場合はSPから出ている128GBのPCIe3.0x4が2300円ぐらいなのでそのあたりで十分*2だと思います。 microSDにすることで多少省電力になることを期待したのですがほぼアイドルだったのか消費電力は変わりませんでした。

商品ページでN150はファンレスと書かれていますが、自分が購入したとき(2025/2末)は確かファンレスと書かれておらずファン付きのモデルが到着しました。 海外Youtuberの解説を見てるとどうもファンレスケースとファン付きケースは構造が微妙に違うらしい?ファンレスケースのほうがファンなしで冷える構造になっているかもしれないです。 ファンはBIOSからPWMで調整可能で初期設定はすぐ回り始めますが、正直結構不快な音がするので割と熱くなるまで回さないように設定しました。 夏にガンガン回るようなら外付けファンで冷やすのも検討しようと思っています。

ちなみにAmazonでも非常に似た構成の製品が売られてます。 刺さる人には刺さるキワモノ。 AIOPCWA「AI407」はデュアル10GbE+デュアル2.5GbEなIntel N150/i3-N305搭載ミニPC | がじぇっとりっぷ 海外サイトやPaypalを使いたくない人はこちらもありかもしれません。

スペック的に異なるところはインタフェースの口が色々増えていたりアンテナホールがあったりする代わりにTF(microSD)カードスロットがないことでしょうか。 見た目はほぼ同じでAIOPCWAのマークがついてるかついてないかぐらいの違いしかなさそうです。 R2 Maxは公式サイトや iKOOLCORE 官方Wiki | 硬酷科技Wiki | 硬酷R2 Max wiki | 硬酷R2 wiki | 硬酷R1 Pro wiki などのwikiBIOSファームウェア更新などにも解説がありますが、AIOPCWAは公式ページを見つけられませんでした。

AIOPCWAはALL M.2 NASの自作を検討していた際にも目に止まったメーカーで結構ニッチな商品を出してるなという印象です。 AI407を買う人がいたらぜひレビューを聞かせてください。

OpenWrt環境の作成

ブツが届いて触ると結構ずっしりしていて(1kg)、金属~という感じでした。 最初はPVEのVMとしてOpenWrtを入れるつもりで、鶏卵問題が発生しそうなのでどうやるのだろう?と思っていたのですが、 ミニPC「HUNSN RJ03」へProxmoxとOpenWrtをインストール、最強ルーターを自作 | Wi-Fiマニュアル で丁寧な解説があったのでこちらの通りに導入したらいい感じに動きました。 ただPVEのVMとして構築すると期待通りのスループットが出なかったので、色々試した後に諦めました。

iKoolcoreのページではQWRTのDLリンクが案内されていますが、自分は普通のOpenWrtで運用したかったので使わず。 QWRTはファームウェア全部入りイメージなので何もしなくてもそのまま使えますが、自前でOpenWrtを入れる場合は kmod-atlantic を入れないと10G NICが反映されないので最低限入れる必要があります。

実際にspeedtest.netで計測を行ってみると5.5Gbpsあたりで頭打ちになってしまい色々と設定を変えて頭を悩ませていたのですが、最終的にパケットステアリングの設定で 有効 (全てのCPU) を選択するだけで概ね満足するスループットが出るようになりました。DLは恐らくISP側(eo光)の頭打ちなのですが、ULはこちら側の問題のような気はしています。このタイミングでSFO/HFOも試していたのですが、これらは有効化しても変わらず or 遅くなるという状況だったためオフにしています。

消費電力は大体平均14W前後で、スピードテストなどで高負荷をかけて26, 7W付近まで上昇します。 RTX1300の消費電力が最大26Wとなっているので10Gルーターとしては妥当なのかな?と思っています。

温度は大体この時期で40~50度ぐらい。一応55度超え始めぐらいからファンを回す設定にしています。

上4つは10G NICの温度、下5つはCPU温度

機材不足で検証しきれていない課題としては、iperf3のreceive6.3Gbpsで頭打ちになる現象で、sendは9.5Gbps出ているので問題ありませんでした。 大きく分けて外から繋いでいるNIC(AQC107)の問題か、外れ個体かの2択ぐらいだとは思っているのですが、まだそこまで困っていないのでもう1つ10GbENICが必要になったタイミングで確認してみようと思っています。Ubuntuを入れてspeedtest cliを試したときにもアップロード側が6G程度で律速していたのでOSは関係なさそうでした。他のユーザーでは同様の現象は発生していなさそうなのでおま環っぽいのですが、皆目検討がつきません…。

PVE環境の検証

PVE上でOpenWrtを動かすとスループット出ない問題についてはPVEの問題かVM(OpenWrt)の問題かの切り分けを行って、VMの問題の可能性が高い、ということがわかりました。 PVE単体で動作させる分には直接OpenWrtを入れたときと同程度のスループットが出ます。 PVE+OpenWrtのスループットの劣化具合は

このぐらいで、ここまで劣化するならPVE化は諦めるか…となりました。 正直リソースは余ってる感じがするのでPVEで細かいものをN150マシンで動かせると消費電力的にコスパ良さそうだなと思っていたので残念です。 一方ルーターは常に安定稼働しておいてほしいので、ルーターとしてだけ動いてもらうほうが良いかなと思うところもあります。

AQC113のNICが載ったマシン*3が別途着弾予定なのでPVEでDebianなどの適当なVMを動かしたときのスループットも計測していたのですが、こちらは概ね4~8%程度の性能低下という形でした。 この程度の性能低下であれば許容してPVEで運用する予定です。

pingのレイテンシ

自分の環境でもRTX830と比較してみたのですが、0.3~0.4msぐらいは遅い傾向がありました。 C-StatesをDisableすると0.3ms程度改善して概ねRTX830と同等のレイテンシになったのですが、消費電力が爆上がりして14W程度だったのが23W程度に…。 紹介されてた記事では16%ぐらい消費電力が上がると書かれていたのですが、60%上昇です。

対戦型ゲームなどをする上ではこの0.3msを削りたくなりそうなのですが、自分はあまりやらないので電力と相談してとりあえずC-StatesはEnableのまま運用することにしました。 自分が計測した結果は以下です。

機器 試行回数 C-States min avg max stddev watt
RTX830 300 - 0.284 0.639 1.502 0.240 5.9
R2 Max 300 Enable 0.463 1.039 2.186 0.267 14.2
R2 Max 300 Disable 0.305 0.702 1.420 0.262 22.8

OpenWrtにして良かったポイント

今回がOpenWrtデビューだったのですが、OpenWrtにしてよかった~と思う点を挙げていきます。

メトリクスがGrafanaで見れる

各種スマートメーターや自宅鯖で運用しているメトリクスはprometheus+grafanaに集約しているので、一元化できるのは満足度が高いです。 自分が使っているダッシュボードは

Multiple OpenWRT infrastructure | Grafana Labs

OpenWRT | Grafana Labs

の2つです。 無線APも複数OpenWrt対応ルーター(GL-MT3000)で動かしているのでMultipleの方で全体を俯瞰することが多いです。 MT3000のファームウェアはStableだとWiFiのメトリクスが取れなかったので24.10系のファームウェアに更新しています。

以下は公式サンプルの画像ですが、複数鯖をいい感じに一覧表示できてテンションが上がります。

ただ各情報のソート情報が無秩序で上のメーターと下のメーターの順序が一致していない、みたいなことが発生するのが難点です。

ルーターの消費電力もgrafana上で表示して負荷に合わせて消費電力が変わってる~といった感じで眺めてます。 消費電力の計測には Wi-Fi ワットチェッカー RS-WFWATTCH2|ラトックシステム公式サイト をメインで運用して、ちょろっと測りたいときだけSwitchbotのプラグミニを利用しています。 プラグミニの方はスマホアプリで開いたときしか細かく計測してくれないのであまり実用性がないなと感じています。 ラトックはWiFiに繋がり、そのIPに対してリクエストするとメトリクスを教えてくれるのでgoでexporterを書いて集計しています。

ネットワークに少し詳しくなった

知らないことだらけで非常に楽しかったです。 最初は単純に速度が出ないという点を改善していたのですが、次はWiFiの電波が気になりだし、ローミングの仕様を調べたりとか。 メーカーが言ってるメッシュWiFiって実際何?みたいな話も今回のタイミングで意識するようになりました。

OpenWrtで複数AP間でWifiローミング&バンドステアリングする:802.11k/v/r - 溜池の南側
嘘と誤解だらけのメッシュWiFiの実態と、逆襲の中継機 : Misc Mods

Wi-Fi環境チェックツールの決定版! 無料の「WiFiman」アプリを試す【イニシャルB】 - INTERNET Watch

このアプリを使うと電波状況とローミングの発生を同時に見れるので設定確認に便利でした。

2F->1Fのローミング

バックアップで大体戻る

RTXで言うところのconfigエクスポートと同じような機能があるため、バックアップのリストアで大体すぐに環境を戻せます。 OpenWrtはsquashfsext4のイメージが提供されていますが、squashfsのほうがリストア時の再現度が高いと見たので自分はsquashfsで運用しています。

スケジュールタスク(cron)でバックアップコマンドを定期的に実行できるので1時間に1回実行し、NASNFSをマウントして7日分保持するようにしています。

0 * * * * sysupgrade -b /mnt/backup/openwrt/backup-${HOSTNAME}-$(date +'%Y%m%d_%H%M%S').tar.gz
0 * * * * rm $(find /mnt/backup/openwrt -name '*.tar.gz' -mtime 7)

チューニング中に変なところを弄っていたら一度起動しなくなってしまいクリーンインストールしたのですがバックアップのおかげですぐに復旧して作業を継続することができました。 この手の作業をしているとネット遮断による家族への迷惑が発生するため、RTX830にも大体同じ設定をしておき、何かあったらRTX830で一旦急を凌ぐということもしていました。

外部アクセス周りの環境整理

元々自宅鯖でまばらにcloudflare tunnelを動かしていたのですが、ルーターは常に起動しておくものなので全部ここに集約しようという思いで整理しました。 ついでにtailscaleもこのタイミングでデビューしました。 どちらもOpenWrtならではという感じではないのですがいいきっかけにはなりました。

OpenWrtと直接関係ないですがcloudflare tunnelとtailscaleはmtlsを許容できるサービスかどうかで使い分けを行っています。 外からアクセスできる口は可能な限り攻撃される可能性を減らしたいので、cloudflare tunnel経由で公開するサービスはmtlsを必須としています。 cloudflareでmtls用の証明書を発行し、その証明書を使ったアクセスじゃないと遮断してくれるのでセキュアに自分用のサービスを外の世界に置くことができます。*4 Immichもmtlsに対応してくれていたりして、非常に助かります。

地味困りポイントとしてはcloudflareのmtlsは証明書を持っているのにも関わらず何故か遮断されることが多いという点です。 cloudflare側でQUICがデフォルトで有効化されていて、それがChromeと相性悪いらしいのですが、無効化してもその問題はちょくちょく起きます。 プライベートウィンドウで開いたりブラウザを再起動したりすると証明書を使うか聞き直してくれることもあるのでそのワークアラウンドで耐えています。

一方外から自宅鯖にsshしたいとか、Sambaにアクセスしたいなどはmtls経由だと結構手間がかかります。 PCを使ったsshぐらいならcloudflare tunnel自体がサポートしてくれているので何とかなるのですが、スマホからsshしたいとかNASのSambaにアクセスしたいとかは結構大変です。 NextCloudなどはmtlsに対応してくれているのですが、対応している風なだけでバグだらけで個人的には使い物にならないのでNASへのアクセスが一番助かっています。 iPhoneの場合は特定のアプリを開いたときにtailscaleのVPNを起動するといったショートカットを仕込むこともできるので概ね満足なのですが、オンオフにちょっと時間がかかるので可能であればcloudflare tunnel経由でのアクセスに寄せています。cloudflare tunnelは最悪サービスが閉じられても過去に自前で同じような環境を作ってたのでポータビリティの面でも安心できます。

見送ったもの

  • NextDNS
    • NextDNSを有効化しているとたまに見れないサイトがある
    • そういうときにルーターの根本から有効/無効を切り替えるのが面倒
  • AdguardHome
    • NextDNSと同じような機能っぽい
    • 速度全体の低下の報告があったため
  • QoS
    • 単純に動作が確認できなかった…
    • 通常のQoSは入れるとネットワーク全体が低速になり、nftablesの方は全く効かなかった
    • SFO/HFOは使ってない

まとめ

満足です!

  • eo光10G回線のipv4でDL: 8Gbps, UL: 6Gbpsまで確認 ( kmod-atlantic とパケットステアリングの設定をする)
  • iperf3を使ったLAN内計測ではDL: 9.5Gbps, UL: 6.3Gbps程度まで確認
    • ULの律速原因はわからず、誰か助けて
  • 消費電力は平時14W、高負荷時26W程度
  • OpenWrtデビューだったが無事運用できている

*1:10G回線を契約したときに送られてきたHGWにルーター機能もあって最低限はそれで何とかなった。ただRTX830でできることは最低できてほしいという要求もあったので結果的には良かった

*2:帯域は2つのスロット合計で985MB/s

*3:ugreenのnasync、DXP4800 Plusです。OSをPVEにしてNAS+雑多アプリを稼働させる予定。ハードウェア構成が超魅力的だったのと40%オフで購入できたので採用

*4:ただし1度のリクエストの転送量が100MBまでになる縛りはある