本連載の読者であれば、家庭内にサーバーを構築して、NextcloudのようなWebアプリケーションを動かしている人も多いでしょう。そして今時のWebアプリケーションであれば、インターネットからアクセス可能にして、外出先からも利用したいと考えるのは自然なことです。従来であれば、プロバイダの固定IPアドレスサービスやダイナミックDNSを利用して、インターネットから自宅のルーターへ到達できるようにした上で、ルーターのポートを開放し、LAN内のサーバーを公開するという手順が一般的でした。
しかし昨今、こうした従来の方法が適用できない環境も増えてきています。例えば筆者はNTTのフレッツ光クロスを自宅で利用しているのですが、プロバイダの都合上、グローバルなIPv4アドレスがルーターに割り当てられていません。使用できるのはIPv6アドレスのみで、IPv4の通信はIPv6でカプセル化してプロバイダのAFTRまでトンネリングする、いわゆるDS-Lite接続となっています。こうしたキャリアグレードNATな環境では、従来のようにIPv4アドレスで家庭のルーターまで到達できません。
ルーターのポートを開放する方法には、別の欠点もあります。それは特定のポート宛ての通信をLAN内のサーバーに転送するという仕組み上、ひとつのポートがひとつのサービスでしか使えないことです。たとえばLAN内にHTTP
こうした問題を解決できるのが、今回紹介するトンネル型リバースプロキシです。
トンネル型リバースプロキシとは
一般的なリバースプロキシはサーバーの前段に配置され、クライアントの代理としてバックエンドにアクセスするサービスです。複数のバックエンドサーバーにアクセスを振り分けたり、ロードバランシングやSSL終端処理などの機能も提供しています。トンネル型リバースプロキシは、これにVPNトンネルの機能を組み合わせたものです。LAN内にあるクライアントがインターネット上のリバースプロキシサーバーに対してVPNを張り、そのVPNトンネルを経由して、インターネットからの通信をLAN内のサーバーへプロキシします。
この方式の最大のメリットは、LAN内からインターネット上のサーバーに向けて接続を開始するため、ルーターのポート開放やファイアウォールの設定変更が不要な点です。VPNを張れればよいため、グローバルなIPv4アドレスが自宅のルーターに割り当てられているかも関係ありません。プロキシサーバー側でホスト名ベースのルーティングを行えるため、複数のサービスを同時に、標準的なHTTP/
Pangolinは、このトンネル型リバースプロキシを実現するオープンソースソフトウェアです。簡単に言ってしまえば、PangolinはセルフホストできるCloudflare Tunnelのようなものです。今回はVPS上に、インターネットからの窓口となるPangolinサーバーを構築します。そしてこのPangolinにLAN内のクライアント

Pangolinのインストール
Pangolinには大きく3つの利用形態があります。
ひとつは完全マネージドのクラウドサービスを利用する方式です。自分でサーバーを用意する必要がないため手軽ではありますが有料のサービスであり、無料プランでは様々な制限があります。もうひとつが
当然ですが、Pangolinを動かすサーバーはインターネット上にあり、ネットワーク的に到達可能でなくてはなりません。Pangolinはそれほど重いソフトウェアではないため、安価なVPSサーバーを一台契約するのがよいでしょう。今回筆者は、Amazon Lightsailを利用しました。

インストールに先立ってUbuntu 24.

PangolinのインストーラーはGoで書かれたバイナリです。最新のインストーラーをダウンロードするためのスクリプトがありますので、まずはこれを実行しましょう。なおインストーラーは、カレントディレクトリにすべてのファイルを展開するため、あらかじめディレクトリを作っておくとよいでしょう。これを忘れてホームディレクトリでうっかり実行すると、少し面倒なことになります。
$ mkdir ~/pangolin && cd ~/pangolin $ curl -fsSL https://digpangolin.com/get-installer.sh | bash
上記のコマンドを実行すると、カレントディレクトリにinstallerというバイナリがダウンロードされています。これをsudoつきで実行しましょう。あとは対話的に質問に答えていくだけです。
$ sudo ./installer Welcome to the Pangolin installer! This installer will help you set up Pangolin on your server. Please make sure you have the following prerequisites: - Open TCP ports 80 and 443 and UDP ports 51820 and 21820 on your VPS and firewall. Lets get started! === Basic Configuration === Do you want to install Pangolin as a cloud-managed (beta) node? (yes/no): no ← 今回はPangolinを完全セルフホストするためnoを入力 Enter your base domain (no subdomain e.g. example.com): example.com ← 自分のドメインを入力 Enter the domain for the Pangolin dashboard (default: pangolin.example.com): pangolin.example.com ← あらかじめDNSに登録した、PangolinサーバーのFQDNを入力 Enter email for Let's Encrypt certificates: mizuno@example.com ← 自分のメールアドレスを入力 Do you want to use Gerbil to allow tunneled connections (yes/no) (default: yes): yes ← トンネルを利用するのでyesを入力 === Email Configuration === Enable email functionality (SMTP) (yes/no) (default: no): no ← メールサーバーの設定は後からでもできるため、ここではnoを入力 === Advanced Configuration === Is your server IPv6 capable? (yes/no) (default: yes): yes ← IPv6も使いたいため、yesを入力 === Generating Configuration Files === Configuration files created successfully! === Starting installation === Would you like to install and start the containers? (yes/no) (default: yes): yes ← Pangolinをコンテナで動かしたいためyesを入力 Would you like to run Pangolin as Docker or Podman containers? (default: docker): docker ← コンテナ実行にはDockerを使いたいため、dockerと入力 Docker is not installed. Would you like to install it? (yes/no) (default: yes): yes ← ここでDocker本体もインストールしたいため、yesを入力 (ここでDockerのインストールとコンテナの起動が行われる。省略) === CrowdSec Install === Would you like to install CrowdSec? (yes/no) (default: no): no ← CrowdSecは利用しないためnoを入力 === Setup Token === Waiting for Pangolin to generate setup token... Setup token: XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX ← 初回セットアップ用のトークンが表示されるので控えておく This token is required to register the first admin account in the web UI at: https://pangolin.example.com/auth/initial-setup ← セットアップ用のURLにブラウザからアクセスする Save this token securely. It will be invalid after the first admin is created. Installation complete! To complete the initial setup, please visit: https://pangolin.example.com/auth/initial-setup
ここではDockerを使用する設定としたため、インストーラーがdownload.
Pangolinの初期設定とSiteの作成
インストールの最後に表示された、初回セットアップ用のURLにブラウザでアクセスしましょう。すると以下のようなInitial Server Setupの画面が表示されるので、先ほど控えたトークン、メールアドレス、パスワードを入力してください。弱いパスワードは拒否されるので、強いパスワードを設定するようにしましょう。

