メインコンテンツまでスキップ

インストールとアップグレード

Diagram showing routerd install and upgrade from release archive download and install.sh through first router.yaml validation, plan, serve mode, preserved config and state, and uninstall

ルーターホストへはリリースアーカイブから導入します。 アーカイブには、実行ファイル、サービステンプレート、設定例、インストーラーが 含まれます。 ルーターホストに Go や Makefile は要りません。

クイックインストール

GitHub Releases から、OS と アーキテクチャーに合うアーカイブを取得します。

Linux amd64:

curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-linux-amd64.tar.gz
curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-linux-amd64.tar.gz.sha256
sha256sum -c routerd-linux-amd64.tar.gz.sha256
tar -xzf routerd-linux-amd64.tar.gz
sudo ./install.sh

Linux arm64 では linux-arm64 アーカイブを使います。

FreeBSD amd64:

fetch https://github.com/imksoo/routerd/releases/latest/download/routerd-freebsd-amd64.tar.gz
fetch https://github.com/imksoo/routerd/releases/latest/download/routerd-freebsd-amd64.tar.gz.sha256
cat routerd-freebsd-amd64.tar.gz.sha256
sha256 routerd-freebsd-amd64.tar.gz
tar -xzf routerd-freebsd-amd64.tar.gz
sudo ./install.sh

FreeBSD arm64 では freebsd-arm64 アーカイブを使います。 最新リリースには routerd-vYYYYMMDD.HHmm-linux-amd64.tar.gz のような 版番号付きアーカイブもあります。 特定の版に固定する場合は、版番号付きアーカイブを使います。

Linux 用アーカイブには、CGO_ENABLED=0 で静的リンクした routerd バイナリを 含めます。 そのため、配置先ホストの glibc 版には依存しません。 dnsmasqnftipconntracktcpdump などの実行時ツールは、 引き続き install.sh が導入または確認します。

native nDPI によるアプリケーション識別が必要なホストでは、対応する routerd-ndpi-agent-libndpi-linux-amd64.tar.gz も取得し、通常のアーカイブと 同じインストール処理の中で明示的に適用します。

curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-ndpi-agent-libndpi-linux-amd64.tar.gz
curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-ndpi-agent-libndpi-linux-amd64.tar.gz.sha256
sha256sum -c routerd-ndpi-agent-libndpi-linux-amd64.tar.gz.sha256
sudo ./install.sh --with-ndpi \
--with-ndpi-archive ./routerd-ndpi-agent-libndpi-linux-amd64.tar.gz

--with-ndpi を付けた場合、導入後の routerd-ndpi-agentlibndpiLoaded: true を返さなければ処理は失敗します。これにより、static な フォールバックエージェントが native nDPI の要件を黙って満たしたことにはなりません。

install.sh は新規導入かアップグレードかを自動で判定します。 実行ファイルを /usr/local/sbin に配置し、サービステンプレートを導入します。 また、/usr/local/etc/routerd/router.yaml.sample を作成します。 既存の /usr/local/etc/routerd/router.yaml は上書きしません。 systemd ホストでは、インストーラーがローカルソケットアクセス用の routerd グループを 作成します。sudo usermod -aG routerd <user> で運用者を追加すれば、 routerctl status などのローカル制御ソケット操作を sudo なしで実行できます。

BGP を動かしているルーターのアップグレード

