変更履歴
routerd のリリース履歴です。形式は Keep a Changelog に準拠します。
変更は「追加」「変更」「非推奨」「削除」「修正」「セキュリティ」に分類します。
ただし版番号は Semantic Versioning ではなく、日付と時刻に基づく vYYYYMMDD.HHmm 形式を使います。
ソフトウェアは v1alpha1 段階のため、リリース間で破壊的変更を含むことがあります。
未リリース
(未リリースの変更はありません。)
v20260608.2325
追加
SAMTransportProfile.spec.peersFromとSAMPeerGroupKind を追加。 再利用可能なトランスポートピア参照。union セマンティクス:peersFromのメンバーを 先に読み込み、静的peersがnodeRef単位で上書き (#332, #333)。SAMTransportProfile.spec.publishPeerGroupで route-reflector がSAMPeerGroupをDynamicConfigPartとして生成し、leaf ルーターに自動配布 (#332)。- SAM ピアグループ同期: WireGuard 内部ネットワーク上のポート 19652 で動作する
軽量 HTTP サービス。パブリッシャーが
GET /v1/peer-groupsを提供し、leaf が WireGuard ピアを検出して一致するグループを自動取得。手動配布が不要に (#334, #336)。 MobilityMemberSetKind とMobilityPool.spec.membersFromを追加。 共有の識別情報のみのプールメンバーの配布。leaf は共有トポロジを取り込み、 自身の捕捉/検出の詳細だけをインラインに残す。O(N^2) の設定重複を削減 (#339, #340)。MobilityPool.spec.publishMemberSetで RR がMobilityMemberSetをDynamicConfigPartとして生成。leaf は同じ sync サービスのGET /v1/member-setsで取得 (#340)。
修正
- FreeBSD/NixOS アップグレード時に
/etc/rc.confの旧routerd serveフラグ (--observe-interval、--controller-chain*) が残っていても失敗しなくなった。 旧フラグは受理され、warning 付きで無視される (#337, #338)。
v20260608.1354
追加
SAMTransportProfileに pair-stable addressing mode を追加 (spec.addressingMode: pair-stable)。inner prefix と canonical peer key の fnv64a ハッシュで /31 スロットを決定的に割り当て、ノード追加時にも既存ピアの アドレスが安定します。leaf ノードではtopologyNodeRefsが不要になります。 既存のedge-indexモードは変更なし(#330, #331)。
v20260608.0642
追加
- ADR 0014 — CLI 体系の再設計。
routerdはデーモン専任(routerd serve)に、 すべての管理操作はrouterctl(validate/plan/apply/doctor/get/describe/status/ledger等)に移動しました。旧来のrouterd apply/routerd validate/routerd runと--onceを 廃止(#254–#262)。 - DNS リゾルバに
IP_FREEBIND/IPV6_FREEBINDを追加し、VRRP VIP が まだ割り当てられていない状態でもリスナーを開始できるようにしました(#319)。 routerd serveが起動時に loopback を自動で有効化(ip link set lo up) します。Live ISO やコンテナ環境向け(#321)。- curl 一行インストール用 bootstrap installer(
bootstrap.sh)を追加(#295)。 - リソースライフサイクルレジストリと GC planner を追加し、リソース削除時の 派生 artifact を決定的に teardown できるようにしました(#222–#229、ADR 0014)。
- ルーター設定ウィザード: ブラウザでスターター設定を生成できる UI。 Home Router / SAM / Kubernetes BGP プロファイルに対応(#233–#240)。
- YAML エディタ補完用の JSON Schema を公開(#232)。
- CloudEdge Selective Address Mobility フェーズ G を追加しました。AWS、 Azure、OCI、on-prem をまたぐ自律 BGP /32 address mobility です。 WireGuard overlay と iBGP(on-prem route-reflector)上で動作し、 ownership は BGP best path、liveness は identity community 付きの per-node marker /32、cloud trap は RIB 駆動、同一 site standby の seize は liveness 駆動になりました。データプレーンは NAT なし、 source IP 保持、client default gateway 不変を維持します。
TunnelInterfaceによる pluggable overlay underlay を追加しました。 IPIP、GRE、FOU、GUE UDP encapsulation に対応(ADR 0009)。- IPv4 force-fragment 制御を追加。PMTU blackhole mitigation を 明示的に有効化可能(ADR 0013)。
MobilityPoolの宣言型 authoring model を拡張。profiles.cloudCaptures、spec.values、identity-only remote peer に対応。- least-privilege IAM template を追加(
examples/cloudedge-mobility-demo/iam/)。 - DHCP リース同期(#100, #107)、NAT44 session sync(#106)を追加。
- ドキュメント: 日本語正本翻訳 37 記事 + 中国語翻訳 80 記事を追加(#322)。 全ダイアグラムを gpt-image-2 で再生成(#261)。
変更
- Mobility delivery は BGP best path を唯一の ownership plane として 使うようになりました(ADR 0012、Option B)。
SAMTransportProfileが共有トポロジ宣言から per-peer の tunnel / BGP / route リソースを導出するようになりました。
削除
- clean Option B migration の一環として、AddressLease、ownershipEpoch、 heartbeat-event ベースの mobility control plane を削除しました。
- 旧来の
routerd apply/routerd validate/routerd runCLI エントリポイントと--onceフラグを廃止しました(ADR 0014)。
修正
- forcefrag の DF クリアを forward フックから prerouting フックに移動し、
oifnameの代わりにfib daddr oifnameでルーティングテーブルを参照 するようにしました。一部の転送パスで MSS clamp が効かない問題を解消(#328)。 - BGP peer watch が不要な
UpdatePeerを呼ばなくなりました。reflect.DeepEqualを安定比較関数に置き換え、dynamicExportPrefixesや GracefulRestart 書式差異("2m"vs"120s")で毎回更新が走る問題を 解消(#329)。 - OpenRC DNS リゾルバの二重管理を解消(#306)、アップグレード時の旧
routerd serve停止(#311, #313)、再起動時の helper 掃除(#315)、 DNS リゾルバ helper supervision(#283)、残留 helper 更新(#280)、 nodeps 再起動(#278)。 - bootstrap installer の EXIT trap が確実に発火するよう修正(#324)。
- installer の apply state 検出を
routerctl get status -o jsonに変更(#327)。 - BGP peer state 変更を watch で status に即時反映(#304)。
- inactive の keepalived を再起動して VRRP failover を修正(#299)。
- GoBGP が
BGPPeer.spec.exportPolicy.allowedPrefixesを peer export policy として実適用するようになりました(#95)。変更時に soft reset out(#98)。 - 削除済みリソースの stale status クリーンアップ(#189)。
- ライフサイクル GC によるリソース削除時の派生 artifact teardown(#222–#229)。
v20260528.2308
追加
routerctl doctor runtime: routerd 自身のプロセス footprint(heap、 goroutine 数、GC、open / max ファイル記述子)を、新しい読み取り専用 control-API/runtimeエンドポイントから報告する doctor area を追加 しました。numGoroutineが 10000 超、または open fd がRLIMIT_NOFILEの 80% 以上で WARN。観測用で FAIL にはなりません。 エンドポイントは control socket と sudo 不要の読み取り専用ステータス ソケットの両方に配線され、routerctl doctor runtime -o jsonの形も ドキュメント化しています。
変更
- Web Console のファイアウォール「Deny activity」グラフを、ラベルの無い素の
sparkline から、軸ラベル付きの棒グラフに変更しました。24h を 5 分
バケットごとに 1 本の棒で表し、縦軸(上端に peak、下端の baseline が
0、「高いほど拒否が多い」)、横軸(「24h ago」→「now」)、
アクセシブルな
role="img"ラベル、拒否ゼロ時の「No denies in the last 24 hours」空状態を備えます。
修正
reverseDNSCache.lookupManyが pending アドレスごとに goroutine を 起動しなくなりました。固定サイズの worker pool (reverseDNSLookupConcurrency = 8) により、1 回の/api/v1/summaryが解決するアドレス数に関係なく goroutine 数が上限化され、さらに 新規reverseDNSPendingMax = 1000が呼び出し側の limit に依存せず 1 回あたりの処理件数を上限化します(超過分は次回以降に解決)。Options.ReverseLookupの contract に「実装は ctx cancellation を honor する必要がある」を明記し、RuntimeStats.OpenFDsは sample-time の近似カウントであることをコメント化しました。
v20260528.1805
修正
reverseDNSCache.lookupManyが、新規解決エントリを store した後にpruneLockedをもう一度実行するようになり、reverseDNSCacheMaxEntries(4096)のハード上限が呼び出し入口だけ でなく、あらゆる呼び出し境界で保たれるようになりました。これまでは 1 回のリクエストが空きスロット数を超える新規アドレスを解決すると、 次回 lookup の prune まで一時的に上限を超えることがありました。 exit 時 prune によりこの不変条件が常時維持されます。回帰テスト (TestReverseDNSCacheLookupManyEnforcesCapAfterStore) を追加し、 cap-100 まで事前充填してから 200 件の新規アドレスを解決させ、 呼び出し後のサイズが上限内に収まることを検証しています。これは v20260528.0832 のヒープリーク修正に対する外部レビューの仕上げ 項目で、単調増加自体はすでに解消済みでした。homert02 の 2 時間 soak でRssAnonが plateau する(warm-up の ~70 MB から GC dip を伴う ~104 MB の定常帯へ)こと、fd が all_fd=24 / sockets=16 / db_family=4 で flat、NRestarts=0 を維持することを確認しています。
v20260528.0832
修正
- リリースワークフローが Web Console screenshot ジョブの遅延を
リリースのブロッカーとして扱わなくなりました。v20260528.0751
は実際にリリースコミットとタグを作りましたが、screenshot ジョブ
の 13 件キャプチャが CI ランナー上で 10 分 21 秒掛かり、#40 期に
SSE 由来の hang 対策として入れていた
timeout-minutes: 10が 発火してしまい、Quality ワークフローが失敗扱いとなって、 依存する build / publish ジョブはすべて skip されました。結果、 ヒープリーク修正を載せるはずだったバイナリが GitHub Releases に届きませんでした。screenshot は doc サイト用の参照画像であり、 routerd バイナリの契約には含まれません。本リリースではwebconsole-screenshotジョブにcontinue-on-error: trueを 付与し、失敗は記録するがneeds: [quality]のリリース ワークフローには伝搬しないようにしました。あわせてCapture Web Console screenshotsステップのtimeout-minutesを 10 → 15 に引き上げ、遅いランナーへの余裕を確保しています。v20260528.0751タグはこの失敗のため publish されないまま 残っていますが、本リリースは同じヒープリーク修正に CI ガードを 加えた等価内容で置き換わります。
v20260528.0751
修正
/api/v1/summaryの polling が OpenTelemetry instrument の割り当てを リクエストごとに積み上げる問題を解消しました。recordConsoleMetricsは従来リクエスト経路の中でmeter.Int64Gauge/meter.Float64Gaugeを呼んでおり、7 つのゲージ (routerd.controller.dry_run.count、routerd.controller.reconcile.errors、routerd.controller.reconcile.last_duration_ms、routerd.resource.phase.count、routerd.dhcp.lease.active、routerd.dhcp.sticky.held、routerd.client.active.count) を ポーリングのたびに作り直していました。本リリースではsync.Onceシングルトン (getConsoleMetrics()) で 1 度だけ生成し、 以降はプロセス寿命を通して再利用します。#39 / #40 と合わせて、 summary polling が起こしていた API 呼び出しごとの heap 増加経路は これで塞がります。reverseDNSCacheが期限切れエントリを削除しなかったうえ、上限が 無かった問題を修正しました。これまで TTL は再ルックアップの可否 判定にしか使われておらず、ファイアウォールログ / コネクション表 / 通信フローに現れた個別の宛先アドレスがそのままキャッシュに永久に 残っていました。新たに導入したpruneLockedがlookupManyの 入口で期限切れエントリを削除し、それでもreverseDNSCacheMaxEntries = 4096を超えていれば、期限切れが 早い順にエントリを落として上限内に戻します。挙動を守る 2 件の テスト (TestReverseDNSCachePrunesExpiredEntries、TestReverseDNSCacheCapsAtMaxEntries) を追加しています。
v20260528.0402
修正
routerd serveの BGP コントローラー周期 reconcile で/run/routerd/bgp/control.sock宛ての Unix ソケット fd を漏らしていた 件を修正しました(homert02 v20260528.0325 でサーバー側SetKeepAlivesEnabled(false)適用後にも残っていた fd 増加の根本原因)。pkg/controller/bgp/gobgp_client.goだけが内部 HTTP クライアントの Transport でDisableKeepAlives: trueを設定していませんでした。 BGP の reconcile(約 30 秒間隔)ごとに routerd-bgp の control socket を 2 回(AppliedConfig + SaveAppliedConfig)dial し、それぞれ Transport のアイドルプールに残ったままガベージコレクションを待つ状態だったため、 +約 4 fd / 分のドリフトが説明できます。修正は conntrack-observer / dhcpv4-client と同じパターンを採用しています: Transport にDisableKeepAlives: true、リクエストにreq.Close = true、 返却時にdefer client.CloseIdleConnections()を入れ、次の reconcile までに接続が確実に閉じるようにしました。他の内部 HTTP クライアント (ingressservice / conntrackobserver / dhcpv4client / chain / phase2 / pppoesession / dnsresolver)は元から同じ対策が入っており、本修正で あわせて監査しました。
v20260528.0325
追加
- HealthCheck の各プローブ結果に egress / source / route の根拠情報を
記録し、リソースごとに直近 N 件の履歴を保持するようにしました
(#37)。
pkg/healthcheckのStateにFirstFailureTime/LastFailureTime/LastSuccessTime/FailureCount/History []ProbeRecord/LastEvidenceを追加。各ProbeRecord/ProbeEvidenceはFailureKind(timeout / connection_refused / network_unreachable / host_unreachable / no_route / dns_error / tls_error / address_in_use / permission / other)、EgressInterface、SourceAddress、SourceOrigin(pd / ra / static / dynamic)、NextHop、OutInterface、RouteSource、TunnelLocal、TunnelRemoteを保持します。Linux 環境ではip -j route getで nexthop / oif / src を取得します(非 Linux は スタブで、クロスコンパイルに影響しません)。cmd/routerd-healthcheckに運用者ヒント用フラグ--source-origin/--tunnel-local/--tunnel-remoteを追加し、 プローブが推定できない情報を補えるようにしました。イベント属性 (routerd.healthcheck.failureKind、network.egress.interface、network.source.address、network.source.origin、network.nexthop.address、network.out.interface、network.route.source、network.tunnel.local、network.tunnel.remote、加えてlastSuccessAt/lastFailureAt/firstFailureAt/failureCount) とStatusMapにも新フィールド を反映しているため、routerctl show / describeでそのまま参照 できます。履歴の既定数は 20 件、ROUTERD_HEALTHCHECK_HISTORYで 上書きできます。 - コントローラーごとに直近 N 件の reconcile 失敗履歴を control API
に公開するようにしました (#38)。
ControllerStatusにReconcileErrorHistory []ReconcileErrorEntryとMaxDurationAt *time.Timeを追加。各ReconcileErrorEntryはStartedAt/CompletedAt/Duration/DurationMs/Trigger/ResourceKind/ResourceName/Errorを持ちます。 コントローラーフレームワークにオプショナルなResourceObserver拡張を 追加し、各 reconcile の対象リソース kind / name を runtime store まで配線するようにしました(既存の Observer 実装には互換)。 履歴はメモリ内のみ(永続化は本 issue のスコープ外)、コントローラー あたり既定 20 件、SetErrorHistoryLimitで上書き可能です。routerctl status --show-errorsを追加し、テーブル表示で各 コントローラー行の下に履歴ブロックを縦に表示します。JSON / YAML 出力では従来の StatusMap 経由で自動的に新フィールドが含まれます。 新規routerctl doctor reconcile --since <duration>を追加し、 読み取り専用ステータスソケットに問い合わせて、指定範囲の reconcile エラー件数を pass / warn (≥1) / fail (≥10) で判定し、 detail に最大 5 件のサンプルを表示します。parseDiagnoseOptionsにも対応する--sinceと--status-socketフラグを追加しました。
修正
routerd serveの制御 / ステータスソケットで、polling クライアント がIdleTimeout未満の間隔で叩いてくる場合でも Unix ソケットの ファイル記述子が漏洩しなくなりました(#40 の追加 fix)。 v20260528.0244 の #40 fix では timeout の設定のみでしたが、 polling で keep-alive 接続が「アイドル」にならず IdleTimeout が 発火せず、結果として homert02 v20260528.0244 ではrouterd.dbfd は (#39 の通り) 4 で flat な一方、all_fdは依然として 1 分 あたり +4 ほど増加していました。今回は両方の内部 API サーバーでhttp.Server.SetKeepAlivesEnabled(false)を呼び、加えてcontrolapi.NewUnixClientのTransport.DisableKeepAlivesをtrueにしています。各リクエストはレスポンス後に必ず接続を閉じる ため、長時間運用でもソケット fd が増え続けることはなくなりました。 read / write / idle の timeout は不正な peer 対策の保険として 残しています。Unix ソケットの accept はコストが小さく、リクエスト ごとの close も hot path に再ダイヤルのペナルティをもたらしません。
v20260528.0244
修正
routerd serveの制御ソケット (/run/routerd/routerd.sock) と 読み取り専用ステータスソケット (/run/routerd/routerd-status.sock) で、Unix ソケットの file descriptor が漏洩しなくなりました (#40)。 両方のhttp.ServerインスタンスはこれまでReadHeaderTimeoutしか設定しておらず、polling 系クライアント(routerctl、webconsole、 内部デーモン群)から受け付けた接続が無期限に open のままでした。 本リリースでは、Web Console の HTTP サーバーと同じ 3 つのソケット レベル deadline を設定します:ReadTimeout: 30 s/WriteTimeout: 60 s/IdleTimeout: 2 分。どちらのソケットも Server-Sent Events を提供しないため、厳しめのWriteTimeoutでも 安全です。homert02 上の v20260528.0158 では、routerd.dbの ledger fd は (#39 の通り) 4 で flat でしたがall_fdは約 12 分で 41 → 86 に増加しており、本修正はその残存する増加を解消します。
v20260528.0158
修正
- リリース / CI ワークフローの「Capture Web Console screenshots」ジョブ
が、ナビゲーション後の
networkidle待ちで無限に hang する問題を 解消しました。Web Console はマウント時に/api/v1/events/streamの Server-Sent Events 接続を張り続けるため、playwright.page.goto({ waitUntil: "networkidle" })が解決しないことがあったのが原因です。webconsole/scripts/screenshot.mjsはwaitUntil: "domcontentloaded"- 30 秒の navigation timeout、15 秒の
waitForSelector("main")、 そして 5 秒のソフトなwaitForLoadState("networkidle")(timeout は 飲み込む)に切り替えました。.github/workflows/quality.yamlの screenshot ステップにもtimeout-minutes: 10を保険として入れており、 将来 flaky な実行があってもリリース全体を止められません。v20260528.0114タグはこの hang のため publish されないまま残って いますが、本リリースは機能面で完全に同等の内容に CI 修正を加えた ものに置き換わります。
- 30 秒の navigation timeout、15 秒の
v20260528.0114
修正
- 本番影響あり:
routerd serveが/var/lib/routerd/routerd.dbに対する SQLite ファイル記述子を reconcile のたびに漏洩しなくなり ました (#39)。LedgerインターフェースにClose()を追加し、SQLiteLedger.Close()で内部の*sql.DBを閉じ、resource.LoadLedger()の全呼び出し元でdefer Close()するようにしました。主たる漏洩源は 約 30 秒周期で走るIPv4PolicyRouteController.cleanupLedgerOwnedPolicyRoutesで、homert02 の v20260526.2335 では reconcile ごとにrouterd.dbとrouterd.db-walの fd を 1 組ずつ増やしていました。あわせてOpenSQLiteLedgerにSetMaxOpenConns(1)/SetMaxIdleConns(1)を 入れ、pkg/state/sqlite.goと同じ防御を行っています。万一Close()が呼ばれなくても 1 つの SQLite path につき 1 接続を超えない保険です。 Linux 限定の回帰テスト 2 件(pkg/resourceとpkg/controller/chain)で、10 回の open / close サイクル後に/proc/self/fdが増えないことを検証しています。 routerctl doctorの NAT / firewall の nftables チェックで、失敗時に 「exit status 1」だけが表示される問題を解消しました (#34)。チェック 失敗時にはtable=<family>/<name> cmd=<command> exit=<N> stderr=<≤200 文字> stdout=<≤200 文字>形式で原因を表示します。nftが非 0 で終了していても標準出力にテーブルの内容が含まれる場合は warn 扱いに格下げします。NAT44Rule/FirewallZone/FirewallPolicy/FirewallRuleの active / pending / missing 件数も detail に併記され、nft 側のシグナルとリソース側のシグナルを 1 か所で 突き合わせられるようになりました。
追加
routerctlの全サブコマンドで--helpを渡したときに、これまでの 「flag: help requested」ではなくUsage: / 要約 / Flags: / Examples:が表示されるようになりました (#35)。対象はdns-queries、connections、traffic-flows、firewall-logs、status、events、tailscale peers、wireguard list、ledger(integrity-check / vacuum / backup / prune-events)、apply、delete、set-log-level、restart-dns-resolver、firewall test、diagnose、doctor。要約では--sinceが duration 形式である ことを明示し、絶対時刻指定の--from/--toも本リリースで同時に 追加されたことを案内しています。routerctl dns-queriesとrouterctl traffic-flowsに絶対時刻範囲 と集計機能を追加しました (#36)。--from/--toはRFC3339、2006-01-02T15:04:05(タイムゾーン省略時は UTC)、2006-01-02 15:04:05を受け付けます。新規フィルタ:--rcode、--upstream、--qname-suffix、--duration-min(DNS)、--peer-suffix、--protocol、--asymmetric(flows)。新規--agg/--statsモードではSUMMARYと、DNS ではBY RESPONSE CODE/BY CLIENT/BY UPSTREAM/BY QNAME SUFFIX、flows ではBY CLIENT/BY PEER/BY PROTOCOLを、duration の p50 / p95 / p99 とあわせて出力します。 直接 DB 取得は--chunk-sizeで分割され、各チャンクが個別の ctx デッドラインを持ちます。DeadlineExceededのエラーには「ここまでに N 行取得済み、最後のlast tsは…」というヒントを含めます。--limit既定値は 100 から 500 へ、--timeoutは 5 秒から 30 秒へ 引き上げ、内部のDNSQueryFilter/TrafficFlowFilterのハード 上限も 1000 から 10000 へ引き上げました。Web Console には/api/v1/dns-queries/aggregateと/api/v1/traffic-flows/aggregateエンドポイントが追加され、既存の 行取得エンドポイントにも同じフィルタクエリパラメータが追加されて います(UI 側は本リリースでは変更なし)。
v20260526.2335
v20260526.2241 のドキュメントと CI の整合性を取り直した追従リリースです。 バイナリやランタイムの挙動には変更はありません。
追加
scripts/check-active-stable.shを追加し、ホームページ冒頭のカード、 各ロケールの導入ヒント、告知バー、docusaurus.config.tsがwebsite/src/pages/index.tsxのSTABLE_VERSION定数から乖離した 場合に CI を失敗させるようにしました。リリースの変更履歴に含まれる 歴史的な版表記と、stable.mdの「置き換え」「承継」記述は意図的に 対象外です。
修正
- ホームページの「最新安定版」カード、4 言語の導入ヒント、
website/src/pages/index.tsxのSTABLE_VERSIONをすべてv20260526.2241に揃えました。告知バーとstable.mdを昇格した 時に 5 箇所がv20260526.1607のまま取り残されており、トップ ページと告知バーが異なる安定版を案内する不整合が出ていました。 v20260526.2241のinstall.shに関する変更履歴エントリを、 実際に出荷した実装に合わせて書き直しました。install.shは ペイロードを cwd 相対のまま扱い(tests/installのテストハーネスとの 互換維持のため)、bin/routerdが cwd に無い場合は明示メッセージ とともに終了コード 2 で停止します。以前の文言はcd $script_dir設計を説明していましたが、この設計はtests/installを壊したため コミットd9f8817cで取り消されています。
v20260526.2241
修正
install.shは引き続きリリースペイロードを cwd 相対で扱います (tests/installのテストハーネスとの互換維持のため)が、現在の 作業ディレクトリに実行可能なbin/routerdが無い場合は実行を拒否 するようになりました。bin/*のグロブが一度も展開されないまま 「routerd upgrade completed」と成功表示するのをやめ、明示メッセージ とともに非 0 で終了します。これまではリリースツリーの外から(例:cd /tmp/routerd-release-vYYYYMMDD.HHmm && sudo ./pkg/install.sh ...) 実行すると cwd がペイロードの外になり、標準の routerd / routerctl バイナリはまったく更新されないにもかかわらず終了コード 0 とrouterd upgrade completedの成功表示だけが出ていました (--with-ndpi-archiveのペイロードだけが反映されていました)。 今後は展開したパッケージディレクトリ内から実行しない限り終了コード 2 で終了します。欠落ペイロード / 正規 cwd の両ケースを再現する リグレッションスモークテスト (scripts/install-sh-cwd-smoke.sh) を CI に組み込んでいます。- Web Console のゲートウェイ健全性画面が部分更新中に一時的に
Components 0 / Unknown / No gateway component status observedと表示されるちらつきを修正しました。reconcileSummaryはこれまでnext.gatewayHealth ?? current.gatewayHealthを使っていましたが、??はnull/undefinedの場合だけ右辺に切り替わるため、{ overall: "unknown", components: [] }のような薄いスナップショット が来ると値が入っていた前回値を上書きしてしまっていました。空の コンポーネント配列を含むスナップショットが来た場合に、前回のgatewayHealthを保持するよう変更しました。
v20260526.2152
追加
/api/v1/summaryのgatewayHealthがコンポーネントごとにselectedPath/preferredPath/fallbackReason/failedProbes/lastTransitionの根拠フィールドを返すようになりました。Web Console は選択中の出口経路が優先候補と異なる場合に、現在使用している フォールバック対象を強調表示します。
変更
- Web Console のゲートウェイ健全性を概要から専用画面へ分離しました (コネクション / クライアント と同じ構成)。概要には、全体ステータス、 pass / warn / fail / skip の件数、詳細画面へのジャンプボタン、 degraded / down 時の最も悪いコンポーネント名一行を含む集約カードのみを 残します。
修正
- BGP コントローラーが reconcile 時に適用済みのポリシー状態を再構築 するようになり、routerd を再起動しても同一内容のインポートポリシー 割り当てを再 PUT しなくなりました。これまで本番運用(homert02)では routerd 再起動のたびにすべての BGP ピアが切断・再確立し、hold-time 分の古い経路を経て ECMP が回復していました。
routerctl doctor dsliteが DSLiteTunnel のphase=Upを健全と みなし、EgressRoutePolicy の選択をstatus.selectedSource = "DSLiteTunnel/<name>"経由でも認識するようになりました(旧来のselectedCandidate名一致も併用します)。これまでdslite-pd-balancedのような集約候補名を使う本番構成では、gatewayHealthがokと 判定している DSLiteTunnel が毎回 WARN 表示になっていました。
v20260526.1607
追加
routerctl ledger prune-eventsの非 dry-run 実行時に、監査イベントrouterd.ledger.events.prunedを発行するようになりました(属性としてcutoff/deletedRows/ 実行時のuid/gidを含みます)。 events テーブルから prune そのものの実行履歴を確認できます。
変更
/api/v1/summaryのgatewayHealthがEgressRoutePolicy/NAT44Rule/HealthCheckも集約するようになりました。Web Console の 概要バナーに、選択中の出口経路と優先候補との一致状態が表示され、 フォールバック候補を使用しているときは目立つ警告になります。
セキュリティ
- Web Console の
/api/v1/configおよび generation の config / diff エンドポイントが、シリアライズ前にシークレット値を伏字化するように なりました(WireGuard のprivateKey/preSharedKey、Tailscale のauthKey、BGP / PPPoE / IPsec のpassword、WebConsole のinitialPassword、bearer / token 系フィールドなど)。キーは残し マーカ値に置換するため、UI の構造は壊れません。特権経路 (コントロールソケット、routerctl describe)は変更ありません。 管理 LAN に到達可能な運用者が Web Console 経由(読み取り専用でも)で 生のシークレット値を閲覧できてしまう経路を塞ぎます。
v20260526.1225
追加
routerctl doctor [area]: wan / dns / dslite / dhcpv6-pd / nat / firewall / rollback / disk / mgmt の一連の読み取り専用チェックを実行し、 PASS/WARN/FAIL を是正ヒント付きで報告します。FAIL があれば非0で終了するため スクリプトから利用できます。- SQLite state DB の保守コマンド:
routerctl ledger integrity-check/vacuum/backup <dest>/prune-events --older-than <dur>。prune は events 限定で、ロールバックと監査履歴を支える generations / objects / artifacts は保持されます。 ManagementAccessリソース: 管理用インターフェースと管理元 CIDR を宣言 します。宣言時、非 dry-run のapplyは、宣言された管理 IF が欠落・ firewall が SSH を遮断する設定(管理 IF が mgmt/trust の FirewallZone に 属していない)・有効な WebConsole が全アドレス bind を検出すると失敗します (--allow-mgmt-lockoutで上書き可)。api/v1/summaryにgatewayHealthを追加。DNSResolver/DSLiteTunnel/DHCPv6PrefixDelegationを集約し全体判定とコンポーネント別 状態を返します。Web Console の概要最上部にゲートウェイ健全性バナーを 表示し、degraded / down のときは理由と waiting を強調します。examples/home-router-mgmt-protected.yaml: 家庭ルーター置き換えの 「安全最小の出発点」 canonical example。3-role firewall(untrust / trust / mgmt)、DS-Lite 優先 + PPPoE フォールバック、ManagementAccess、mgmt アドレス固定 bind のWebConsoleを含みます。
変更
- Go の module path を
github.com/imksoo/routerdに変更しました (旧:routerd)。リリースアーカイブから導入するユーザーには影響しませんが、go install github.com/imksoo/routerd/...や外部 Go プロジェクトからの import が可能になります。
v20260525.1631
追加
routerctl restart-dns-resolver [name]: DNS リゾルバのサービスユニットを明示的に 再起動します(デーモンの健全性が損なわれたときの復旧用)。
変更
DNSResolverをrouterd serveの子プロセスではなく、独立した長寿命サービスユニット (routerd-dns-resolver@<name>.service)として動かすようにしました。routerd の再起動・ アップグレードで DNS が中断しなくなり、config 変更(DHCPv6-PD 収束を含む)はデーモンの reload エンドポイント経由でプロセスを再起動せずに反映され、install.shは upgrade 時に リゾルバを自動再起動しなくなりました。config ファイルが未生成のときはデーモンが空状態で 起動し、ランタイムに構成されます。
v20260525.0112
変更
DNSResolverは、すべての依存関係を待つのではなく、起動時に部分的にデーモンを 立ち上げるようになりました。すでに解決できている待ち受けアドレスと source で応答し、 残りが待機中の間はwaitinglist 付きのphase: Degradedを報告し、依存関係が 解決するとAppliedへ収束します。これにより、DHCPv6 prefix delegation を待つ間に DNS が拒否される起動時の空白時間がなくなります。
v20260525.0006
追加
routerd rollback --listとrouterd rollback --to <generation>を追加しました。 保存済みの設定世代を一覧し、通常の apply 経路で再適用します(既存の SQLite 世代を 利用し、別途スナップショット保管は持ちません)。routerctl set-log-level <debug|info|warning|error|default>を追加しました。 再起動せずに control socket 経由でログ詳細度を実行時変更できます(OTLP ログ sink にも反映)。routerctl describeがリソースのフェーズ / Reason / Message と、非正常フェーズでの 対処ヒント(remediation)を表示するようになりました。- 生成される設定 JSON Schema に、非自明なフィールドの説明(godoc 由来)が入るように なり、エディタ補完や検証メッセージが改善します。
- インストーラが
routerdシステムグループを作成します。グループに追加した運用者は sudo なしでrouterctl statusを実行できます。
変更
- 読み取り専用ステータス socket の所有を
root:routerd・モード0o660にしました。 socket 生成時に routerd 自身がグループ所有を設定するため、unit のGroup=設定に 依存しません。読み書き用 control socket は root 専用のままです。
削除
disabled:フィールドを削除しました。PPPoESession/HealthCheck/DSLiteTunnel/EgressRoutePolicyの候補ではenabled: falseを使ってください。 破壊的変更:disabled:を使っていた設定は書き直しが必要です。- 無効化済みで何もしなくなっていた
--controller-chain/--controller-chain-*フラグと、--observe-intervalの定期 observe を削除しました(イベント駆動のコントローラチェーンが 常時有効。--apply-intervalは変更なし)。これらのフラグを渡している host unit は アップグレード前に更新が必要です。
修正
install.shがアップグレード時にrouterd-bgpを自動再起動しなくなり、routerd バイナリ更新をまたいで BGP セッションと ECMP が維持されます。- 起動時に動的参照(
*From/upstreamFrom)が未解決の場合、ハードエラーや値の 暗黙ドロップではなくPendingとして報告し、依存先のステータスが現れた時点で再 reconcile するようにしました(DNS リゾルバ / DS-Lite / DHCP サーバ / VRRP 静的アドレス)。 - 終了時の
sql: database is closedログノイズを解消しました。state store が close 後の アクセスを安全に拒否します。
セキュリティ
- 読み取り専用ステータス socket が全ユーザーからアクセス可能でなくなり、root と
routerdグループのメンバーに限定されました。
v20260523.2327
追加
qemu-guest-agentをinstall.shの Alpine 依存先に追加しました。 Alpine 環境では既定で仮想化用エージェントをインストールします。- 仮想環境でのライブ ISO 起動時に、
scripts/build-live-iso.shがqemu-guest-agentを自動起動する処理を追加しました。
変更
- 将来のインタラクティブ運用に備え、サポート対象 OS 全体で
SSH サーバー依存 (
openssh/openssh-server) を既定に追加しました。
v20260523.1542
追加
- built-in DPI classifier を、nDPI なしでも実用できる通信分類器として拡張しました。 ペイロード由来の application hint を記録し、ペイロードの evidence と port フォールバックを区別します。 また、unknown のまま accept された flow は最初の数 packet だけ再分類する budget で追跡し、 よく使われる local protocol の軽量検出を追加しました。nDPI agent がある場合は、 これまでどおり結果の enrichment に使えます。
修正
- NixOS の生成出力で、routerd 管理の dnsmasq と DHCPv4 クライアント unit を修正しました。
raw パケットが必要な経路のため
RestrictAddressFamiliesにAF_PACKETを許可し、 dnsmasq は${pkgs.dnsmasq}のストアパスとして出力します。あわせて生成されるaccept_ra_defrtr = 0sysctl を NixOS golden output に反映しました。 - Alpine/OpenRC live ISO で、managed GoBGP を使う config の場合に
routerd serveより前にrouterd-bgpを OpenRC 下で起動するよう修正しました。 issue #28 の修正です。
v20260522.1334
★安定マイルストーン
この版は最初の推奨安定版マイルストーンです。本番ルーターでの稼働実績があります。詳細と推奨の理由は 安定版マイルストーン を参照してください。
追加
- routed eBGP peering 用に
BGPPeer.spec.ebgpMultihopを追加しました。0と1は直結 peer の既定動作のままです。2から255は GoBGP のEbgpMultihop.MultihopTtlとして設定され、routerd-bgpの適用済み状態にも 保存されるため、デーモン再起動後も同じ peer TTL を復元します。
v20260522.1045
修正
- GoBGP backend で、旧 FRR の
set ip next-hop peer-address相当の import 動作を復元しました。BGPRouter.spec.importPolicy.nextHopRewriteは既定でpeer-addressになり、受理した eBGP route は downstream speaker が第三者 next-hop を広告していても、学習元 peer address 経由で kernel FIB に投入され、 ECMP を維持します。router のステータスには rewrite mode と投入された next-hop を表示します。
v20260522.0824
修正
- 生成される
routerd.serviceからProtectSystemとReadWritePathsを削除しました。routerdは systemd のファイルシステム保護なしで動く前提であり、明示的な write-path のリストは、optional なディレクトリが存在しない clean host で systemd namespace エラーによるサービス起動失敗を招くことがありました。
v20260522.0742
修正
- NixOS module の
services.routerd.extraFlagsescape hatch を削除し、 アップグレード後も削除済みの--controller-chain*flag を渡し続けられないようにしました。 生成されるrouterd.serviceは、簡素化したサービスライフサイクルに合う固定のrouterd serve起動形を使います。
v20260522.0658
修正
- 旧 routerd リリースからの in-place アップグレードで、削除済みの
--controller-chain*flag やSystemdUnitresource が残っている場合でも 起動不能にならないようにしました。serve/applyは legacy な controller-chain flag を警告付きで無視し、installer はサービス再起動の前に legacy な routerd service unit を置き換え、保存済み config から user-facing なSystemdUnitresource を削除します。
v20260522.0006
変更
- BGP コントローラー backend を GoBGP ベースの長寿命
routerd-bgpデーモンに 置き換えました。BGPRouterとBGPPeerは local gRPC Unix socket 経由で 型付き GoBGP API object へ直接マップされ、applyは FRR artifact を render せず、routerd再起動でも BGP process を再起動せず、established な session を落としません。peer/path ステータスはvtyshのテキスト parse ではなくListPeer/ListPathから取得します。 import policy に一致する学習済み IPv4 best path は kernel FIB に投入し、equal best path は ECMP next-hop として扱います。未対応の BFD intent は黙って無視せず Pending にします。 MVP での IPv6 FIB route や non-Linux platform など、kernel FIB に投入できない 学習 route は黙って落とさず、prefix ごとの install reason と router の Degraded な ステータスとして表示します。routerd-bgpデーモンは最後に適用した global / peer / advertisement intent を/var/lib/routerd/bgp/applied.jsonに atomic rename で保存し、 デーモン再起動時に復元します。これによりrouterdreconnect 後も config drift を検出し、 stale な live peer を黙って採用しません。 - コントローラー runtime ステータスで、累積した reconcile failure と現在の異常を分離しました。
reconcileErrorCountは lifetime counter のまま残し、currentError、consecutiveErrorCount、lastErrorTime、lastErrorClearedAtで最新 reconcile が 失敗中なのか、過去の一時 error がすでに回復済みなのかを判定できます。 EgressRoutePolicyの no-op reconcile 回帰 test を追加し、mode: priorityの dry-run ステータスを含む default-route selection が不変の場合にrouterd.lan.route.changedや resource ステータス event を churn しないことを保証しました。- 起動時に supervised な DHCPv6 client socket の作成を待っている間、
DHCPv6Informationは想定内の socket race を bootstrap の WARN として繰り返し 記録せず、Pending state として表示するようになりました。 - 各
IPv6RouterAdvertisementからRogueRADetectorを自動導出するようにしました。 新しいrouterd-ra-observerデーモンは対象 interface の ICMPv6 Router Advertisement を passive に観測し、flat L2 segment で active な RA Guard を試みず、homert02 以外の router をステータス とrouterd.ipv6.ra.rogue_detectedevent で通知します。 - selection-only の
EgressRoutePolicyステータス/event 用語を、hard-code されたdryRun: trueからrole: advisory/advisory: trueに改名しました。 CLI の--dry-runは、host 変更を適用しない preview の意味のままです。 - stale な legacy client デーモン unit の cleanup は、active な unit を停止せず Pending ステータスと警告 event で保留するようになりました。inactive な stale unit は引き続きステータス/event の証跡付きで削除します。
v20260521.1953
修正
- routerd 再起動時に firewall と TCP MSS clamp の render 結果が変わって
いない場合は既存の nftables dataplane rule を維持し、
routerd_filterとrouterd_mssへの不要なflush tableでの再読み込みを避けるようにしました。 - 無変更 reconcile の冪等性を強化しました。stale な client デーモン unit の cleanup は ステータス/event に記録し、static/DHCP IPv4 route は live kernel route が一致する 場合に skip し、動的な nftables address set は set 全体を flush せず element 差分で 更新します。NTP/BGP のサービス操作理由もステータス/event で確認できるようにしました。
v20260521.1155
修正
EgressRoutePolicyのmode: priorityがselection: highest-weight-ready、 candidate のweight、disabled: trueを正しく反映するようにしました。 選択された経路のステータス も一貫して出し、candidate 削除後に残る ledger-owned な policy-route rule と route table を削除します。
v20260521.0918
修正
EgressRoutePolicyの selection-only reconciliation がmode: priority、mode: mark、mode: hashの policy-route ステータスを上書きしないようにしました。 これらの mode はステータス owner を 1 つに統一し、適用済みの policy selection が 変わっていない場合に dry-run のrouterd.lan.route.changedevent が 繰り返し発生する問題を防ぎます。
v20260521.0843
修正
- Linux kernel が既存の delegated host address を設定上の
/64ではなく/128など別の prefix length で表示する場合に、IPv6DelegatedAddressの apply event が繰り返し発生する問題を修正しました。 lastTransitionAttimestamp だけが更新されたステータス refresh では、routerd.resource.status.changedevent を出さないようにしました。
v20260521.0827
追加
NTPServer.spec.allowCIDRFromを追加しました。LAN NTP client の許可範囲をIPv6DelegatedAddress/<name>.addressやDHCPv6PrefixDelegation/<name>.currentPrefixなどの動的なステータス field から 導出できます。
v20260521.0802
追加
install.sh --with-ndpi-archive PATHを追加しました。通常の static routerd archive と nativerouterd-ndpi-agent-libndpiarchive を、1 つの ロールバックトランザクションとして適用できます。インストーラは--with-ndpiを満たす前に、 feature archive の target、path safety、存在する場合の checksum、libndpiLoaded: trueself-test を検証します。
修正
- 現在の schema から削除済みの resource kind について、serve 起動時に stale な object ステータスの行を cleanup するようにしました。routerd は削除前に timestamp 付きの SQLite バックアップを作成し、audit event を記録します。バックアップを作成できない 場合は cleanup を skip します。
v20260521.0731
修正
- 標準のリリースアーカイブに静的リンクのフォールバック版
routerd-ndpi-agentしか含まれない 場合でも、すでにインストール済みのネイティブrouterd-ndpi-agentがselftestでlibndpiLoaded: trueを返すなら保持するようにしました。またinstall.sh --with-ndpiは、最終的にインストールされたエージェントがlibndpiLoaded: trueを返さない場合に失敗します。 spec.includeApplicationLayer: trueが設定されているのに nDPI agent の nativelibndpibackend が load されていない場合、TrafficFlowLogをTrafficFlowApplicationLayerUnavailablereason 付きのPendingとして表示する ようにしました。- 派生された
routerd_mssnftables table を router-owned artifact として登録し、 routerd が再生成している table が orphan として誤表示されないようにしました。 routerctl show derived-resourcesは stale な派生 state を既定で隠し、 audit/debug 用に--include-staleを追加しました。また削除・rename 済み kind の state DB 行を手動 SQLite 編集なしで消せるようにrouterctl delete --forceを追加しました。- TCP MSS clamp を source path aware かつ downward-only にしました。
Interface.spec.mtuでtailscale0のような低 MTU source interface を表せます。 routerd は source/destination path ごとにmin(source MTU, destination path MTU)を使い、nftables は advertised MSS が派生値より大きい SYN packet だけを書き換えます。
v20260521.0039
修正
- 削除された
PPPoESessionについて、ownership ledger に残る生成済み artifact を garbage collect するようにしました。対象は PPP peer file、runtime socket、 runtime ディレクトリ、state ディレクトリ、停止・無効化済みの systemd unit です。 - Live ISO が CD-ROM として接続された read-only な ISO9660/UDF config media からも
router config を import できるようにしました。Proxmox の
media=cdromでROUTERD_CONFIGlabel を付けた config ISO を対象に含めます。 - 永続化された OpenRC の
routerddefault runlevel entry により、Live ISO の USB config restore より前にrouterd serveが起動してしまう問題を防ぎます。 live autostart helper はこの runlevel entry を削除し、config restore とapplyの後に既存のserveprocess を再起動するため、復元された BGP config が FRR に再読み込みされます。
v20260520.2307
修正
- FRR/keepalived 統合を含む場合だけ、生成される
routerd.serviceにCAP_DAC_OVERRIDEを追加しました。Ubuntu の FRR では/run/frrがfrr:frrかつ mode0755になることがあり、frrvtygroup だけではfrr-reload.pyが/var/run/frr/reload-*.txtを作成できないためです。 frr-reload.pyの permission failure を generic なFRRReloadFailedではなくFRRReloadPermissionDeniedとして分類するようにしました。WireGuardInterface/WireGuardPeerが config から消えた場合に、routerd 管理下の 古い WireGuard interface と peer ステータスを削除するようにしました。 resource 削除後に state DB を手動編集する必要をなくします。
変更
- Kubernetes BGP example の import prefix を MetalLB LoadBalancer pool の
10.250.0.0/24に更新し、home-router の sample は 2 台の k8s route node と 個別に peer する構成へ調整しました。
v20260520.2227
修正
- OpenRC
routerdservice script 追加後の Live ISO build を修正しました。 script を書き込む前に overlay の/etc/init.dディレクトリを作成します。
v20260520.2222
追加
- BGP prefix ステータスと
routerctl show bgpに route selection diagnostics を 追加しました。FRR が field を出す場合、select-deferred、no-best-path、 not-installed-to-zebra の状態を確認できます。 - Kubernetes/edge router 向けに
BGPRouter.spec.convergenceProfile: fastを 追加しました。fast profile は短い BGP timer を派生し、fresh boot 時の stale-path selection defer を避けるため graceful restart を既定で無効にします。 - Live ISO が
ROUTERD_CONFIGlabel の USB partition から config を読み込める ようにしました。boot helper は/routerd/hosts/<hostname>.yaml、/routerd/hosts/<mac>.yaml、/routerd/router.yamlを選び、source と SHA256 を/run/routerd/へ記録します。
v20260520.2107
追加
- BGP / FRR control-plane design note を追加し、readiness、reload、 verification、failure status、Live ISO 受入 scenario を明文化しました。
修正
- BGP コントローラーが各 reconcile で FRR の service state を確認するようにしました。
Alpine/OpenRC または systemd host で FRR が stopped/failed の場合、
vtyshprobe とfrr-reload.pyの前にサービスを起動・再起動します。 - BGPRouter の Healthy 判定を厳格化し、service state、
vtyshround-trip、tcp/179listen、render 済みのrouter bgp <asn>stanza がすべて揃った 場合だけ Healthy と判定します。 routerctl statusを resource フェーズ から集約するようにし、Pending/Error の BGP resource がコントローラーランタイムの成功更新に隠れないようにしました。
v20260520.2007
修正
- BGP コントローラーの FRR readiness 判定から TCP VTY gate を取り除き、
vtysh -c "show running-config"を control-plane probe と running config の diff の入力として使うようにしました。これにより TCP VTY を無効にした Alpine FRR build でも、初回収束時にfrr-reload.pyへ到達できます。 - FRR control 不可、権限不足、reload 試行、reload 後の反映不完全をステータスで 明示するようにしました。
- Alpine Live ISO の autostart が、既に
routerd serveが動いている場合は 2 つ目のrouterd serveを起動しないようにしました。
v20260520.1904
修正
- BGP コントローラー reconcile 中の一時的な FRR reload lock 失敗を retry し、
初回 boot 時にも手動の
frr-reload.pyなしでbgpdconfig まで到達できる ようにしました。 - Alpine Live ISO の DHCP client を初回リース後も常駐させ、live router 用の 安定した DHCP hostname を派生し、既定では DHCP option 61 を送らないことで Windows の DHCP reservation が Ethernet MAC に一致し続けるようにしました。
v20260520.1737
追加
mode: vrrpのVirtualAddressに FreeBSD CARP backend を追加しました。 runtime コントローラー、rc.d rendering、validation、tests、最小構成のexamples/freebsd-vrrp.yamlを含みます。- ingress/local router service の listen-port 衝突 validation と、
Linux nftables 向けの
IngressServicesourceHash/randombackend distribution を追加しました。 - FRR BGP の connected/static redistribution、BGP community の send/accept/set
policy、観測 community のステータス 解析、
examples/lan-advertise-with-community.yamlを追加しました。 - VRF-backed FRR BGP instance による multi-instance
BGPRoutersupport、 listen-address collision validation、router ごとの observed ステータス、examples/multi-instance-bgp.yamlを追加しました。 - FRR 管理の BGP peer 向け BFD support、FRR
bfddデーモン rendering、 BGP watcher tuning field、BFD ステータス observation、examples/bgp-bfd.yamlを追加しました。 - transit routing 用の BGP export policy allow-list と、
BGPRouterがある場合の FRRbgpdデーモン 自動 enable を追加しました。 - Kubernetes の Pod / Service CIDR static route 向け
ClusterNetworkRoutehelper と、BGP peer password / VRRP-CARP authentication 用のpasswordFrom/authenticationFromsecret source を追加しました。 - 一時的な
IngressServicebackend maintenance 用のrouterctl drain/undrainと、VRRP production tuning documentation およびexamples/vrrp-tuning-presets.yamlを追加しました。 - BGP / VRRP / IngressService の Web 管理画面運用ページに SSE 更新、 filter 付き event log、軽量なローカル SVG metric trend を追加しました。
- stateful なファイアウォール rule expression として ICMP / ICMPv6 type、送信元 / 宛先の複数 port match、nftables rate limit、送信元ごとのコネクション 上限を追加しました。
- IPv4/IPv6 unicast の dual-stack BGP rendering / observation、
VirtualAddressによる VRRPv3/CARP VIP support、AAAA record 自動派生、 dual-stack BGP / Kubernetes API VIP example を追加しました。 - OTLP environment rendering と stdout / syslog / Loki への内蔵 routerd event
forwarding 用の
ObservabilityPipeline、および apply / コントローラー mutation を file lease で gate するRouterdClusterを追加しました。 - Alpine/OpenRC 向け VRRP render support を追加しました。
routerd applyが keepalived config artifact を書き、OpenRC のkeepalivedサービス管理と live VRRP role observation はコントローラーランタイムが担当します。Alpine 向けの Kubernetes VIP example も追加しました。 - Alpine Live ISO の経路を改善し、VRRP コントローラーの既定を live にし、
routerctl show vrrpは live address から role を再観測します。version output には commit を埋め込めるようにし、FRR reload tooling dependency と、 非 blocking な setup wizard の動作も追加しました。 - live な VRRP reconcile で keepalived の no-op な reload/restart を避け、 最後に keepalived を reload/restart した時刻と理由をコントローラーステータスに 出すようにしました。
- VRRP のデーモン lifecycle は コントローラーランタイム に限定しました。
routerd applyは keepalived の成果物を生成するのみで、reload / restart は せずコントローラー handoff ステータスを記録します。 - IngressService の live な nftables apply を独立した NAT44 dry-run mode から分離し、
hostname の DNSZone coverage は警告に緩和しました。外部 DNS 管理の名前は
externalDNSで自動公開と警告を抑止できます。 - IngressService の同一 interface hairpin SNAT と、forwarding 用の runtime
ip_forwardsysctl を自動適用し、routerctl show ingress --verboseで forwarding、nftables、conntrack の dataplane 状態を確認できるようにしました。 - listen interface prefix が YAML に無い Live ISO 風の構成でも、
private
/24内の IngressService listen/backend address はhairpin.mode: autoで hairpin が必要と判定するようにし、verbose な ingress 出力は 期待される nftables SNAT が無い場合に警告を出すようにしました。 - systemd、OpenRC、rc.d、NixOS の service artifact 名と lifecycle command を扱う
pkg/servicemgrabstraction を追加し、service artifact の intent generation を そこへ寄せて、resource ごとの OS switch drift を減らしました。 - すべての checked-in な example config について Linux、Alpine/OpenRC、
FreeBSD/rc.d、NixOS の render スナップショットを固定する golden test と、
netns 側の compatibility wrapper を追加しました。
pkg/servicemgrには lifecycle hook を追加し、FRR の config-check + live reload、keepalived の reload/restart 分離、signal-based な デーモン reload が generic restart に潰れないようにしました。 - bespoke lifecycle command の golden test と
make check-bespoke-lifecyclegate を追加しました。FRR live reload、keepalived no-op/reload、dnsmasq SIGHUP、DHCP デーモン IPC、BFD デーモン enablement、IngressService の nftables-only backend rotation、VRRP track artifact、DS-Lite dataplane hook、DHCP event デーモン ordering、FRR graceful-restart observation を固定します。 - nftables / pf の render・diff・reload 経路向けに、挙動を変えない
firewall backend abstraction を追加しました。nftables の
ct state、jhash、numgen、hairpin conntrack expression と、pf のrdr、nat-anchor、 hairpin NAT syntax を regression contract で固定します。 - netplan、systemd-networkd drop-in、NixOS module、FreeBSD rc.conf fragment 向けに、挙動を変えない network config backend abstraction を追加しました。 IPv4/IPv6 の address と route は共通の declaration として扱います。
- PPPoE、VRRP/CARP、FRR、dnsmasq、DHCPv6 PD、DNS リゾルバ、Tailscale の service-backed artifact intent を ServiceManager declaration table に整理し、 systemd/OpenRC/rc.d/NixOS の ownership が出力変更なしで揃うようにしました。
- firewall hole derivation と OS 別 interface/network artifact の render golden coverage を拡張し、Linux の netplan/systemd-networkd output と Alpine の nftables スナップショットも固定しました。
- abstraction layer regression coverage を強化し、cross-OS semantic test、 invalid spec check、firewall backend error propagation のステータス/event、 edge-case declaration、race-tested reload、80% coverage gate、4 OS の bespoke lifecycle command matrix を追加しました。
修正
- BGP の
applyを デーモン lifecycle から分離しました。routerd applyは FRR config とデーモン artifact の render のみ行い、bgpdの enable/restart、vtyshvalidation、live reload、peer observation はrouterd serve側が担当します。 - FRR JSON が数値フィールドを文字列として返す場合の BGP observation を修正し、
routerctl show bgpは古い stored ステータスを live なvtyshoutput で更新して 表示するようにしました。 - FRR の readiness と reload ステータスは BGP コントローラー 側に残し、コントローラーランタイム
の serve が pending/error state を報告できるようにしました。
applyはbgpdやfrr-reload.pyを待ちません。 - Web 管理画面に 経路 ビューと
/api/v1/routesエンドポイント を追加しました。kernel、 BGP、static、DHCP、policy route の情報と BGP peer state を同じ画面で確認できます。 pkg/api/provides.goで各 kind のステータス output (provides) を宣言型に定義し、 config validator がaddressFrom/gatewayFrom/dnsServerFrom/sourceAddressFrom/dependsOnの Kind/name 存在 + 参照先 field の provides 整合を loader 時点で検査するようにしました。routerctl show derived-resourcesを追加し、router intent から自動派生される package / kernel module / sysctl / systemd-networkd/resolved adoption / tunnelrp_filterを確認できるようにしました。spec.whenにany:/all:predicate を追加しました。StatePolicyを分離せずに resource を条件付きで活性化でき、入れ子も可能です。- 新 kind:
DHCPv4Client,PPPoESession,VirtualAddress(spec.family: ipv4|ipv6),EgressRoutePolicy(mode: priority|mark|hashと candidatetargets[]),DNSForwarder,DNSUpstream, standaloneBFD,FirewallEventLog, standaloneLogRetentionを追加。 - 型付き
LogSink(type: syslog|otlp|webhook|file|journald) とFirewallEventLog(events: deny|allow|rateLimit|connLimit+ zones/rules filter + sampleRate + sinks + retention ref) を追加。 make check-examples-line-limitsでexamples/*.yamlを 200 行以下、各 resource を 50 行以下に強制する CI gate を追加。examples/home-router.yaml を 1800 行から 194 行へ縮減しました。- HealthCheck / VirtualAddress(mode:vrrp) / WAN tunnel から network-utils / vrrp(keepalived) / rp_filter sysctl を自動派生するようになりました。
変更
DNSResolverを分割しました。DNSResolver本体は listen + cache + queryLog のみです。 条件付きフォワーダーと upstream はDNSForwarder/DNSUpstreamで別の resource として宣言し、resolver を参照します。TCP upstream と DoTtlsNameも新たに サポートしました。- BGP の BFD を分離しました。
BGPPeer.spec.bfdはBFD/<name>参照のみ受け付け、inline な設定 は loader で reject し、移行ガイドを返します。 TrafficFlowLog.spec.includeNDPIをspec.includeApplicationLayerに rename、retentionは独立したLogRetentionresource に分離しました。ClientPolicy.classificationをmode+ 構造化match(macs/ouiPrefixes/hostnamePatterns/dhcpFingerprints) に整理しました。- DHCPv4 reservation を動的プールの範囲外にも置けるようにしました (dnsmasq の static-only な割当と整合します)。
- loader は不明な kind や削除済みの kind/field を黙って無視せず、移行ガイドつきで エラーを返します。
削除
SystemdUnitの user-facing な宣言を削除しました。systemd / OpenRC / rc.d / NixOS の service unit は router intent から自動派生します。KernelModule,NetworkAdoption,Link,NixOSHost,IPv4ReversePathFilter,PathMTUPolicy,StatePolicy,IPv4DefaultRoutePolicy,IPv4PolicyRoute,IPv4PolicyRouteSet,IPv4SourceNAT,DHCPv4Lease,PPPoEInterface,VirtualIPv4Address,VirtualIPv6Address,DHCPv4Scope,DHCPv6Scope,FirewallLogを user-facing な kind から削除しました。それぞれ loader で reject され、移行先 (自動派生 / narrow override / 吸収先の kind) を案内します。Package/Sysctl/SysctlProfileは narrow escape hatch としてのみ残し、 通常の router intent には不要です。- 低レベル mechanics field を削除:
HealthCheckdaemon/socketSource/fwmark/sourceInterface/sourceAddress*/via; BGPkeepalive/holdTime/connectRetry; VRRPadvertInterval/preemptDelay; WireGuardfwmark/table; Tailscaleoperator/binaryPath; DHCPv6PrefixDelegationiaid/duidType。 DNSResolver.spec.sourcesを削除しました。代わりにDNSForwarder/DNSUpstreamresource で宣言してください。--controller-chainpublic flag をrouterd serve/routerd applyから 削除しました。コントローラー chain は本番 runtime の唯一の経路です。
v20260519.0743
変更
- 公開 documentation と example configuration の名前を整理し、内部 lab の hostname、domain、management network address が website や再利用用の example ではなく internal notes に残るようにしました。
- internal design / soak note を公開 Docusaurus docs tree から外し、native nDPI
と RA/DHCPv6-PD coverage の lab validation policy を
internal/notes/へ 記録しました。
v20260519.0713
修正
routerctl show bgp、routerctl show vrrp、routerctl show ingressが ownership ledger を開かないようにし、明示したステータス store を使う場合は default の ledger path が書き込めない環境でも動くようにしました。
v20260519.0708
追加
- Kubernetes edge 用に、FRR backend の
BGPRouter/BGPPeer、 keepalived backend のVirtualAddress、およびIngressServicebackend health/failover コントローラー を追加しました。 routerctl show bgp、routerctl show vrrp、routerctl show ingressの table ビュー、VIP/ingress のhostnamefield からの DNS record 自動派生、 BGP/VRRP/Ingress の transition と backend health 用の OTel metrics を追加しました。- Web 管理画面に BGP、VRRP、IngressService の専用ビューと JSON エンドポイント を追加しました。
変更
- FRR BGP 設定は
vtysh -C -fで検証し、frr-reload.py --reloadで 差分適用します。VRRP は unicast peer とnopreemptを既定にし、 track hysteresis とpreemptDelayを扱います。BGP、VRRP、IngressService listen port の firewall hole も自動派生します。 - BGP reconcile では dry-run の書き込みが後続の live apply を隠さないようにし、 初回の live 観測時は FRR running-config を比較してから reload するため、 既に一致している session を no-op な reload で reset しません。
v20260518.1810
追加
- ネイティブな nDPI classification を有効化する host 向けに、別アーカイブ
routerd-ndpi-agent-libndpi-linux-amd64を追加しました。通常の Linux リリースアーカイブは完全な静的 binary のまま維持し、optional な nDPI agent の override はCGO_ENABLED=1 -tags libndpiで build し、libndpi self-test で 検証します。
v20260518.1431
追加
- コントローラー reconcile の runtime ステータスを control API、log、OpenTelemetry metrics/traces、Web 管理画面の コントローラー ビューに追加しました。コントローラー ステータスは interval、trigger、実行回数、error 回数、last/average/max duration、 最新の error を返します。
v20260518.1301
変更
- 現在のコントローラーランタイム 設定の path では使われなくなった dead な compatibility helper と、旧 raw systemd unit renderer を削除しました。
v20260517.2339
追加
- 番号付きの構成図、図と YAML の対応 comment、安全上の注意、検証済み sample YAML を含む「設定事例集」セクションを追加しました。基本的な IPv4 NAT、 LAN DHCP/DNS、DS-Lite、PPPoE、port forwarding、guest 分離、multi-WAN failover、local DNS redirect、Tailscale、WireGuard、telemetry export の パターンを用意しました。
- IPv4 route policy resource から参照される health check は、参照元の route
candidate または target から socket mark を導出するようにしました。単体 probe
用の
spec.fwmarkは引き続き利用でき、明示した mark と導出した mark が衝突する設定は validation で拒否します。
変更
- Linux のアップグレードでは、routerd helper の systemd service が削除済みの旧 binary を
実行している場合、または unit file が helper process の起動後に再生成された場合に
限って helper を更新するようにしました。installer はその判定の前に
routerd.serviceと routerd 管理の unit file の反映が落ち着くのを待ちます。 - リリースインストーラーは NixOS で host service manager の変更を行わないようにしました。
これにより、
/etc/systemd/systemが読み取り専用で service unit を宣言型に管理する host でも、archive からの binary 更新が失敗しません。 - conntrack の procfs file が host に存在しない場合、conntrack observation は interval
ごとに警告を出す代わりに
Unavailableステータスを記録するようにしました。 - FreeBSD の
--skip-service-managerapply は、生成 helper、管理対象 dnsmasq、 pf/pflog service activation の rc.d/service 操作を抑止するようにしました。 その一方で、rc.conf による network state と直接のpfctlrule loading は継続します。 recovery や bootstrapping の経路が base の rc boot sequence と競合するのを避けます。 - FreeBSD のアップグレードでは、config 管理の
routerdrc.d script を generic な bootstrap template で置き換えず保持するようにしました。Linux で config 管理のrouterd.serviceを保持する挙動と揃えています。 routerd serveは SIGTERM/SIGINT を受けたときに control socket と status socket を クリーンに shutdown するようにしました。FreeBSD のdaemon(8)配下で rc.d restart する際、 強制 KILL に進まず停止できます。- routerd state の SQLite database は、既存の busy timeout と併せて WAL mode を使うように
しました。ステータス reader とコントローラーが重なったときの一時的な
SQLITE_BUSYを 減らします。
v20260517.1808
修正
- Debian/Ubuntu 用のリリースインストーラーは、完全な
dnsmasqpackage ではなくdnsmasq-baseを導入するようにしました。distro 側のdnsmasq.serviceが 有効化され、routerd 管理の dnsmasq instance と競合するのを避けます。
v20260517.1800
修正
- コントローラー と helper probe からの一回完結の HTTP-over-Unix 呼び出しは
keep-alive を無効化し、idle な transport を明示的に閉じるようにしました。
定期的なステータス polling により、
routerd、health check helper、DHCP client、 DNS/DPI helper service に多数の確立済み Unix socket が残り続けるのを防ぎます。
v20260517.1533
修正
- リリースヘルパーは、schema check の前に管理対象の config schema と control API schema を再生成するようにしました。API type の変更がリリースの終盤で失敗する 代わりに、リリースコミットに含まれます。
routerctlは デーモン 起動直後の一時的な Unix socket 接続失敗を、読み取り専用の control API request に限って retry するようにしました。routerctl statusは 既定で別の読み取り専用 status socket を使い、apply と delete は引き続き権限付きの control socket だけを使い、retry しません。
v20260517.1510
追加
- Web 管理画面の コネクション で、
LocalServiceRedirectにより処理されたフロー に印を付けるようにしました。live な conntrack tuple と解決済みの set ステータスから 判定できる場合は、redirect rule と宛先IPAddressSetも表示します。 - Web 管理画面の ファイアウォール で、拒否ログの行の宛先
IPAddressSetmatch を表示する ようにしました。明示的なFirewallRule.destinationSetRefsによる match と、 現在設定済みの set に含まれている宛先を区別して表示します。
v20260517.1401
修正
syscall.Statfs_tの block counter が signed integer type になる FreeBSD でも Web 管理画面の disk usage collection が compile できるようにしました。
v20260517.1353
修正
- リリースヘルパーは、最初のリリースセクションが
Unreleasedではない変更履歴を 拒否するようにしました。また、以前の helper 実行で残っていた空のリリース 見出しを、管理対象の 変更履歴 file から削除しました。
v20260517.1351
変更
routerd-dpi-classifierに明示的な classifier engine facade を追加しました。 既定は built-in parser で、auto/ndpi-agentmode では将来のrouterd-ndpi-agentUnix socket service に問い合わせ、失敗時は built-in parser へフォールバックできます。- Web 管理画面の コネクション で、DPI がフローを識別できない場合でも、 TCP port 4317 を OTLP、TCP port 4318 を OTLP/HTTP として表示するようにしました。
- Web 管理画面の 概要 に host の CPU、memory、root filesystem の使用率と classifier 側の DPI processing latency を表示し、router 内部の負荷悪化を routing や DPI の状態と並べて確認できるようにしました。
- Web 管理画面の クライアント と コネクション を相互に移動しやすくしました。 client 行からその client の観測アドレスで絞り込んだ コネクション を開け、 connection 詳細から対応する local client identity へ戻れます。
- Web 管理画面の コネクション で クライアント スナップショットを作る際に、直近の traffic-flow 観測も読み込むようにしました。これにより、IPv6 privacy address でも client へ 戻せる可能性が上がります。また、source エンドポイント では既知の identity にまだ 統合されていないアドレスでも クライアント 検索へ移動できます。
- Web 管理画面の検索入力に、文字が入っているときだけ表示されるクリアボタンを 追加しました。
- リリースヘルパーは clean な working tree からだけ実行するようにし、空の tag
見出しを作る代わりに、現在の
Unreleasedの内容をリリースタグへ昇格するように しました。
追加
IPAddressSetとLocalServiceRedirectを追加しました。IPAddressSetは 直接指定した IPv4/IPv6 address と FQDN のA/AAAArecord を、再利用可能な nftables named set へ解決できます。LocalServiceRedirectは、その set 宛てに LAN client から出る平文 DNS/NTP 通信を router の local service へ redirect できます。 DoH/DoT や router 自身が発信する health check は対象にしません。FirewallRule、NAT44Rule、IPv4PolicyRoute、IPv4PolicyRouteSetがdestinationSetRefsとexcludeDestinationSetRefsでIPAddressSetを参照できる ようになりました。FQDN-backed な address set を firewall filtering、NAT の適用範囲、 IPv4 policy routing の条件として再利用できます。- runtime の
IPAddressSetrefresh コントローラー を追加しました。参照されている nftables set は DNS TTL に基づいてその場で更新します。観測した最小 TTL の半分を 基本にし、60 秒より短くせず、必要に応じてrefreshIntervalで上限を指定できます。 firewall、NAT、policy table の全体を reload せず、FQDN-backed set を新しい状態に保てます。 - optional command として、初期版の
routerd-ndpi-agentservice boundary を追加しました。 既定の build は libndpi backend が利用不可であることを報告し、-tags libndpibuild では同じ IPC surface の背後で native library に link します。 routerd-ndpi-agentがフローごとの観測 state を持つようにしました。 flow TTL、フロー数の上限、先頭ペイロードの packet 数の上限と、observed、classified、 unknown、skipped、error、pruned packet のステータス counter を持ちます。routerd-ndpi-agent向けの初期 libndpi backend を追加しました。libndpibuild tag で opt-in し、native な flow state を agent 内に閉じ込めたまま、 firewall logger から届く full packet observation を分類できます。- libndpi development files が入っている環境で optional native backend を build
するための
make build-ndpi-agent-libndpitarget を追加しました。 routerd-dpi-classifierが--engine autoまたは--engine ndpi-agentで設定されている場合に、systemd、OpenRC、FreeBSD rc.d、NixOS でrouterd-ndpi-agentのサービス定義を生成するようにしました。- DPI フローと traffic flow の record が、従来の app label に加えて、 detected protocol、application protocol、category、confidence、risk、 metadata などの typed な classifier field を保存するようにしました。
routerd-dpi-classifierのステータスが、デーモンで処理した classify request の average latency と maximum latency を報告するようにしました。
修正
- Linux の upgrade 時に、差し替え前の削除済み binary を実行し続けている
routerd helper の systemd service があれば、
install.shが再起動するようにしました。 - nDPI agent の結果が application を識別していても TLS SNI、HTTP Host、DNS query
などの詳細を持っていない場合、
routerd-dpi-classifierが built-in parser の有用な hint を保持するようにしました。 - DPI helper デーモン が Unix socket を bind するとき、socket ではない path を
誤って unlink しないようにしました。また
routerd-ndpi-agentは native な libndpi state を明示的に close します。 - Web 管理画面の traffic-flow 読み取りは、writer が schema 移行を行う前の legacy な SQLite file に新しい DPI column がない場合でも成功するようにしました。
v20260516.2302
変更
- Web 管理画面の コネクション で、source から destination への経路を固定幅の route column に揃え、state、protocol、provider、traffic、timeout などの metadata を別の badge 領域に分けました。
- Web 管理画面の connection label は、transport/application identity と
destination provider を分けて表示するようにしました。
google-httpsのような旧 provider 固有の label はTLSに正規化し、 Google、AWS、Microsoft、Apple、Cloudflare は別の destination provider badge として表示します。 httpsなどの destination service 名は、connection の行に追加情報を与える場合に、 protocol badge として表示するようにしました。
修正
- 展開した connection detail で、destination service と provider の badge が detail column 全体に伸びず、内容の幅のまま表示されるようにしました。
- 展開した connection detail で、source と destination の identity text が compact な行用の幅で省略されず、利用可能な幅を使って折り返すようにしました。
- コネクション の
Showingmetric で、API の取得上限により行が打ち切られた場合に、 filtered rows、loaded rows、総 conntrack count を区別して表示するようにしました。
v20260516.2155
変更
- Web 管理画面の コネクション は、観測された転送バイト数の降順を既定の並び順にしました。
コネクション の sort menu に
Trafficを追加し、connection card には合計バイト数を、 詳細表示には conntrack accounting が使える場合の outbound、inbound、total の counter を表示します。 - Web 管理画面の connection 件数の上限を適用するとき、conntrack observer は family/protocol group ごとにバイト数の大きい entry を優先します。 低トラフィックの entry に押し出されて、大きな active flow が隠れにくくなります。
v20260516.1413
修正
routerd apply --dry-runと関連する planning path で、存在しない SQLite ownership ledger を空の in-memory ledger として扱うようにしました。 権限のない CI runner 上で/var/lib/routerdを作成しようとして失敗しなくなります。
v20260516.1405
追加
firewall.routerd.net/v1alpha1にPortForwardと単一 backend のIngressServiceを追加しました。WAN 側 IPv4 TCP/UDP ingress DNAT を表せます。- Linux nftables と FreeBSD pf の rendering で、これらの ingress service を公開できるようにしました。 任意の hairpin NAT も生成でき、LAN クライアントが WAN アドレス経由で同じ port forward の service へ到達できます。
- 新しい ingress NAT resource 向けに、生成 JSON Schema、CLI alias、API documentation、 resource ownership documentation を追加しました。
v20260516.0804
変更
- Web 管理画面の コネクション は、DPI application ごとに表を分けるのではなく、 IP family と transport protocol の固定 bucket で active な flow をまとめるようにしました。 TLS、DNS、QUIC などの app label は各 group 内の表示として残ります。
v20260514.1433
追加
- Alpine Linux / OpenRC への適用サポートを追加しました。
routerd applyが OpenRC のサービススクリプトを生成し、Alpine ホストで routerd 管理下のサービスを 起動・管理できるようにしました。
v20260514.0813
修正
- Web 管理画面の クライアント で、IP address ベースの DNS、traffic、firewall、DPI、 DHCP fingerprint 情報を、現在の DHCP リースと突き合わせる前に直近 1 時間の 観測ウィンドウに揃えるようにしました。
- client inventory では sticky な DHCP lease annotation に active hold だけを使うようにし、 古い lease history が現在の エンドポイント identity の判定に混ざらないようにしました。
v20260514.0743
修正
- Web 管理画面の クライアント で、期限切れの dnsmasq リースを無視するようにしました。 古い host が無期限に残り続けないようにします。
- DHCP リースの統合では、まず有効期限が新しいリースを優先し、lease file の 設定順は同条件の場合の tie-breaker としてだけ使います。
- routerd は コントローラーランタイムの dnsmasq lease file を Web 管理画面に先頭候補として渡します。 これにより、管理対象の dnsmasq が実際に使う lease file に沿って表示します。
v20260514.0654
修正
- Web 管理画面の 概要 で、初回の軽量なスナップショットを 0 値の metric sample として 記録しないようにしました。
- 概要 の遅延 refresh は、必要な resource、event、conntrack、DNS、最近の traffic flow を取得します。一方で、重い firewall、VPN、client inventory の処理は 引き続き避けます。
- 概要 card は、まだ取得していない flow / connection data を 0 と見せず、 loading state として表示します。
v20260514.0037
修正
- DHCPv4 の LAN domain rendering で、明示的な domain-search option がない場合は
domain/domainFromから domain-name と domain-search の両方を生成するようにしました。
v20260514.0025
追加
domainFrom、dnsslFrom、domainSearchFromを追加しました。 DHCPv4、IPv6 RA、DHCPv6 で LAN の suffix を広告するとき、 ローカルドメイン文字列を重複して書かずDNSZone/<name>.zoneを参照できます。
v20260513.2358
変更
- 長時間動き続けるイベント処理を堅牢化しました。
EventRuleとDerivedEventの timer は発火後に map から取り除かれ、 古い timer callback を無視し、共有状態を コントローラーの lock で保護します。 EventRuleの相関状態に上限を設けました。 高カーディナリティのイベント列でも、メモリ使用量が無制限に増え続けません。- デーモン の
events.jsonlは追記し続けるのではなく、一定サイズで ローテーションするようにしました。 - local control、デーモン event、DNS リゾルバ、DoH、classifier の経路に request / response のサイズ上限を追加しました。 local デーモン server と Web 管理画面には HTTP header の timeout も追加しています。
修正
DerivedEventの hysteresis 中に、timer callback と reconcile が pending な transition state を同時に更新し得る race を修正しました。
v20260513.2317
変更
v20260513.2252の堅牢化に合わせて、本番環境での reconcile に関する ドキュメントを更新しました。 operations、upgrade、state ownership、各言語の 変更履歴 で、実機状態の drift 確認、管理対象構成物の掃除、nftables named set の更新、 設定で管理されるrouterd.serviceのアップグレード時の扱いを説明しています。
v20260513.2252
変更
- 本番環境での reconcile を堅牢化しました。 コントローラー は処理を省略する前に、状態データベースだけでなく実機状態も確認します。 対象には systemd unit、dnsmasq、DHCPv4 lease アドレス、 route-policy の nftables table、NAT44、関連する管理対象構成物が含まれます。
- health check の
fwmarkを、生成する systemd unit、socket 設定、ステータス の観測値、 OpenTelemetry 属性まで通すようにしました。 probe が、検査対象の経路と同じ policy-route mark を使えます。 - Linux firewall の rendering で、routerd が管理する named set を再定義前に 消すようにしました。 zone interface や client-policy の MAC アドレスを削除したときに nftables 上へ残らず、 filter table 全体を destroy せずに再読み込みします。
- リリースインストーラーは、設定で管理されている
routerd.serviceを archive の template で上書きせず保持します。 routerd が自分自身の unit を管理している場合、unit file の変更時はsystemd-runで少し遅らせた self-restart を予約します。
修正
- YAML から消えた
HealthCheckに対応する古いrouterd-healthcheck@*.serviceを 削除するようにしました。 - NAT rule が 0 件になったとき、管理対象の NAT44 table または pf anchor を 空にするようにしました。
- ステータスでは DHCPv4 lease アドレスが存在すると見えていても、実際の インターフェースから消えている場合は再適用するようにしました。
- 設定内容が空の
WireGuardPeerは、誤解を招く Pending ではなくNotConfiguredとして表示するようにしました。
v20260513.1931
修正
- health check による経路切替の挙動を安定化しました。
v20260513.1153
修正
- コントローラー reconcile の冪等性を安定化しました。
v20260513.0836
追加
- WireGuard mesh コントローラー を追加しました。
v20260513.0727
変更
- home-router の UDP conntrack timeout 設定を引き上げました。
v20260512.0037
追加
- conntrack observer から DPI flow metrics を出力するようにしました。
v20260512.0032
追加
- Web 管理画面 概要 に DPI summary card を追加しました。
v20260512.0027
追加
- Web 管理画面 クライアント ページに DPI activity summary を追加しました。
v20260512.0008
追加
- Web 管理画面 コネクション ページに DPI classification を表示するようにしました。
v20260511.2357
変更
- forward flow へ DPI enrichment を広げました。
v20260511.2307
修正
- Web 管理画面の横方向のオーバースクロールを抑制しました。
v20260511.2300
修正
- ファイアウォール timeline の横スクロールを修正しました。
v20260511.2253
変更
- Web 管理画面を content-driven なレイアウトセクションへ整理しました。
v20260511.2217
変更
- mobile での Web 管理画面のレイアウトを検証しました。
v20260511.2211
変更
- Web 管理画面の page state を画面遷移後も保持するようにしました。
v20260511.2154
変更
- クライアント の inventory ビューを整理しました。
v20260511.2145
追加
- Web 管理画面 SSE reconciliation を追加しました。
v20260511.2130
追加
- client fingerprint inference を追加しました。
v20260511.2106
変更
- 期限切れの conntrack return flow の相関を取るようにしました。
v20260511.2045
変更
- firewall deny event に DPI context を付与するようにしました。
v20260511.2018
変更
- DPI classifier の OS parity を検証しました。
v20260511.1846
修正
- Web 管理画面の時刻 locale を英語に固定しました。
v20260511.1840
追加
- 分離した DPI classifier proof of concept を追加しました。
v20260511.1820
追加
- コネクション protocol summary を追加しました。
v20260511.1709
修正
- リリースアーティファクトの checksum を修正しました。
v20260511.1428
変更
- Web 管理画面の navigation section を改善しました。
v20260511.1240
変更
- コントローラー mode reason の表現を調整しました。
v20260511.1041
追加
- dry-run コントローラーの可視性を高めました。
v20260511.1017
変更
- コントローラーの dry-run mode を明示的に表示するようにしました。
v20260510.1956
変更
NetworkAdoptionが resolved DNS を管理できるようにしました。
v20260510.1811
追加
- PVE live ISO のシリアルコンソール検証ログを
internal/notes/に追加しました。 walkthrough の画面キャプチャと実行ログを、test evidence として同じリリースに残します。
v20260510.1802
変更
- 日本語、簡体字中国語、繁体字中国語のディスクレス mini PC walkthrough に、 PVE live ISO boot test で取得した実際の画面キャプチャを埋め込みました。
- ディスクレス mini PC walkthrough に残っていた古い placeholder 画像参照を削除しました。
v20260510.1750
追加
- ディスクレス mini PC walkthrough に、PVE live ISO 実機検証で取得した 画面キャプチャを追加しました。
- 簡体字中国語版と繁体字中国語版に、位置づけ、USB 永続化、 法務と再配布の不足ページを追加しました。
変更
- website footer の著作権表示を、著作権表示を先に置く慣習的な形式へ変更しました。
- ディスクレス mini PC walkthrough の PVE 例を、VGA と serial console の
両方を有効にする構成へ更新しました。これにより、QEMU の screenshot と
qm terminal検証を同じ実行で取得できます。
修正
- live ISO の設定ウィザードで、DHCPv4 pool の既定値を選択した LAN アドレスの prefix から導出するように修正しました。
- PVE live ISO boot test を再実行し、
/tmp/iso-boot-test-20260510-1742.log、QEMU screenshot、routerd apply、 Healthy ステータス、USB persistence flush まで確認しました。
v20260510.1722
追加
- routerd の Go ソース、インストーラースクリプト、プラグインスクリプト、 Web 管理画面ソースに BSD 3-Clause の SPDX 識別子を追加しました。
- README にライセンスバッジを追加し、英語版と日本語版 README から BSD 3-Clause License へリンクしました。
- 公開ドキュメントに貢献ガイドを追加し、ドキュメントの sidebar から 辿れるようにしました。
- SECURITY にメールと GitHub Security Advisories の報告先を明記しました。
変更
- repository root の
LICENSEにある著作権表示をKirino Minato <[email protected]> (https://github.com/imksoo) and routerd contributorsに統一しました。 - SPDX ヘッダーが routerd ソースファイルだけに適用されることを
法務ドキュメントに明記しました。同梱する第三者ソフトウェアは
THIRD_PARTY_LICENSES.mdに記載された個別ライセンスに従います。 - README から製品比較表を削除し、routerd 自身の対象範囲と特徴を説明する 記述に整理しました。
v20260510.1626
追加
- 公開ドキュメントに法務と再配布ページを追加し、リリースチェックリストを整理しました。
- 生成される第三者ライセンス一覧に Go module source URL を追加しました。
- BSD routerd binary と aggregate live ISO distribution model の内部 license audit note を記録しました。
v20260510.1612
追加
- Go module とライブ ISO で使う Alpine package の第三者ライセンス一覧を自動生成できるようにしました。
- リリースアーカイブとライブ ISO にライセンス通知を同梱する場所を追加しました。
- routerd 本体の BSD 3-Clause License と、ライブ ISO の aggregate distribution としての扱いを文書化しました。
v20260510.1547
追加
- routerd 自身の対象範囲と deployment spectrum を中心に、公開向けの位置づけ説明を広げました。
- Intel NUC、N100 mini PC、Raspberry Pi 5、thin client、Proxmox VM の hardware compatibility を拡充しました。
- 中国語の hardware compatibility ページを追加し、ライブ ISO と USB 永続化の流れを明確にしました。
v20260510.1534
追加
- ディスクレス mini PC walkthrough の図、tutorial index、field-note blog post を追加しました。
v20260510.1508
追加
- USB persistence の運用ドキュメントと live ISO の USB persistence support を追加しました。
v20260510.1451
追加
- contribution、security、license、positioning、hardware compatibility、diskless mini PC の各ドキュメントを追加しました。
v20260510.1429
追加
- Alpine live ISO build と install documentation を追加しました。
v20260510.1412
追加
- live ISO validation note と、live ISO 経路の installer documentation を追加しました。
v20260510.1354
修正
- Alpine 上の live ISO runtime apply を修正しました。
v20260510.1310
追加
- live ISO の serial console support を有効にしました。
v20260510.1301
変更
- リリースタグを JST timestamp 形式へ切り替えました。
20260510.4
修正
- live ISO overlay archive path を修正しました。
20260510.3
修正
- Alpine live ISO のリリース検出を修正しました。
20260510.2
追加
- Alpine ベースの live ISO packaging を追加しました。
20260510.1
追加
- installer configuration wizard を追加しました。
20260510.0
変更
- fixed-download-asset リリースの後続として、20260510 リリース系列を開始しました。
20260509.16
追加
- 版番号付きアーカイブに加えて、
routerd-linux-amd64.tar.gzのような固定名の alias をリリースアーカイブに追加しました。 - 固定名アーカイブと
.sha256ファイルを GitHub Releases に配置します。これにより、ドキュメントでreleases/latest/download/...の URL を使えます。
変更
- クイックスタートのドキュメントを、固定された latest download URL に変更しました。
- リリースワークフローで、対応している GitHub JavaScript actions が Node.js 24 runtime を使うようにしました。
20260509.15
追加
- branch push と pull request 用の
CIGitHub Actions ワークフローを追加しました。 - CI ワークフローは Ubuntu 上で
go test ./...、schema 確認、example 検証、Web サイト生成を実行します。 - ローカル commit の前に Go テストと schema 確認を実行する任意の
scripts/pre-commit.shhook を追加しました。 - CI、pre-commit 確認、tag で起動するリリースワークフローの役割分担を説明する開発ドキュメントを追加しました。
20260509.14
変更
- Ubuntu lab ルーターで
ClientPolicyゲストモードを検証しました。 - Linux nftables で、include mode のゲスト MAC アドレス集合、ゲスト向け DNS/DHCP/NTP 許可、自己隔離、RFC 1918 / ULA 拒否規則が生成されることを確認しました。
- exclude mode は、nftables 生成テストで確認しました。
20260509.13
追加
- ゲストモードガイドを詳細化しました。ユースケース、内部実装、
ClientPolicyの全フィールド、確認手順、トラブルシューティング、セキュリティ上の限界を追加しました。 - include mode、exclude mode、複数ゲスト端末、カスタム拒否・許可リスト、ローカル探索サービス、IoT 固定割り当ての例を追加しました。
ClientPolicy.spec.guestServicesで、dhcp、dns、ntpに加えてmdnsとssdpを指定できるようにしました。
20260509.12
追加
ClientPolicyを追加しました。Linux nftables で LAN 端末を MAC アドレスごとに分類するゲストモードです。- ゲスト端末は DNS、DHCP、NTP を使えます。プライベート IPv4 宛てと ULA IPv6 宛ての通信は既定で拒否します。
examples/guest-mode.yamlと、include mode / exclude mode の分類方法を説明するドキュメントを追加しました。
変更
- FreeBSD pf では
ClientPolicyを明示的に未対応として扱います。pf は同じ MAC ベースの routed filtering モデルを持たないためです。
20260509.11
追加
- 最小 Tailscale mesh 参加、WireGuard hub-spoke 経路、VRF lab、multi-WAN home フォールバックの用途別 example を追加しました。
- 各 example の用途を説明する
examples/README.mdを追加しました。
変更
make validate-exampleがexamples/配下の全 YAML ファイルを検証するようにしました。
20260509.10
追加
- Web 管理画面の 概要 に、世代、リソース フェーズ、HealthCheck 状態の簡易時系列チャートを追加しました。
- Config 画面で、現在の YAML ファイルと最新適用世代を比較できるようにしました。
routerd applyの前に差分を確認できます。 - Resource テーブルで、kind、name、フェーズ、詳細の検索、フェーズ 絞り込み、検索結果の強調表示ができるようにしました。
- VPN 画面に Tailscale と WireGuard の peer 状態を示す視覚サマリーを追加しました。
20260509.9
追加
- リリースアーカイブに
share/doc/TARGETを含め、install.shがホストの OS と CPU アーキテクチャーを確認するようにしました。 - GitHub Actions で Linux と FreeBSD の
amd64/arm64アーカイブを生成するようにしました。 - リリース CI で
install.shとuninstall.shにshellcheckを実行します。
変更
install.sh --list-depsの出力を、OS、CPU アーキテクチャー、パッケージマネージャー、パッケージ、確認対象コマンドが分かる形に整理しました。- PPPoE、RA、IPsec、パケット取得、経路制御、ファイアウォールで使う実用パッケージを依存リストへ追加しました。
20260509.8
修正
- zh-Hant と zh-Hans のドキュメントリンクを修正し、翻訳ページが未翻訳のロケール内ページを指さないようにしました。
- 翻訳がそろうまで、概要ページから英語版の正準リファレンスへリンクする形にしました。
20260509.7
追加
EgressRoutePolicyで、DS-Lite 主経路、RA 由来 DS-Lite、PPPoE、WAN 直結の多段フォールバックを表現できるようにしました。- 宣言型な
Telemetryリソースと OTLP 環境変数の伝播により、ルーター群へ OpenTelemetry 設定を展開しました。 - DS-Lite の例は、RFC 6333 の B4-AFTR link prefix
192.0.0.0/29を tunnel 内側 IPv4 送信元として使う形にしました。 PPPoESession.disabledと無効化された経路候補により、PPPoE フォールバック定義を YAML に残しつつ、本番 PPPoE セッションの漏れを防げるようにしました。
変更
- リリース版番号を
0.x.yから日付ベースの値へ変更しました。 routerd --version、routerctl --version、リリースアーカイブで同じリリースタグの値を使うようにしました。- Linux nftables と FreeBSD pf の NAT44 生成を、インターフェース単位のルールへ寄せました。
- 3-role のファイアウォールモデルを Linux と FreeBSD で確認し、service hole を広い zone 全体ではなく、所有する受信インターフェースへ束縛しました。
- FreeBSD pf で
PathMTUPolicyの TCP MSS clamp を生成できるようにし、Linux nftables とそろえました。 - dnsmasq の RA 生成で、IPv6 RA MTU option により path MTU を配布できるようにしました。
修正
- FreeBSD pf で DHCPv6、WireGuard、VXLAN の service hole が
wanzone の全インターフェースへ広がる問題を修正しました。 - FreeBSD の NAT artifact を nftables ではなく
pf.anchor/routerd_natとして報告するようにしました。 - NAT 生成の前に、PPPoE のリソース名を実 OS インターフェース名へ解決するようにしました。
0.4.0
追加
- nftables の暗黙拒否ログを
routerd-firewall-loggerで取り込み、firewall-logs.dbに保存するようになりました。Linux ではnfnetlinkを直接読み取り、FreeBSD ではpflogをtcpdump経由で取り込みます。 - Web 管理画面に コネクション タブ (リアルタイムの conntrack / pf state)、クライアント タブ (DHCP リース + トラフィック統合)、ファイアウォール タブ (拒否ランキング + 時系列テーブル) を追加しました。
TailscaleNodeで Tailscale の exit node と subnet router を広告できるようにしました。生成した systemd ユニットでtailscale upを実行します。NixOS 向け生成ではservices.tailscaleを有効化し、ユニットのpathも設定します。WebConsole.spec.listenAddressFromとDNSResolver系のリスニングアドレスをInterface/<name>.status.ipv4Addressesから導出できるようにしました。即値の代わりに参照で書けます。- conntrack accounting (
net.netfilter.nf_conntrack_acct=1) をSysctlProfile/router-linux既定値に追加し、TrafficFlowLogでbytesOut/bytesInを集計できるようにしました。
変更
- リアルタイムのコネクション表示の API / CLI を
connectionsに統一しました (旧称conntrack-snapshot)。/api/v1/connections、routerctl connectionsを使います。IPv6 を含む全ファミリを同じ表で扱います。 - NixOS 向けの宣言型レンダリングを拡張しました。
Package(NixOS パッケージ宣言)、SysctlProfile、NetworkAdoption、generated service artifactsをrouterd render nixosの出力に統合します。NixOS 上のPackageは実行時に導入せず、生成された NixOS 設定で管理します。 generated service artifactsから FreeBSDrc.dスクリプトを生成できるようになりました (routerd render freebsd --out-dir)。
修正
IPv6DelegatedAddressコントローラーがLink/<name>のステータスが空のとき、PD 由来アドレスをホストインターフェースに付与しない問題を修正しました。generated service artifactsコントローラーが変更のない active unit を毎回再起動する問題を修正しました。
0.3.0
追加
- 宣言型な OS bootstrap リソースとして
PackageとSysctlProfileを追加しました。apt、dnf、nix、pkg のパッケージ宣言と、ルーター用途向けの sysctl 推奨値 (nf_conntrack_max、socket buffer、TCP/UDP timeout、ip_forwardなど) を 1 つのリソースで適用します。 NetworkAdoptionで systemd-networkd の DHCP / RA を YAML から無効化できます。generated service artifactsで routerd 自身が unit を render + install + enable できます。routerctl events --limit N --topic X --resource K/N -o jsonで sqlite3 不要に bus event を確認できます。routerd plan --diffで apply 前差分を表示します。DNSResolverに bootstrap forwarder (RFC1918 内部 DNS を優先しつつ public DNS を予備にする) を追加しました。
変更
- 設定ファイル中の
${...status.field}文字列参照を、型付きの*Fromフィールドへ整理しました (addressFrom、ipv4From、ipv6From、upstreamFrom、prefixFrom、rdnssFrom、dependsOn)。互換別名はありません。 - コントローラー chain を pure event-loop 型に再構築しました。共通
framework.FuncController(Subscriptions + Bootstrap + PeriodicFunc) とeventedStoreで、状態保存時に必ずrouterd.resource.status.changedを発行し、下流が再評価する設計です。 - bus event を
slog経由で systemd journal へ出力します (journalctl -u routerd.service -f | grep "routerd event"で コントローラーの意思決定を追跡できます)。高頻度イベントは debug レベルです。 - 全バイナリを静的ビルドにしました (
CGO_ENABLED=0 go build -trimpath -ldflags="-s -w")。OS 別の依存パッケージ (dnsmasq-base、nftables、conntrack、iproute2、ppp、wireguard-tools、strongswan-swanctl、radvd、tcpdumpなど) を Ubuntu / NixOS / FreeBSD ごとに整理しました。 HealthCheck.sourceInterfaceを YAML 上ではリソース名で書き、実行時に OS の interface 名に解決します。
修正
generated service artifacts同士のRuntimeDirectory競合で再起動時に socket が消える問題を、runtimeDirectoryPreserveで declarative に解消しました。generated service artifactsのstate: absentを正しく Drifted として検出し、unit 削除を plan に含めるようにしました。SysctlProfileの observe で型ゆらぎによる不要な drift を抑えました。
0.2.0
追加
- Stateful firewall を導入しました。
FirewallZone、FirewallPolicy、FirewallRuleで nftables のinet routerd_filtertable を生成します。 EgressRoutePolicy(旧WANEgressPolicy) にdestinationCIDRs、gateway、gatewaySourceを追加しました。HealthCheckはvia、sourceInterface、sourceAddressで probe の送信経路を指定できます。- DNS サブシステムを再構成しました。
DNSZone(権威ゾーン定義) とDNSResolver(フォワーダー / キャッシュ) に分離し、ローカルゾーン、条件付き転送、DoH / DoT / DoQ、平文 UDP DNS をサポートします。dnsmasq は DHCPv4 / DHCPv6 / RA / 中継に専念します。 - DS-Lite (
DSLiteTunnel)、PPPoE (PPPoESession、routerd-pppoe-client)、DHCPv4 client (routerd-dhcpv4-client、DHCPv4Client) を追加しました。 - NAT44 (
NAT44Rule) と conntrack 観測を追加しました。/proc/net/nf_conntrackがない環境では sysctl 由来の集計に縮退します。
変更
WANEgressPolicyをEgressRoutePolicyに改名しました。互換別名はありません。- DHCP 関連 Kind とバイナリ名を RFC 表記に統一しました (
routerd-dhcpv4-client、routerd-dhcpv6-client)。旧名の互換別名はありません。
0.1.0
最初の v1alpha1 実装です。
- DHCPv6-PD クライアント、デーモン contract、event bus、コントローラーフレームワーク を導入しました。
- DHCPv6-PD → LAN アドレス導出 → DNS 応答までの コントローラー chain を実装しました。
- DHCPv6 情報要求、DS-Lite (試作)、IPv4 経路、RA、DHCPv6 サーバー、
HealthCheck、EventRule、DerivedEventを追加しました。
このバージョン以降、出荷前の整理として API 名や実装方針に大きな変更が入っています。最新の利用方法は「未リリース」の項目と examples/ を参照してください。