VPSでOutline VPNサーバーをセルフホストする方法
wiki版ではなくOutline VPNサーバーをVPSで運用します。インストール手順、アクセスキー、管理APIポート、Shadowsocksで隠せない情報を解説します。
Outline VPN サーバーとは
Outline VPN サーバーをセルフホストするには、自分の VPS 上で 2 つのコンポーネントを動かします。1 つは Shadowsocks プロキシサーバーで、もう 1 つはその前段で動作する小規模な REST(representational state transfer)管理 API です。両方とも Outline Manager デスクトップアプリから操作します。このアプリは、利用者に送るアクセスキーを ss:// 文字列として発行します。Outline を選ぶ主な理由は、VPN をブロックするネットワークからインターネットへ接続することです。最大スループットを重視した設計ではありません。
まず、検索結果で常に混同されているため、名称を区別しておきます。Outline VPN は、このページで説明する回避ツールで、getoutline.org にあります。Outline は、別のドメインで提供され、別の運営者が管理する、セルフホスト型の wiki およびナレッジベースの名称でもあります。共通しているのは名前だけです。wiki の情報を探している場合、このページは対象外です。
Outline VPN の開発元
現在も多くのガイドでは、Outline を Google の製品として扱っています。これは当初は正しかったものの、現在は正しくありません。Outline は 2018 年に、Google 内部のインキュベーターである Jigsaw によって開始されました。2026 年 8 月時点で、プロジェクトの公式サイトには、Outline は独立した非営利団体である Outline Foundation が所有しており、コードは GitHub の OutlineFoundation 組織に置かれていると記載されています。信頼できるかどうかを判断する際、この点は重要です。ガバナンスに関する答えは 2018 年と現在で異なります。所有者を誤って記載しているガイドは、移動済みのリポジトリパスを案内している可能性も高くなります。
インストーラーが実際にサーバーへ配置するもの
インストールスクリプトは何もコンパイルしません。Docker コンテナを実行します。
shadowbox。quay.io/outline/shadowbox:stableイメージを使用します。これは管理サーバーであり、データプレーンとしてプロジェクトの Shadowsocks バックエンドであるoutline-ss-serverを実行します。watchtower。タイマーで新しいshadowboxイメージを確認します。デフォルトでは 1 時間に 1 回確認し、新しいイメージを見つけるとコンテナを再起動します。- 自己署名 TLS(transport layer security)証明書と秘密鍵。これらはサーバーの状態ディレクトリに書き込まれます。公開認証局は関与しないため、manager は証明書チェーンを検証せず、SHA-256 フィンガープリントでその証明書をピン留めします。
状態データは /opt/outline 以下に保存され、永続ファイルは /opt/outline/persisted-state に置かれます。
Watchtower については、曖昧に扱わず、方針を決める必要があります。イメージを自動更新すると、何もしなくてもセキュリティ修正が適用されます。一方で、監査したバージョンが、読んでいない変更履歴のまま一晩で変わる可能性もあります。どちらを重視するかを決めてください。アップグレードを自分で管理する場合は、watchtower コンテナを削除し、自分で決めたスケジュールで新しいイメージを pull してください。
インストーラーが実際に確認する前提条件
- 64 ビットの x86 マシン。 スクリプトは
Unsupported machine type: ${MACHINE_TYPE}. Please run this script on a x86_64 machineで停止します。標準イメージでは ARM VPS プランは動作しないため、プランを契約する前にアーキテクチャを確認してください。 - Docker。 Docker がない場合、スクリプトはインストールを提案し、
Would you like to install Docker? This will run 'curl https://get.docker.com/ | sh'.と表示します。Docker はインストール済みでもデーモンが停止している場合、スクリプトは docker daemon が実行中かどうかを確認するメッセージを表示して失敗します。sudo systemctl enable --now dockerで起動し、インストーラーを再実行してください。 - スクリプト自身が検出できるパブリック IPv4 アドレス。 スクリプトは外部サービス(現在は
icanhazip.com、ipinfo.io、および Google のエンドポイント)に問い合わせ、管理 URL に書き込むアドレスを取得します。NAT(network address translation)配下にある場合や、外向き HTTP がブロックされたホストでは、この検出に失敗します。その場合は--hostnameでアドレスを指定してください。 - sudo 経由の root。
プロジェクトのドキュメントでは、サポート対象のベースとして Ubuntu 20.04 LTS または Debian 10 を指定しています。すべてがコンテナ内で動作するため、通常は新しい Ubuntu でも動作します。ただし、その場合はプロジェクトがテストしている構成から外れます。
Outline VPN サーバーをインストールする
これは、2026 年 8 月に確認した developer.getoutline.org にあるプロジェクト公式ドキュメントのコマンドです。このガイドを含め、どのガイドにあるコピーもそのまま信頼せず、自分でアクセスして確認してください。リポジトリはすでに一度移動しており、この行の古いコピーを使うと、アーカイブ済みのパスからインストールすることになります。
sudo bash -c "$(wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh)"実行する前にスクリプトを読んでください。リモート URL を root シェルへパイプすると、その時点で URL が返す内容をすべて実行することになります。先に確認しても 1 分程度しかかかりません。
wget -qO- https://raw.githubusercontent.com/OutlineFoundation/outline-apps/master/server_manager/install_scripts/install_server.sh | less次の 3 つのオプションフラグを使うと、自動生成された値ではなく、任意の値を指定できます。
Usage: install_server.sh [--hostname <hostname>] [--api-port <port>] [--keys-port <port>]
--hostname The hostname to be used to access the management API and access keys
--api-port The port number for the management API
--keys-port The port number for the access keys固定されたポート番号を想定しないでください。 --api-port と --keys-port を省略すると、スクリプトはそれぞれに 1023 より大きいランダムなポートを選択します。Outline に既知の固定ポートはありません。特定の番号を示すガイドは、そのガイドの環境でのインストール結果を記載しているだけで、あなたの環境の番号ではありません。実行結果からポート番号を確認してください。
成功すると、CONGRATULATIONS! Your Outline server is up and running. で始まるバナーが表示されます。続いて、波括弧を含む次の行を Outline Manager のインターフェースにコピーするよう求められます。この行の形式は次のとおりです。
{"apiUrl":"https://<your ip>:<api port>/<random secret>","certSha256":"<fingerprint>"}次に、選択された番号を埋め込んで、開放するポートを正確に示します。
Make sure to open the following ports on your firewall, router or cloud provider:
- Management port ${API_PORT}, for TCP
- Access key port ${ACCESS_KEY_PORT}, for TCP and UDPターミナルを閉じて設定行を失っても、その行はサーバー上に残っています。sudo cat /opt/outline/access.txt で再表示できます。
Manager を開く前に、コンテナが実際に実行中であることを確認してください。
sudo docker psshadowbox と watchtower が表示され、どちらも Up ステータスになっていることを確認します。shadowbox コンテナが再起動を繰り返している場合、Manager は接続できません。sudo docker logs shadowbox に原因が表示されます。
管理 API ポートを不用意に公開してはいけない理由
もう一度 apiUrl を確認してください。ユーザー名もパスワードもありません。この URL のランダムなパス部分が認証情報であり、それが認証の仕組み全体です。管理ポートに接続でき、そのパスを知っている人は、サーバー上のすべてのアクセスキーを読み取り、すべて削除できます。
スクリプト自体が提案する UFW(Ubuntu の uncomplicated firewall)は、管理ポートをインターネット全体に公開します。
sudo ufw allow ${API_PORT}/tcpこれは便利ですが、必要以上の設定です。アクセスキーポートはユーザーが接続するため、インターネット全体に公開する必要があります。一方、管理ポートは Outline Manager を実行する場所からだけ到達できれば十分です。接続元を限定してください。
sudo ufw allow <keys port>/tcp
sudo ufw allow <keys port>/udp
sudo ufw allow from <your admin ip> to any port <api port> proto tcpさらによい方法は、公開側のファイアウォールでは管理ポートを閉じ、すでに運用しているプライベートトンネル経由で接続することです。VPS に WireGuard VPN をセルフホストする手順を進めている場合、Outline のサーバーをそのトンネルに参加させ、API にはトンネルのアドレスでのみ応答させられます。これにより、公開 IP をポートスキャンしても、アクセスキーポート以外は検出されません。多くのプロバイダーでは、サーバー上のファイアウォールとは別に、コントロールパネルにもネットワークファイアウォールがあります。両方で通信を許可する必要がある点に注意してください。
この設定行について、もう2つ重要な点があります。Outline のドキュメントでは、この設定を機密情報として扱い、管理アクセスが必要な人にだけ、通常のメールやチャットではなく暗号化された通信経路で共有するよう求めています。また、一度共有した設定を無効化するのは簡単ではありません。手動でインストールしたサーバーでは、共有済みの管理設定を無効化する公式の方法は完全な再インストールです。この操作では、発行済みのすべてのユーザーアクセスキーもリセットされます。この文字列は、実質的にサーバーの root パスワードと同じものとして扱ってください。
アクセスキーの発行と失効
Outline Manager はボタンでキーを作成します。内部では secret API path に対する通常の HTTP 通信を行っているため、スクリプトから実行できます。
API="https://SERVER_IP:API_PORT/SECRET_PATH" # the apiUrl from access.txt
curl -k "$API/access-keys"
curl -k -X POST "$API/access-keys"
curl -k -X PUT "$API/access-keys/3/name" -H 'Content-Type: application/json' -d '{"name":"anna-laptop"}'
curl -k -X DELETE "$API/access-keys/3"証明書は self-signed のため、-k が必要です。これを指定しないと、curl は SSL certificate problem: self-signed certificate で停止し、リクエストを送信しません。API ではキーごとのデータ制限も設定できます。PUT /access-keys/{id}/data-limit で制限を設定し、DELETE /access-keys/{id}/data-limit で解除します。これにより、1 人のスマートフォンのバックアップだけで月間の帯域幅上限を使い切る事態を防げます。
1 人につき 1 つのキーを発行します。 これが、他の運用が機能するかどうかを決めるルールです。失効はキーを削除することで行います。サーバーは直ちにそのキーを受け付けなくなるため、退職した人は削除を実行した時点でアクセスできなくなります。10 人で 1 つのキーを共有している場合を考えてみましょう。そのうち 1 人だけを削除することはできません。キーを削除すると 10 人全員が利用できなくなり、9 人分のキーを再発行する作業が必要になります。各キーに所有者の名前を付けることで、削除コマンドを安全に実行できます。
削除しても行われないことを明確に理解してください。ss:// 文字列は、すでに誰かに送信した Secret です。キーを削除すると、サーバーはそのキーを受け付けなくなります。これは自分で制御できる部分です。ただし、送信済みのメッセージからその文字列を回収することはできません。そのため、キーが漏えいした場合は、コピーが消えたと考えずに、そのキーを削除して新しいキーを発行してください。
Outline は完全なトンネルではなく、プロキシです
WireGuard から移行してきた人が驚きやすいのが、この違いです。Shadowsocks は、TCP と UDP の接続をプロキシ経由で転送します。サーバー上にネットワークインターフェースは作成されず、ピアアドレス、ルーティングテーブルのエントリ、サーバーの背後にあるサブネットという概念もありません。outline-ss-server は TCP と UDP を転送するため、ブラウザー、アプリ、DNS はすべてその経由で動作します。一方、ping は動作しません。ICMP(Internet Control Message Protocol)は、Shadowsocks プロキシが転送する対象ではないためです。curl https://ifconfig.me でテストし、返されるアドレスが自分のアドレスではなく、サーバーのアドレスであることを確認してください。
この違いによる影響は、明確に理解しておく必要があります。WireGuard のピアが 10.20.0.0/16 に到達するように、Outline サーバーの背後にあるプライベートネットワークへ到達することはできません。Outline には配布するルートがないためです。Outline を使って 2 台のサーバーを相互接続することもできません。クライアント間のピアツーピア通信もありません。そのため、スマートフォンから自ホストの写真サーバーへトンネル経由でカメラロールを同期する、よくある自宅環境の構成にも使えません。その構成が目的なら、まず PhotoPrism と Immich の比較 からサーバーを選び、プロキシではなく、ルーティング可能な VPN を用意してください。アドレスとルートを持つ実際のネットワークが必要なら、Outline は適切なツールではありません。出発点としては WireGuard と OpenVPN の比較 のほうが適しています。
難読化で実現できることと、できないこと
Shadowsocks は最初の 1 バイトから暗号化と認証を行います。平文のハンドシェイク、プロトコルバージョンフィールド、証明書交換、固定ヘッダーはありません。通信上では、接続は高位ポートへ送られるランダムなバイト列のストリームに見えます。これが Outline の根拠のすべてです。WireGuard のハンドシェイクや、最初のパケットに含まれる OpenVPN のオペコードを認識するよう調整された DPI(deep packet inspection)装置でも、ここでは照合対象がありません。outline-ss-server にはリプレイ攻撃防止機能もあり、--replay_history で有効にできます。これにより、検閲者が取得済みのパケットを再送し、サーバーの応答を調べるタイプの能動的プロービングを防げます。
ここからは、できないことを正直に説明します。
- 通信フローを隠すことはできません。 通信は依然として 1 つのアドレスへ、数時間にわたって大量に送られます。ペイロードを読めなくても、タイミングと通信量の分析は可能です。
- 匿名にはなりません。 プロバイダーは、誰がサーバーを契約したかを把握しており、通常は支払い情報も保有しています。また、アクセス先のすべてのサイトにはサーバーのアドレスが表示されます。VPS のレンタルと VPN サービスの購入の違いでは、自分の名前でサーバーを契約すると脅威モデルがどう変わるのか、脅威モデル自体がなくなるわけではない理由を説明しています。
- ブロックされたアドレスには対応できません。 検閲者がサーバーの IP をブロックすると、難読化する対象が到着しないため、難読化は意味を持ちません。
- 鍵の共有は防げません。 公開グループチャットに投稿された鍵は、検閲者も取得して使用できます。その結果、ブロックすべきアドレスを正確に知られることになります。
最後の 2 点が、規模の大きい迂回には、多数のアドレスを用意し、ローテーションしながら慎重に配布する必要がある理由です。Tor project はまさにこの問題を解決するためにブリッジを構築しました。相手がサーバーをレンタルするより速くアドレスをブロックする場合は、2 台目の VPS を契約する前に、Tor ブリッジと pluggable transports が未公開のエントリーポイントを配布する仕組みを読んでください。
Outline と代替手段の選び方
ネットワークで VPN プロトコルが遮断され、支援する相手が設定ファイルを編集しない場合は、Outline を選びます。送る文字列は 1 つだけで、相手はそれをアプリに貼り付けます。これは実際の利点であり、Outline が存在する主な理由でもあります。
ネットワークが WireGuard を通す場合は、WireGuard を選びます。WireGuard は高速で、カーネル内で動作し、ルーティング可能なネットワークを提供します。運用に必要な仕組みもはるかに少なくなります。完全な構築手順は WireGuard VPN サーバーガイドにあります。
攻撃者がプロトコルではなくアドレスを遮断する場合や、到達性だけでなく匿名性も必要な場合は、ブリッジまたは pluggable transport を選びます。
問題が検閲ではなくフリート管理である場合は、control plane を備えたメッシュを選びます。鍵の配布とアドレスの割り当てを手作業で行う方法は、マシンが十数台ほどになると拡張できなくなるためです。自己ホスト型の NetBird サーバーを使えば、その管理作業を任せられます。control plane 自体を運用したくない場合は、まず Tailscale の無料プランで実際に利用できる範囲を確認してください。家庭や小規模チームのフリートであれば、多くの場合その範囲に収まり、運用費用もかかりません。
FAQ
Outline VPN は Outline wiki と同じものですか?
いいえ。名前が同じだけで、無関係のプロジェクトです。Outline VPN は getoutline.org にある検閲回避ツールで、Shadowsocks サーバーと REST 管理 API で構成され、Outline Manager デスクトップアプリから操作します。Outline wiki はチーム向けの、別のドメインで提供される自己ホスト型ナレッジベースです。「self-host Outline」で検索すると、両方が表示されます。インストールコマンドをコピーする前に、ドメインを確認してください。
Outline VPN は現在も Google の製品ですか?
いいえ。2026 年 8 月時点では、Google の製品ではありません。Outline は 2018 年に、Google 内のインキュベーターである Jigsaw によって開始されました。古いガイドにある「Google VPN」という説明は、この経緯に由来します。現在、プロジェクトの公式サイトには、Outline は独立した非営利団体である Outline Foundation が所有していると記載されています。ソースリポジトリは、GitHub の OutlineFoundation 組織にあります。
Outline サーバーはどのポートを使用しますか?
設計上、固定の答えはありません。インストーラーに --api-port と --keys-port を渡さない場合、管理 API 用に 1023 より大きいランダムなポートを 1 つ、アクセスキー用に別のポートを 1 つ選択します。処理の最後に両方のポートが表示され、ファイアウォールとプロバイダーのネットワークファイアウォールで、管理ポートは TCP、アクセスキー用ポートは TCP と UDP を開くよう指示されます。その出力を失った場合は、sudo cat /opt/outline/access.txt でポートを含む管理 URL を表示できます。
Outline を使ってプライベートネットワークにアクセスできますか?
いいえ。Shadowsocks は Layer 3 トンネルを構築せず、TCP 接続と UDP 接続をプロキシします。そのため、サーバーには、背後のネットワークへ接続するインターフェースもルートもありません。WireGuard の peer には AllowedIPs = 10.20.0.0/16 を設定して、その範囲にアクセスできます。Outline には同等の設定がありません。ルーティングする対象がないためです。プライベートネットワークへのアクセスには WireGuard を使用し、パブリックインターネットへの接続には Outline を使用してください。
他のユーザーのアクセスを削除するにはどうすればよいですか?
Outline Manager でアクセスキーを削除するか、管理 API に対して DELETE /access-keys/{id} を実行します。サーバーはそのキーを直ちに受け付けなくなります。これは、各ユーザーが自分専用のキーを持っている場合にのみ、問題なく実施できます。そのため、ユーザーごとに 1 つのキーを作成し、ユーザー名を付けてください。管理アクセスの取り消しは、はるかに難しい問題です。手動でインストールしたサーバーで、管理設定を共有してしまった場合に文書化されている対処方法は、完全な再インストールです。この操作を行うと、すべてのユーザーキーも同時にリセットされます。