routerd-bgp は長寿命のデーモンで、BGP セッションを保持します。 再起動するとセッションが切断され、ピアは保留タイマーが満了するまで古い経路を 保持するため、その間 ECMP の幅が縮小します。 systemd ホストでは、install.sh がアップグレード前の削除済みバイナリをまだ 実行中のアクティブな routerd ヘルパーサービス (routerd-bgprouterd-dns-resolver など) を自動でリフレッシュします。 これにより、アップグレード後のホストが /proc/*/exe の下に古い実行ファイルを 抱え続けることを防ぎます。

インストーラーがヘルパーを再起動した後は、BGP の再収束が起きます。 再収束中に routerd-bgp を再度再起動しないでください。短時間に 2 回再起動すると、 ピアが古い経路を保持し続け、ECMP が崩壊します。 Graceful Restart が保護できるのは 1 回の再起動だけです。 判断は再収束を待ってから行います (BGP の保留タイマーと Graceful Restart の stale-path タイマーにより、最大約 3--6 分かかります)。 合格条件は、すべてのピアが Established に戻ること、影響するプレフィックスで ECMP 幅が回復すること、エンドツーエンドの疎通 (例: ECMP 経路を通る HTTP 200) が 成功することです。

この間、1 つのピアが IDLE のまま Closed an accepted connection を 繰り返しログに出すことがあります。これは、前のセッションをまだ保持している ピアが保留タイマーの満了を待っている状態です。 追加の再起動はせず、待ってください。タイマー満了後にピアは自動で接続を確立し、 ECMP も回復します。

root 以外の運用者によるローカル制御ソケットアクセス

読み取り専用の状態ソケット (/run/routerd/routerd-status.sock) を使えば、 root 以外の運用者も sudo なしで routerctl status を実行できます。 routerd グループが存在する場合、routerd はこのソケットを root:routerd、モード 0o660 で作成します。 Unix ソケットへの接続には書き込み権限が必要なので、グループのメンバーは 読み書き可能です。 このグループ所有権は、routerd がソケットを作成する際に自身で設定するため、 サービスユニットの Group= 設定には依存しませんrouterd グループが存在しない場合は、誰もロックアウトされないよう、 状態ソケットを全アクセス可 (0o666) にフォールバックします。

読み書き用の制御ソケット (/run/routerd/routerd.sockrouterctl apply / delete で使用) は、root 所有の 0o660 のままです。 ルーターへの変更操作には、引き続き root / sudo が必要です。

sudo なしで routerctl status を使えるようにする手順:

  1. sudo usermod -aG routerd <user> (インストーラーがグループを作成済み)。
  2. グループメンバーシップは新しいログインセッションにのみ適用されます。 反映前に再ログイン (または新しい SSH セッションを開く / newgrp routerd を 実行) してください。フルの再ログインなしで現在のシェルでグループを使うには、 コマンドをラップします: sg routerd -c 'routerctl status'

ls -l /run/routerd/routerd-status.sock で確認します (期待値: srw-rw---- root routerd)。id <user> でグループ一覧に routerd が含まれる ことを確認します。 グループに入っていないユーザーが拒否されるのは、意図した堅牢化であり、 後退ではありません。サービスユニットの変更は不要です。

ライブ ISO で試す

リリースページでは、Ubuntu ベースの起動可能なライブ ISO も公開します。

curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-live.iso
curl -LO https://github.com/imksoo/routerd/releases/latest/download/routerd-live.iso.sha256
sha256sum -c routerd-live.iso.sha256

ISO を Proxmox VE のテスト VM に接続して起動します。 コンソールには routerd の初期設定手順が表示されます。 root でログインすれば、同じ install.sh configure ウィザードを起動できます。 ISO はデモや短時間の試用に向いています。 永続的なルーターとして使う場合は、リリースアーカイブからディスクへ導入します。

ライブ ISO は、ビデオコンソールとシリアルコンソールの両方を有効にします。 仮想マシン (KVM / Proxmox など) では、ライブ起動時に qemu-guest-agent サービスが利用可能であれば自動起動を試みます。 sshd は仮想化環境での運用者アクセス用に同梱していますが、ライブ ISO ではデフォルトで停止しています。 Proxmox VE では、シリアルソケットを追加し、qm terminal で接続します。

qm create 200 \
--name routerd-live-demo \
--memory 1536 \
--cores 2 \
--ostype l26 \
--serial0 socket \
--vga serial0 \
--boot order=ide2 \
--ide2 local:iso/routerd-live.iso,media=cdrom \
--net0 virtio,bridge=vmbr0 \
--net1 virtio,bridge=vmbr490
qm start 200
qm terminal 200

DHCP や RA を試す場合は、net1 に隔離した LAN ブリッジを使います。 シリアルコンソールは 115200 8N1 です。 ウィザードはプレーンテキストで表示します。 そのため、qm terminal、フレームバッファーコンソール、最小構成の端末のいずれでも同じように動きます。

ライブ ISO には 2 つの動作があります。

  • 一時デモモード: USB ストレージを選びません。 設定とログは RAM 上に置かれ、再起動で消えます。
  • 永続ルーターモード: ウィザードで USB パーティションを選びます。 ウィザードが router.yaml を USB デバイスへ保存します。 次回の起動時には、ISO が USB デバイスをマウントし、設定を復元して自動的に反映します。

永続モードでは、USB パーティションに ROUTERD というラベルを付けます。 リムーバブルデバイスが複数ある場合は、カーネル引数に routerd.usb=/dev/sdX1 を指定できます。 ヘルパーは blkidext4vfatexfat を判別します。 既定では async,noatime でマウントします。 同期書き込みを明示したい場合にだけ、routerd.usb_mount=sync を指定します。

ログは /run/routerd/logs の tmpfs に一時保存します。 ウィザードでは、1 日 1 回の書き出しジョブを有効にできます。 このジョブは、設定、状態スナップショット、圧縮したログアーカイブを USB デバイスへコピーします。 tmpfs のログ上限は既定で 100 MiB です。 上限を超えた場合は、古いログファイルから順に削除します。

USB を安全に取り外す場合は、次を実行します。

/usr/share/routerd/live-persistence.sh flush
/usr/share/routerd/live-persistence.sh umount

配置先、マウントオプションは Operations → USB 永続化 を参照してください。

routerd-live-vYYYYMMDD.HHmm.iso のような版番号付き ISO も公開します。

実行時の依存パッケージ

既定では、install.sh が既知の OS パッケージを導入します。 一覧だけを確認するには、次を実行します。

./install.sh --list-deps

別の仕組みでパッケージを管理する場合は、自動導入を止めます。

sudo ./install.sh --no-install-deps

依存パッケージだけを導入することもできます。

sudo ./install.sh --deps-only

Tailscale の導入は任意です。 導入する場合は --with-tailscale を付けます。

sudo ./install.sh --with-tailscale

Debian / Ubuntu

インストーラーは apt-get を使い、次を導入します。

ca-certificates curl dnsmasq-base nftables wireguard-tools chrony bind9-dnsutils tcpdump cron jq ppp pppoe conntrack iproute2 iputils-ping iputils-tracepath net-tools kmod radvd strongswan-swanctl iptables keepalived openssh-server

Fedora 系

インストーラーは dnf を使い、次を導入します。

ca-certificates curl dnsmasq nftables wireguard-tools chrony bind-utils tcpdump cronie jq ppp rp-pppoe conntrack-tools iproute iputils traceroute kmod radvd strongswan iptables keepalived openssh-server

Arch 系

インストーラーは pacman を使い、次を導入します。

ca-certificates curl dnsmasq nftables wireguard-tools chrony bind tcpdump cronie jq ppp rp-pppoe conntrack-tools iproute2 iputils traceroute kmod radvd strongswan iptables keepalived openssh

FreeBSD

インストーラーは pkg を使い、次を導入します。

ca_root_nss curl dnsmasq wireguard-tools mpd5 bind-tools tcpdump jq chrony strongswan

FreeBSD の pfifconfigroutesysctlservicesysrccronnetstatsockstatpingtraceroute は基本システムの機能です。 これらはパッケージとして導入せず、コマンドの存在だけを確認します。

アップグレード

新しいアーカイブを展開し、同じインストーラーを実行します。

tar -xzf routerd-linux-amd64.tar.gz
sudo ./install.sh

/usr/local/sbin/routerd が存在する場合、インストーラーはアップグレードモードに 切り替わります。 このとき、古い routerd --version と新しい routerd --version を表示します。 実行ファイルとサービステンプレートを置き換える一方で、設定と状態は保持します。 routerd サービスが起動中であれば再起動します。 systemd ホストでは、再起動した routerd.service の状態ソケットを待ち、 routerd が管理するユニットファイルの更新が落ち着いてから、更新が必要な routerd ヘルパーサービスだけを再起動します。 再起動するのは、削除済みのアップグレード前バイナリを実行している場合、または ヘルパーのプロセス起動後にユニットファイルが更新された場合だけです。 /etc/systemd/system/routerd.service が routerd の設定で管理されている場合は、 アーカイブのテンプレートで上書きせず、そのユニットを保持します。

置き換えるファイルは *.backup.YYYYMMDDHHMMSS に退避します。 途中で失敗した場合は、一時バックアップから復元します。

routerd 自身が routerd.service を、生成されるサービス成果物のリソースとして管理している場合、 ユニットファイルの変更は慎重に扱います。 適用の途中で自分自身を直接再起動するのではなく、systemd-run で少し遅らせた 自己再起動を予約します。 VRRP または ingress サービスのリソースを同じ設定に含む場合は、生成される routerd.service に、keepalived 用の書き込み可能なパスと capability を自動で追加します。 BGP は長寿命の routerd-bgp デーモンをローカルの gRPC Unix ソケットで制御するため、 FRR group や FRR の実行時ディレクトリは要りません。

よく使うオプション:

sudo ./install.sh --no-restart
sudo ./install.sh --dry-run
sudo ./install.sh --verbose
sudo ./install.sh --no-config-update

配置先

項目LinuxFreeBSD
設定/usr/local/etc/routerd/router.yaml/usr/local/etc/routerd/router.yaml
設定例/usr/local/etc/routerd/router.yaml.sample/usr/local/etc/routerd/router.yaml.sample
実行ファイル/usr/local/sbin/usr/local/sbin
サービステンプレート/etc/systemd/system/routerd.service/usr/local/etc/rc.d/routerd
実行時ソケット/run/routerd/var/run/routerd
永続状態/var/lib/routerd/var/db/routerd

インストーラーは次の状態を削除しません。

  • /usr/local/etc/routerd/router.yaml
  • /var/lib/routerd
  • /var/db/routerd
  • /run/routerd
  • /var/run/routerd
  • /var/log/otelcol

最初の設定

最初の試用では、組み込みの初期設定ウィザードを使えます。

sudo ./install.sh configure

ウィザードは、WAN インターフェース、LAN インターフェース、LAN アドレス、 LAN 向けサービス、管理経路の置き場所、任意の USB 永続化を順に確認します。 生成した候補は /usr/local/etc/routerd/router.yaml.configure に保存します。 既存の設定がある場合は差分を表示します。 確認後、/usr/local/etc/routerd/router.yaml へ導入します。 その後、routerctl validaterouterctl planrouterctl apply を実行します。

自動化する場合は、環境変数で値を渡して質問を省略できます。

sudo ROUTERD_WAN_INTERFACE=ens18 \
ROUTERD_LAN_INTERFACE=ens19 \
ROUTERD_LAN_ADDRESS=192.168.10.1/24 \
ROUTERD_LAN_CIDR=192.168.10.0/24 \
ROUTERD_MGMT_MODE=lan \
ROUTERD_ENABLE_USB_PERSISTENCE=no \
./install.sh configure --non-interactive --yes

ライブ ISO で USB 永続化を使う場合は、次の値を指定します。

sudo ROUTERD_ENABLE_USB_PERSISTENCE=yes \
ROUTERD_USB_DEVICE=/dev/sdb1 \
ROUTERD_USB_FLUSH=yes \
ROUTERD_LOG_TMPFS_LIMIT=100M \
./install.sh configure --non-interactive --yes

YAML ファイルの生成だけを行う場合は、--no-apply を使います。

sudo ./install.sh configure --no-apply

手動で設定することもできます。 設定例をコピーし、インターフェース名などを編集してください。

sudo install -d -m 0755 /usr/local/etc/routerd
sudo install -m 0600 /usr/local/etc/routerd/router.yaml.sample /usr/local/etc/routerd/router.yaml
sudo vi /usr/local/etc/routerd/router.yaml

検証し、計画を確認します。

routerctl validate -f /usr/local/etc/routerd/router.yaml --replace
routerctl plan -f /usr/local/etc/routerd/router.yaml --replace

管理経路が安全だと確認してから反映します。

sudo routerctl apply -f /usr/local/etc/routerd/router.yaml --replace

一度だけの反映が正常に終われば、サービスを起動します。

sudo systemctl enable --now routerd.service

FreeBSD では次のようにします。

sudo sysrc routerd_enable=YES
sudo service routerd start

アンインストール

リリースアーカイブには uninstall.sh も含まれます。 既定では、実行ファイル、サービステンプレート、実行時ファイルを削除し、 設定と状態は残します。

sudo ./uninstall.sh --yes

削除範囲を広げる場合は、明示的に指定します。

sudo ./uninstall.sh --yes --purge-config
sudo ./uninstall.sh --yes --purge-state
sudo ./uninstall.sh --yes --all

--dry-run で削除内容だけ確認できます。

開発者向けワークフロー

Makefile は開発用です。 テスト、ビルド、スキーマ生成、設定例の検証、Web サイトのビルド、 リリースアーカイブの作成に使います。

make test
make check-schema
make validate-example
make website-build
make dist ROUTERD_OS=linux GOARCH=amd64 VERSION="$(git describe --tags --abbrev=0)"

利用者向けの導入経路としては Makefile を使いません。 標準の配置方法は、リリースアーカイブと install.sh です。