#入れて、動いているかを確かめる
Linux の Server Edition は、apt のリポジトリから入ります。リポジトリの署名鍵を登録して、roamswitch-server を入れます。amd64 と arm64 の両方があります。
このコマンドは、パッケージを入れて、サービスを起動します(変更を伴う操作です)。練習用の環境で試してください。
curl -fsSL https://lafine.net/apt/roamswitch-archive-keyring.asc \
| sudo gpg --dearmor -o /usr/share/keyrings/roamswitch-archive-keyring.gpg
echo "deb [arch=amd64,arm64 signed-by=/usr/share/keyrings/roamswitch-archive-keyring.gpg] https://lafine.net/apt stable main" \
| sudo tee /etc/apt/sources.list.d/roamswitch.list
sudo apt update && sudo apt install roamswitch-server
systemctl is-active roamswitch-serverRoamSwitch Server Edition is installed and running with its defaults.
Next: sudo roamswitch server setup
Check the result: roamswitch status --server ; roamswitch doctor ; roamswitch detection-coverage
Full-coverage terminal UI: sudo roamswitch-server-tui
active初めて入れたとき、apt install は 15 秒ほどで終わりました。apt の出力の最後に、既定の設定で動いていることと、次に実行する sudo roamswitch server setup が出ます。apt が終わった時点で、systemctl is-active は active です。
デーモンが systemd にどう見張られているかも、見ておきます。
systemctl show roamswitch-server -p Type -p WatchdogUSecType=notify
WatchdogUSec=30sType=notify は、デーモンが準備を終えたことを、自分で systemd に知らせる形です。WatchdogUSec=30s は、デーモンが 30 秒応答しなくなると、systemd が起動し直す設定です。
active と出れば、デーモンが動いています。設定ファイルは /etc/roamswitch/server.conf です。
#doctor で、動かせる状態かを見る
最初に、RoamSwitch 自身の点検(doctor) を実行します。必要なコマンドがそろっているか、デーモンが動いているか、通知の届け先があるかを調べます。何も変更しません。
sudo roamswitch doctor[正常] RoamSwitch のデーモンが動いています
[注意] fail2ban も動いていて、ファイアウォールの規則を書き換えます。RoamSwitch の規則と重なることがあります
[正常] 署名つきデータの更新は動いています。最後の成功: 2026-11-12 01:27 UTC
[注意] 外向き通信の遮断リストが空です。何も遮断しません。
[注意] Web ルール: 見るドキュメントルートが1つもなく、Web シェルの検知は何も見ていません。/etc/roamswitch/web_rules.conf の scan_dirs にドキュメントルートを書いてください。
[注意] 緊急通知の経路が一つもありません。アラートは通知履歴にしか残らず、誰にも届きません。sudo roamswitch server setup で設定してください。
失敗はありません(注意 4 件)出力は、次のように読みます。
- 正常: 条件がそろっています
- 注意: 動きますが、対応が要るかもしれません。上の例の注意は、4 つとも別の対応です
- 失敗: 動かせない理由があります。終了コードが 1 になります
注意を1つずつ見ます。
- fail2ban: ファイアウォールの規則を書き換えるため、RoamSwitch の規則と重なることがあります。すでに使っているなら、どちらを主にするかを決めてください。ufw は、入っていても無効なら、注意に出ません。
- 外向き通信の遮断リスト: 同梱の遮断リストは空で、入れた直後は、どの宛先も止めません。止めたいアドレスがあれば、
/var/lib/roamswitch/threatfeed/malicious_ips.txtに書くか、公開の一覧の URL をegress_ip_feed_urlsに書きます(既定は空で、何も取りに行きません)。 - Web ルール: Web シェルの検知は、見るフォルダを決めるまで、何も見ません。Web サーバーを動かしているなら、フォルダを書いてください。動かしていないなら、そのままで構いません。
- 緊急通知の経路: 通知先が無いと、検知しても、誰にも届きません。次の章で設定します。
署名つきデータの更新は、初めて入れた直後に 1 回動きます。そのあとは、タイマーで 1 日 1 回動きます。時刻は UTC です(日本時間は 9 時間足して、10:27)。
#緊急通知の経路を作る
緊急通知(Telegram・LINE・Webhook) は、Telegram、LINE、Webhook に届けられます。ここでは、練習用に、同じマシンの中に受け取り側を立てて、Webhook に向けます。本物の Slack や Discord に送る前に、届き方を確かめられます。
設定ファイルを書き換える操作です(変更を伴う操作です)。練習用の環境で試してください。
受け取り側を立てます。届いた本文を、ファイルに書きます。
cat > /tmp/recv.py <<'PY'
import http.server
class H(http.server.BaseHTTPRequestHandler):
def do_POST(self):
n = int(self.headers.get('content-length', 0))
open('/tmp/recv.log', 'a').write(self.path + ' ' + self.rfile.read(n).decode() + '\n')
self.send_response(200); self.end_headers()
def log_message(self, *a): pass
http.server.HTTPServer(('127.0.0.1', 8099), H).serve_forever()
PY
nohup python3 /tmp/recv.py >/dev/null 2>&1 &届け先を設定して、テスト通知を送ります。
sudo roamswitch server config set webhook_url http://127.0.0.1:8099/hook
sudo roamswitch server config set webhook_enabled true
sudo roamswitch server test-notify webhook
cat /tmp/recv.log ✓ サーバー設定を更新・保存しました。 (webhook_url = http://127.0.0.1:8099/hook)
この経路は、まだ無効です。通知を送るには、sudo roamswitch server config set webhook_enabled true も実行してください。
反映するには: sudo systemctl restart roamswitch-server または sudo roamswitch server restart
✓ サーバー設定を更新・保存しました。 (webhook_enabled = true)
反映するには: sudo systemctl restart roamswitch-server または sudo roamswitch server restart
🔔 通知エンドポイント (webhook) へのテスト送信を実行中...
[✓ 成功] Webhook: 送信成功
/hook {"content":"🔔 [RoamSwitch Server Test] 通知連携のテスト送信に成功しました。\nホスト: ubuntu (IP: 192.168.64.6)\n時刻: 2026-11-12 01:27:45","source":"RoamSwitch Server Edition","text":"..."}webhook_url だけを設定すると、経路がまだ無効だと案内が出ます。webhook_enabled を true にするまで、通知はこの経路で送られません。
受け取り側に、本文が届きました。ホスト名、IP アドレス、時刻が入っています。時刻は、そのマシンの時計です。UTC のマシンなら、日本時間に直して読みます(9 時間足します)。
もう一度 doctor を実行すると、注意が 1 つ減ります。
sudo roamswitch doctor | tail -4[注意] Web ルール: 見るドキュメントルートが1つもなく、Web シェルの検知は何も見ていません。/etc/roamswitch/web_rules.conf の scan_dirs にドキュメントルートを書いてください。
[正常] 緊急通知の経路: webhook
失敗はありません(注意 3 件)#設定の変え方と、失敗のしかた
設定は、roamswitch server config で見て、変えます。
sudo roamswitch server config get ssh_ports
sudo roamswitch server config set ssh_ports 2222
sudo roamswitch server config get ssh_ports
sudo roamswitch doctor | grep -E 'sshd|件\)'
sudo roamswitch server config set ssh_ports 22
sudo roamswitch server config set nonexistent_key 1
sudo roamswitch server config set webhook_enabled maybe22
✓ サーバー設定を更新・保存しました。 (ssh_ports = 2222)
反映するには: sudo systemctl restart roamswitch-server または sudo roamswitch server restart
2222
[注意] sshd は 22 番でも待ち受けています。いま動いているファイアウォールは 22 番を止めていませんが、保存した server.conf の ssh_ports は 2222 です。roamswitch-server を再起動すると(server restart や OS の再起動)、ファイアウォールは ssh_ports と allowed_ports しか通さなくなり、外から 22 番へ接続できなくなります。その番号だけで入っていると締め出されます。再起動の前に: sudo roamswitch server config set ssh_ports 22,2222 のあと sudo roamswitch server restart
失敗はありません(注意 4 件)
✓ サーバー設定を更新・保存しました。 (ssh_ports = 22)
反映するには: sudo systemctl restart roamswitch-server または sudo roamswitch server restart
Error: 不明な設定キーです: 'nonexistent_key'
Error: true または false を指定してください: 'maybe'4 つのことがわかります。
- 設定を保存しても、デーモンへの反映には、再起動が要ります(
sudo roamswitch server restart)。ただし、test-notifyは、保存した設定をすぐに使います ssh_portsが sshd の待ち受けるポートと食い違うと、doctor が注意に出します。保存しただけでは、いまのファイアウォールは変わりません。再起動すると締め出されることと、その前に直すコマンドを示します- 存在しないキーや、値の形が違うものは、保存されずに、エラーになります(終了コード 1)
- 設定ファイル
/etc/roamswitch/server.confは、-rw-------(root だけが読み書き)です。通知の鍵のような、機密を書くことがあるためです
ssh_ports は、緊急隔離のあとも通す、SSH 用のポートです(設定ファイルの注記)。sshd を別のポートで動かしているなら、ここも同じ番号にしてください。食い違うと、守りが働いたあとで、自分が入れなくなるおそれがあります。実機で変える前に、sudo roamswitch doctor で、sshd のポートについての注意が出ていないかを確かめます。
sudo roamswitch server config set webhook_url http://127.0.0.1:1/none
sudo roamswitch server test-notify webhook; echo "rc=$?" 🔔 通知エンドポイント (webhook) へのテスト送信を実行中...
[✗ 失敗] Webhook: curl が失敗しました (終了コード 7), ログ:
rc=1終了コード 7 は、curl が接続できなかった、という意味です。test-notify 自身は、送信に失敗すると終了コード 1 で終わります。有効な通知の経路が1つもないときも 1 です。スクリプトでは、この終了コードで判断できます。URL の綴り、ポート、相手が動いているかを確かめます。届け先を決めたら、必ず test-notify で届くことを確かめてください。 doctor の「緊急通知の経路: webhook」は、設定が有効になっていることしか示しません。届くことは保証しません。
#見えない部分
実機(使い捨ての Ubuntu 24.04 の VM)で確かめた範囲では、次のようになります。
- doctor は、届くことを確かめません。「緊急通知の経路: webhook」が出ても、URL が正しい、相手が受け取る、という意味にはなりません。
test-notifyで確かめます - テスト通知が届いても、本番の検知の通知が届く証明にはなりません。届け先の設定が合っていることの確認です
- 通知の言語は、日本語か英語です。設定ファイルの例の注記では、
languageがen以外なら、通知は日本語で出ます。languageをenにすると、テスト通知は英語になります。コマンドが画面に出す文言(エラーを含む)は、LANGの言語で出ます - Telegram と LINE は、トークンなどの認証情報を設定ファイルに書いて、同じ
test-notify(test-notify telegram、test-notify line)で確かめます。この講座は、認証情報の要らない Webhook で、手順を練習しました
doctor が「失敗はありません(注意 4 件)」と出ました。正しい受け取り方はどれですか
解説を見る
「失敗」と「注意」は別です。失敗がなくても、緊急通知の経路が無ければ、検知しても誰にも届きません。注意は 1 つずつ読んで、自分の環境で対応が要るかを決めます。
#次に学ぶこと
- 保護レベルの切り替えと使い分けは、「保護レベルの設定と、使い分け」(準備中)で扱います
- 検知の結果を SIEM や syslog に転送する設定と、通知の履歴の読み方は、通知と転送の設定 で扱います
- 設定ファイルの全項目は、Linux Server の運用マニュアル にあります
2026-11-12に確認しました。対象は Linux 1.17.39 です。使い捨ての Ubuntu 24.04(arm64)の VM で、roamswitch-server を purge してから公式の apt の手順で入れ直し、記載のコマンドを日本語と英語で実行。Webhook は VM の中の受け取り側で、届いた本文を確かめました。
コマンドの出力は、製品の版や環境によって変わります。違いが出たら、まず製品の版を確かめてください。