すると自動的にログイン画面に遷移するので、先ほど設定したユーザーのメールアドレスとパスワードでログインします。

ログインすると、新しいOrganizationの作成画面に遷移します。PangolinにおけるOrganizationとは、複数のSite

続いてSiteの作成画面に遷移します。PangolinにおけるSiteとは、クライアントがPangolinに対してVPNトンネルを張るためのエンドポイントです。もっと単純に、SiteとはPangolinが張るVPNコネクションの単位だと考えてよいでしょう。すべてのResource
まずSiteの名前とIPアドレスを決めます。名前は

続いてトンネルタイプを指定します。Newtの利用が推奨されていますので、これを選択しましょう。NewtはPangolinのために用意された、WireGuardクライアント兼TCP/

NewtからPangolinへの接続に必要な、エンドポイント、ID、シークレットキーが表示されます。これらの情報は、この場で一度しか確認できないため、忘れずに控えておいてください。

最後に、Newtのインストール方法を選択します。NewtもPangolinと同様に、Dockerで動かすのが一番手軽です。そこで

最後に
Newtクライアントの起動
Pangolin側のSiteが用意できたので、次はLAN内にクライアント
$ sudo apt install -U -y docker.io docker-compose-v2
compose.
$ mkdir ~/newt && cd ~/newt $ cat > compose.yaml <<EOF (先ほど控えたcompose.yamlの内容をペースト) EOF
compose.
$ sudo docker compose up -d
これでLAN内からPangolinサーバーへ、VPNトンネルが確立されました。PangolinのSitesを開き、Siteがオンラインになっていることを確認してください。

Resourceの作成
最後にResourceを作成します。PangolinにおけるResourceとは、プロキシの対象となるサーバーやサービスの定義です。Pangolinのダッシュボードで、左サイドバーから

今回はLAN内のWebサーバーにHTTPアクセスをプロキシしたいため、HTTPS Resourceを選択しました。また名前はわかりやすく

HTTPSをプロキシするため、サブドメイン名を設定します。ここもわかりやすく、サブドメインは
最後にTargets Configurationを設定します。これは実際のプロキシ先となる、LAN内のサーバーです。Siteは使用するVPNコネクションですので、先ほど作成した

最後に
ユーザー認証の追加
リソースが作成されたら、Manage Resourcesの画面から

また

公開されたサーバーにアクセスする
Resourceに設定したFQDNへブラウザでアクセスしてみましょう。Authentication Requiredの画面が表示されたら、Resourceにアクセスを許可されているPangolinのユーザーでログインしましょう。

正しく認証を突破できると、Apache2のWebサーバーの画面が表示されました。ファイアウォールやルーターに設定を入れることなく、LAN内のサーバーをインターネットに公開できたことが確認できました。またPangolinによって、柔軟なアクセスの制限も可能なことがわかったのではないでしょうか。

Pangolinは、内部的にLet's Encryptを使って自動的にSSL証明書を取得します。そのため追加したResourceにも、正規のSSL証明書を使ってセキュアにアクセスが可能です。
Pangolinを使えば、IPv4グローバルアドレスが利用できない環境でも、家庭内にあるサーバーを公開できます。またそれだけに留まらず、Web UIベースでユーザーやリソースを管理でき、シングルサインオンも実現できます。セキュリティを保ちながら、複数のサービスを標準ポートで公開できる点も魅力です。
個人的にWebアプリをホストしたり、あるいは開発目的で家庭内サーバーをインターネットに公開する際は、Pangolinが有力な選択肢となるでしょう。トンネルが不要な環境であっても、高機能なリバースプロキシとして導入する価値があると筆者は考えています。筆者は現在、コンテナの前段にNginx + Certbotでリバースプロキシを構築しています。ですが自分でSSL証明書を取得したり、Nginxの設定ファイルを手で書き換えるのは面倒なため、これをPangolinに置き換えようかなと検討中です。
