第 9
ネットワークと境界
LAN 上のあらゆるデバイスを把握し、ルータのライブ状態を読み取り、外の世界からサービスへ到達する — ポートを 1 つも開けずに、あるいは開けて。
サービスを動かす Mac はネットワークの中に存在し、現実のトラブルの多くはそのネットワークから始まります — WAN リンクが切れたルータ、誤ったサブネットに紛れたデバイス、何か月も前に開けたまま閉じ忘れたポート。FrontierStack は、ネットワークとその境界(LAN とインターネットの境目)を一級のオブジェクトとして扱います。ルータを直接読み取り、LAN をスキャンしてインベントリを作り、データフロー図を描き、外部へサービスを公開するための規律ある複数の方法を提供します。
本章はサーバを取り巻くネットワークを扱います。サーバ自体を SSH で連携する方法は第 8 章、ホストファイアウォール・fail2ban・セキュリティ監査は第 10 章、Cloudflare の DNS と TLS は第 7 章を参照してください。
9.1読み取り・操作できるルータとファイアウォール
FrontierStack は、管理 API があればそれを通じて、なければ SSH で、ネットワーク機器と対話します。最も緊密な連携は OPNsense(フル REST API)と Cloudflare(第 7 章)の 2 つで、より広範なルータ・ファイアウォール群はライブ状態を報告します。Router & Network ペインでアドレス・ベンダー・API キーを指定してデバイスを追加すると、AI 管理者の router_info ツールが バージョンとモデル、稼働時間、CPU・メモリ、WAN リンクとゲートウェイ(上/下)、インターフェイス、クライアント数を読み取れます — さらに FrontierStack がマップしないフィールドの生の API JSON も。読み取り専用で、デバイス自身の API を照会し、SSH は使いません。
| デバイス | FrontierStack の到達方法 |
|---|---|
| OPNsense | フル REST API — ライブ状態、ファイアウォールルール、境界のポートフォワード(rdr) |
| pfSense | API パッケージ経由の REST |
| MikroTik RouterOS | REST API(RouterOS v7 以降) |
| Ubiquiti UniFi/EdgeOS | コントローラ/ゲートウェイの API キー |
| OpenWrt | LuCI/ubus API |
| DD-WRT | Web 管理/SSH |
| ASUSWRT | ルータ Web API/SSH |
| FRITZ!Box | TR-064/Web 管理 |
| TP-Link Omada | コントローラ API |
router_info はそれがどこにピン留めされ、到達可能かを報告し — Router & Network で API キーを追加すればバージョン・ゲートウェイ・WAN・インターフェイスをライブで読み取れると案内します。OPNsense と pfSense では、API キーを設定すると継続的なファイアウォール監視(ピン留めデバイスのペインにあるトグル)が使えます。アラートのスイープごとにファイアウォール自身へゲートウェイ状態・インターフェイスのキャリア・サービスの稼働を照会します — マルチ WAN ルータがサイレントにフェイルオーバーして WAN 回線の死を隠しても(サーバは外に出られるのにサイトへのインバウンドは全滅)、原因不明の赤いドットの海ではなく、どのゲートウェイが落ち、どのポートがキャリアを失ったかを名指しで通知します。ルータには何もインストールしません。OPNsense の REST API は標準搭載、pfSense は REST API v2 パッケージのみ必要です。同じペインから OPNsense ルータをテイルネットに参加させることもできます。Mac 側で Tailscale にサインイン(Google アカウント可)して事前認証キーを発行し、デバイスペインの Tailscale セクションに貼り付けるだけで、FrontierStack が必要に応じて os-tailscale プラグインをインストールし、キーとログインサーバ(Headscale も可)を保存してサービスを API 経由で再起動します。ルータでのブラウザログインは不要です。
攻撃と障害の兆候。ゲートウェイを監視するのと同じスイープが、ルータ自身のトラブルも監視します。異常のあるルータはサイドバーでオレンジ+警告三角になります — 理由はホバーで表示。侵入検知プラグインを有効にした OPNsense では、同じ API 経由で直近の Suricata アラートを読み取り、件数と上位シグネチャを表示します(ファイアウォール UI を開かずに攻撃の試みを可視化。pfSense の REST API は IDS を一律に公開しないため現状は OPNsense のみ)。すべての監視対象ルータ — OPNsense、pfSense、OpenWrt ほか — では各スイープが、予期しない再起動(稼働時間の急減:クラッシュ・電源イベント・攻撃)、ルータ管理/SSH への総当たりの急増(失敗ログインの連続。最も多い送信元 IP をルータ自身のログから名指し)、リソース逼迫(メモリまたは負荷が危険なほど高い — DoS・暴走/侵害されたプロセス)、利用可能なファームウェア更新(古いファームウェア=既知の穴)も検出します。それぞれアラートを上げ、あるプラットフォームが報告できない兆候は単にスキップします — 誤った「異常なし」にはなりません。OPNsense と OpenWrt が最も多く報告し、pfSense の API はより限定的です。
ルータの操作と診断。AI 管理者は読み取り以上のこともできるようになりました:reboot_router はサーバの再起動と同じ方法でアプライアンスを再起動し(OPNsense/pfSense は API、OpenWrt は SSH)、「Allow changes」でゲートされます。ルータ自身のコンソールで行う方が本当に適したタスクのときは、アシスタントが open_web_ui でその Web UI を開くことを提案します — アドレスは推測せずデバイスペインから解決します。FrontierStack 自身はこれらアプライアンスのファイアウォールルールを意図的に編集しません — OPNsense/pfSense/OpenWrt は独自の設定システムでルールを管理するため、ペインとアシスタントは代わりにネイティブのファイアウォールページを案内します(ルータを右クリック ▸ Open firewall rules… が直接移動)。ペインの利便機能が 2 つあります:Diagnostics ボタンは API 不要の到達性チェック(ping、よく使う管理ポート 80/443/8443/53、逆引き DNS、ゲートウェイ)を実行するので、API キーがなくてもルータをトリアージできます。またルータ/ファイアウォールでは、Discover Services がポートスキャンではなく Web UI を開くことを提案します(自分の境界機器をスキャンするのは通常望ましくありません)。OPNsense や pfSense への SSH が拒否される場合、SSH が無効になっているか — より多いのは — 特定のインタフェース(多くは WAN ではなく LAN)でのみ許可されているためです:LAN 経由(例:VPN 経由)なら通常つながり、外部からは通常ブロックされます。Web UI で SSH と待ち受けインタフェースを有効にしてください(OPNsense は System ▸ Settings ▸ Administration ▸ Secure Shell)。SSH ボタン自体が非表示になるのは、管理シェルをまったく持たない民生用ゲートウェイ(NTT、一部の TP-Link/FRITZ!Box)だけで、その場合は Web UI が唯一の入口です。
9.2Device Discovery:LAN のインベントリ
Device Discovery を開き、Find Monitors を押します(先にサブネットを選んでも構いません)。FrontierStack は選んだ /24 を利用可能なすべての方法で一斉にスイープし、ルータ・アクセスポイント・スイッチ・NAS(Synology、QNAP、ZimaCube/ZimaOS など)・プリンタ・カメラ・他のサーバをまとめて浮かび上がらせます。
- Ping/ARP — ICMP スイープ。ARP/MAC が各ホストのベンダーを示します。TCP Probe をオンにすると、ICMP をフィルタするホストも見つかります。
- Bonjour(mDNS)と SSDP/UPnP — アドバタイズされたサービスとそのフレンドリ名。
- SNMP と LLDP/CDP —
net-snmpとlldpdをインストールするとモデル・ポート・近隣の詳細が加わります(ペイン内のボタンでインストール)。 - Windows サービスポート — ICMP をフィルタするマシンも、特徴的なポート(RDP・WinRM・SMB など)を探ることで見つかるため、Windows PC がスイープから隠れることはなくなりました。
スキャンは各ホストの到達方法も記録します。ローカルで AnyDesk が稼働中、または既定ポート 7070 で応答すると AnyDesk バッジが付き、この Mac 自身の tailscale status から Tailscale バッジ(ピアがオンラインなら緑)が付いてメッシュのピアを検出デバイスに対応付けます(保持するのはエンドポイント・ホスト名・OS のみで、ログイン名は保持しません)。直接接続の LAN では、macOS が既に Bonjour で把握している Mac やデバイスが低速な IP スイープより先に現れ、一覧がすばやく埋まります。デバイス詳細には対応する AnyDesk/Tailscale 行とアプリを開くショートカットがあります。
AI 管理者の discover_devices ツールは同じスキャンを実行し、種別を確信を持って識別できたデバイスを自動でピン留めします。あいまいなものは推測せず一覧に戻すので、アシスタントはそれが何かをあなたに尋ね、pin_device でピン留めできます。ピン留め(監視)されたデバイスはその種別のサイドバーセクションに現れ、ダブルクリックでペインを開けます。行の Open Web UI・Discover Services・Reclassify・Remove も使えます。アドレスが分かっていれば Add a device by IP フィールドが直接プローブしてピン留めします — 全体スキャンは不要です。
9.3Data Map
Data Map ペインはロケーションごとのデータフロー図を描きます。1 つの拠点で、データがどこに存在し、デバイスやサービスを横断してどう流れるかを示します。FrontierStack はそのロケーションのインベントリ — 検出したデバイス、その役割、(任意で)スキャンしたポート — をシリアライズし、秘密情報を伏せて、ローカルの claude CLI を通じてあなたのサブスクリプション Claude に渡します(アプリ内ハーネスが使う従量課金 API ではありません)。返答は Mermaid フローチャートと短い説明として戻り、ペイン内でオフライン描画されます。各ロケーションの最新図は保持され、Obsidian ボールトにランブックとして保存できます。ロケーション自体は第 8 章で説明します。
9.4ポートを開く:UPnP と NAT-PMP/PCP
従来の方法でインターネットからサービスへ到達するには、ルータのポートを Mac へフォワードする必要があります。手作業でルータにログインさせる代わりに、FrontierStack はルータがアドバタイズする標準プロトコルでマッピングを依頼できます。
- UPnP IGD(
miniupnpc経由)— 一般的な家庭用ルータの方法。 - NAT-PMP/PCP(
libnatpmp経由)— Apple 由来の方式とその現代的後継。 - OPNsense — その API を通じて境界ルールとポートフォワードを直接設定。
これらのツールは初回使用時にオンデマンドでインストールされます。一時セッション用に作ったマッピング(Debug Share 参照)は、セッション終了時に自動で撤去されます。
9.5ダイナミック DNS:変化する IP を追う
家庭や小規模オフィスの回線は静的 IP を持たないことが多く、今日のアドレスに向けたホスト名は明日には古くなります。Dynamic DNS ペインはホスト名を現在のパブリック IP に追従させます。Name、Hostname(例 myhost.duckdns.org)、プロバイダのアカウント情報でエントリを追加し、Update Now で即時公開するか、Update automatically をオンにします。更新を FrontierStack の実行中のみ行うか、システムサービスとして恒久的に行うかを選べるので、アプリを閉じてもレコードは最新に保たれます。Cloudflare ユーザにはより緊密な経路があります — パブリック IP を追う Cloudflare DDNS A レコードで、第 7 章と同じ Cloudflare 連携が動かします。他プロバイダは更新 URL による汎用インターバル更新がカバーします。
9.6トンネルとメッシュ:開けずに届く
外部からサービスへ到達するより良い方法は、受信ポートを完全に省くことです。トンネルは外向きの接続を張り、外部エンドポイントがそれに乗って戻ってくることで、何もフォワードせず NAT を越えます。
- Cloudflare Tunnel — クイックトンネルはアカウント不要で公開
*.trycloudflare.comURL を、名前付きトンネルは恒久的なホスト名を与えます。 - Tailscale — Serve はサービスを tailnet 内で非公開に保ち、Funnel は Tailscale ノードを通じてインターネットへ公開します。
マシン間の継続的な接続には、メッシュ/VPN ネットワークが、どこへ移動しても各ノードに安定した私的アドレスを与えます。FrontierStack は一般的なものを管理します — 対応ルータ(OPNsense)では API で、サーバでは SSH で。
| ネットワーク | 内容 |
|---|---|
| WireGuard | 現代的で高速なカーネル VPN トンネル — 他の多くが土台にする基盤層 |
| Tailscale | 出口ノードとサブネットルータを持つ WireGuard メッシュ。SSH または OPNsense API で設定 |
| Headscale | セルフホストのオープンソース Tailscale コントロールサーバ |
| NetBird | オープンソースのゼロトラストネットワーク。セルフホスト可能 |
| Nebula | 軽量なオーバーレイメッシュ(Slack/Defined Networking) |
| ZeroTier | ゼロトラスト SD-WAN/仮想ネットワーク — エージェント+API |
9.11.1テイルネット:Tailscale 全体のビュー
サーバごとの Tailscale 操作は各サーバのペイン内にあり、SSH 経由で「そのマシンでデーモンが動いているか」を確認します。テイルネットペインは、Tailscale 自身の API でしか分からないネットワーク全体の状況を扱います。API アクセストークン(このペインは書き込みを行わないため、デバイスの読み取り権限だけで十分)を貼り付けると、各デバイスのアドレス、OS、クライアントバージョン、所有者、タグ、最終確認時刻が一覧表示されます。
このペインの価値は「要対応」リストにあります。期限が近づいたノードキー(キーが失効するとデバイスは静かにテイルネットから外れ、再認証するまで戻りません=予定された障害)、承認待ちのデバイス、承認されていないルートを広告しているデバイス(ノードは正常なのにサブネットへ到達できない典型的な原因)、そして数週間チェックインしていないデバイスを表示します。キーの期限切れと承認待ちはアラートにも通知されます。
9.11.2自前の ZeroTier コントローラを運用する
ZeroTier のクライアントはメンバ側だけで、ネットワークの管理は通常 my.zerotier.com で行います。しかし zerotier-one はどのインストールでも、そのネットワークのコントローラ自体になれます。完全にセルフホストでき、メンバ一覧を第三者に預ける必要もありません。ただしこの構成にはローカルの管理 UI が一切付属しません。ZeroTier コントローラペインがその欠けた部分を埋めます。
コントローラの identity と所有するネットワークを表示し、メンバの承認キューをワンクリックの承認/取り消しで処理できます。承認済みでも 2 週間確認されていないメンバには印が付きます。使われていない許可はネットワークの穴になり続けるためです。ネットワーク名、公開/非公開、ルート、IP 割り当てプールを編集でき、ZeroTier 独自のルール言語でフロールールを記述できます。入力しながらローカルでコンパイルされ、よくある構成のテンプレートに加えて、全員を締め出すルールセットを保存する前に警告が出ます。
すべての操作はコントローラ自身のループバック API に対して SSH 経由で行われます。コントローラは 127.0.0.1:9993 で待ち受け、root 権限で読めるトークンで認証するため、FrontierStack はコントローラ API を外部に公開する必要がなく、むしろ公開しない設計です。内蔵の監査は、誰かが公開してしまっている場合や、ファイル権限が緩い場合、バックアップがない場合に警告します。Prometheus への書き出し、ウォームスタンバイのバックアップ/復元、ZeroTier Central からの移行アシスタントも用意しています。
identity.secret は代替不可能です。失うと、そのコントローラが持つすべてのネットワーク ID が孤立します。暗号化して別の場所にバックアップしてください。9.7UniFi:クラウドゲートウェイと Dream Machine
Ubiquiti のコンソールには専用ペインを用意しています。UniFi ゲートウェイは、汎用のルータ監視では見えない仕事をしているためです。UniFi ペインは Ubiquiti の 2 つの API を扱います。両者は答える問いが異なります。Site Manager キー(unifi.ui.com で作成する 1 つのキー)は、アカウント内の全コンソールを機種・ファームウェア・オンライン状態とともに一覧します。遠隔サイトが電源やインターネットを失ったことを知る唯一の方法です。ネットワークから切り離されたコンソールは、ローカルでは何も伝えられないからです。コンソール側(設定 ▸ 管理者とユーザ)で作成するローカル API キーは、ゲートウェイの現在の動作を明らかにします。
ローカル接続では、WAN 回線を ISP・レイテンシ・スループットとともに表示し、実際に通信を担っている回線を示します。この点が重要です。プライマリ回線が落ちると UniFi は無言でバックアップに切り替えますが、バックアップは多くの場合低速で従量課金です。通常これに気付くのは翌月の請求書です。さらに、アダプト済みデバイスとファームウェア、ゲートウェイが評価する順序どおりのファイアウォールルール、クライアント一覧、そしてすべてのポートフォワードを表示します。有効なポートフォワードはいずれもファイアウォールに意図的に開けた穴なので、任意の送信元アドレスからの接続を受け付けるものには印を付けます。公開ウェブサーバなら妥当ですが、それ以外では確認する価値があります。
アラートは、コンソールのオフライン、WAN 回線のダウン、バックアップ回線での稼働、デバイスのネットワーク離脱、インターネットに開放されたポートフォワードを対象とします。このペインは意図的に読み取り専用です。ルールやネットワークの変更は、その検証機構がある UniFi コンソール側に残します。PoE のポート制御は次節が扱い、コンソールの単純な到達性は従来どおり Router & Network にも表示されます。
9.8Power over Ethernet:電源ボタンのない機器の電源ボタン
アクセスポイント、カメラ、ドアコントローラ、デスクフォンには電源スイッチがありません。唯一の電源は接続先のスイッチポートです。そのため、応答しなくなった機器の復旧手段である「電源を入れ直す」には、通常ベンダの Web UI にログインするか、キャビネットまで歩く必要があります。
Power over Ethernet ペインは、そのポートをボタンに変えます。管理スイッチを IP で追加すると、ポートごとに PoE の状態(給電中、検索中、障害)、受電機器のクラス、優先度、スイッチが報告していれば消費電力が表示され、電源のオン/オフと電源の入れ直しが行えます。さらにスイッチの電力バジェット(総容量、使用中の電力、スイッチ自身の使用率しきい値の超過警告)も表示します。しきい値を超えるとスイッチは優先度の低いポートから給電を止めるため、ポート優先度もここで変更できます。
幅広く動作するのは PoE が標準化されているからです。RFC 3621 の POWER-ETHERNET-MIB は、ほぼすべての管理スイッチ(Cisco、Aruba/HPE、Netgear、TP-Link/Omada、Ubiquiti、MikroTik、D-Link、Zyxel)が実装しています。読み取りにはデバイス検出の SNMP コミュニティを使います。ポートの電源操作には読み書き可能なコミュニティが必要で、スイッチごとに設定し、キーチェーンに保存されます。接続機器の電源を切る操作は明示的な同意に値しますし、多くのスイッチではこのコミュニティが読み取り専用とは別に管理され、初期状態では無効になっています。監視を有効にすると、障害状態のポートや電力バジェットを超えたスイッチがアラートに上がります。どちらも、誰かがカメラの停止に気づくまで見えないままになりがちな問題です。
9.9インターネットヘルスと速度テスト
Internet Health ペインは回線そのものを見るための画面です。Targets の一覧(Cloudflare の 1.1.1.1 など、編集可能)を継続的に ping し、レイテンシとパケットロスを表示して 30 秒ごとに再テストします。ICMP をブロックするホストは :443 への TCP 接続レイテンシにフォールバックします。Live Traffic は全アクティブインターフェイスのリアルタイムスループットをグラフ化し、Addresses & Networks は各インターフェイス、そのサブネット(直接到達できるネットワーク)、ゲートウェイを一覧します。組み込みの traceroute は、トラフィックが横切る ISP やトランジット事業者を示します。Speed Test セクションで Test Now を押す — または AI に internet_speed を頼む — と、ダウンロード・アップロード・レイテンシ・応答性を測定します。Ookla の speedtest CLI があればそれを、なければ Apple の networkQuality を使います。
9.10Debug Share:localhost サーバを一時的に公開
localhost で動く開発サーバを同僚やスマホに見せたいとき、Debug Share ペインがそれをセッション中だけ公開し、その後自ら閉じます。ポートを入力(または Scan localhost で稼働中のサーバを検出)し、Expose via で公開方法を選び、Auto-close 時間を設定して、Open debug session を押します。すべての共有は FrontierStack 終了時にも自動で閉じます。
| 方法 | 到達範囲 |
|---|---|
| Cloudflare Quick Tunnel | 公開 *.trycloudflare.com URL、アカウント不要 — クライアントやスマホへの手早いプレビューに最適 |
| Tailscale Serve | 非公開 — tailnet 内からのみ到達可能 |
| Tailscale Funnel | 公開、Tailscale ノード経由(tailnet で Funnel を有効化する必要あり) |
| LAN forwarder | 0.0.0.0:<自動> → 127.0.0.1:port ブリッジ。同一 LAN の他マシンがループバック専用サーバへ到達できる |
LAN フォワーダには 2 つの追加機能があります。ホストファイアウォールがオンなら、ペインに Open port in firewall が現れ、そのポートをセッション中だけ pf ルールで許可します。また Outside access ピッカーで UPnP・NAT-PMP・OPNsense API 経由の WAN ポートをマップし、DDNS host と組み合わせれば、LAN 共有をパブリックインターネットから到達可能にできます — マッピングは共有終了時に削除されます。AI 管理者もセッションの開始・一覧・終了ができます(debug_share_open/_list/_close)。「Allow changes」がオンなら MCP 経由でも可能です。
9.11名前付きトンネル:恒久的な公開ホスト名
クイックトンネルはあえて使い捨てです。この Mac のサービスを実際のアドレスで恒久的に到達可能にしたいとき — セルフホストのアプリ、社内ダッシュボード、Webhook 受信口など — は、代わりに名前付きトンネルを使います。サービスに自分の Cloudflare ゾーン上の安定したホスト名(例:app.example.com)を与え、再起動しても維持され、他のトンネル同様に着信ポートを一切開きません:Mac が Cloudflare のエッジへダイヤルアウトするため、フォワードするものも、ポートスキャンで見つかるものもありません。
Cloudflare ペインの名前付きトンネルセクションで作成します:新規トンネル…、続いて自分のゾーン配下のホスト名と、その前段に置くローカルポート。FrontierStack はすでに保持しているトークンを使い、Cloudflare API 経由でセットアップ全体を実行します — トンネルを作成し、イングレスルール(hostname → http://localhost:PORT)を書き込み、ホスト名を <id>.cfargotunnel.com に向けるプロキシ済み CNAME を追加し、cloudflared service install で永続デーモンをインストールします。最後の手順には一度きりの管理者プロンプトが必要です(/Library 配下に LaunchDaemon を書き込みます)。cloudflared 自体は初回利用時に Homebrew から取得されます。トンネルと DNS の作成だけを行い、cloudflared を別ホストで実行したい場合は、この Mac で今すぐ実行のチェックを外します。削除はそのすべて — デーモン、DNS レコード、アカウント側のトンネル — を巻き戻します。AI 管理者も同じ 3 つの動詞(tunnel_create/tunnel_list/tunnel_delete)を持ち、作成はサービスをインターネットに公開するため赤い確認でゲートされます。
cloudflared service install は Mac ごとに 1 つのシステムデーモンを実行するため、ローカルで一度に動く名前付きトンネルは 1 つです。追加の名前付きトンネルをアプリで作成・ルーティングし、その cloudflared コネクタを他のマシンで実行することは可能です — アカウント・ホスト名・DNS はいずれの場合もセットアップされます。FrontierStack ユーザマニュアル · バージョン 1.0.0 · 第 9