第881回では、VPNを利用したトンネル型リバースプロキシPangolinを紹介しました。今回はPangolinの1.
Pangolinとは
PangolinとはVPNを利用したトンネル型のリバースプロキシです。インターネット上からアクセス可能なPangolinサーバーに対してLAN内からVPNを張り、このトンネルを経由することで、LAN内のサーバーをインターネットからアクセス可能にします。LAN内からコネクションを開始するため、
詳しくは前回の記事を参照してください。
プライベートリソースとは
前回の記事で紹介したのは、Pangolin的にはパブリックリソースと呼ばれるリソースです。これは一言で言うと
パブリックリソースのメリットは、URLさえ渡せばブラウザだけで使える点です。またNextcloudのようなアプリをモバイル環境から使う際にも便利でしょう。ただしPangolinサーバー上のURLとしてインターネットから到達可能になるため、アプリ側で認証をかけていたとしても、ログイン画面やアプリケーション自体が外部から見える状態になります。当然不正アクセスも大量にやって来ます。
対してプライベートリソースとは、専用のPangolinクライアント接続時にのみアクセスできる、ゼロトラストVPNです。PCやスマホにインストールしたPangolinクライアントを使ってPangolinサーバーに接続すると、許可されたプライベートリソース宛の通信だけをバックエンドへ流します。LAN側とモバイル端末の双方がPangolinサーバーへVPNを張り、Pangolinサーバーがアクセス権限を見た上で適切にルーティングする構成です。その特性上、Pangolinのユーザー/クライアント認証機能の利用は必須となります。
プライベートリソースは、普段からインターネットに晒す必要はないが、場合によっては外からアクセスできないと困るタイプのサービスに向いています。たとえば筆者は自宅内でVaultwardenを運用しているのですが、外出先からアクセスできないと困ることが稀にあります[1]。とはいえそんなレアケースのために、パスワードマネージャーのログイン画面をインターネットに常時晒すのは、メリットに比べてリスクが大きすぎます。そこでPangolinのプライベートリソースとして運用しています。
プライベートリソースは単一ホスト、CIDR、FQDNを対象にできるため、リバースプロキシ的な使い方だけでなく、一般的なVPNとしても使えます。グローバルIPv4アドレスを持たないご家庭であっても、外部から接続するVPNを運用できるというわけです。
Pangolinクライアントの登録とインストール
ここからは、前回の記事通りにPangolinを構築済みである前提で解説します。またPangolinは本記事執筆時点の最新バージョンである1.
Pangolinの管理画面にログインし、
「Name」
「Install Machine Client」
最後に
サーバー側にクライアントの登録ができたら、実際にクライアントをインストールしましょう。インストール対象のマシン上で、先ほど控えた以下のコマンドを実行してください[3]。なおUbuntuデスクトップの場合、先にcurlコマンドをインストール必要があるかもしれません。
$ sudo apt install -U -y curl $ curl -fsSL https://static.pangolin.net/get-cli.sh | sudo bash
CIDRタイプのプライベートリソースの作成
Pangolinにプライベートリソースを作成しましょう。まずは一般的なVPNのように、LAN全体にアクセスできるようCIDRをターゲットとする例を紹介します。Pangolinの管理画面にログインしたら、
Nameにはプライベートリソースを識別するための名前を入力します。ここでは家庭内LANへ接続するため、
Siteは、リソースへの接続に使うPangolinのSiteを指定します。ここでは前回の記事で作成した、パブリックリソースへのアクセスにも利用しているNewtのコネクション
Modeはアクセスするリソースのタイプです。今回はCIDRを選択し、対象のIPアドレスをCIDRで記述します。LAN全体にアクセスさせたいため、筆者の家庭内のネットワークアドレスである
Port Restrictionsは、アクセスを許可するTCP/
Access Policyタブでは、このリソースへアクセスできるPangolin上のロール、ユーザー、マシンクライアントを設定します。これにより同じサイト内に存在するサーバーであっても、特定のユーザーやクライアントだけにアクセスを制限できるのです。今回は
最後に
プライベートリソースへのアクセス
クライアントの登録時に控えた、以下のコマンドを実行してください。これでクライアントが起動します。
$ sudo pangolin up --id クライアントID --secret シークレット --endpoint Pangolinのエンドポイント --attach
別のターミナルを起動して、ipコマンドでルートを確認してみましょう。pangolinデバイスが生えてきて、クライアント作成時に割り当てられたIPアドレスが振られていることが確認できます。またプライベートリソースで定義したCIDRである
$ ip r default via 172.16.0.1 dev ens18 proto dhcp src 172.16.6.67 metric 100 100.90.128.0/24 dev pangolin proto kernel scope link src 100.90.128.2 100.96.128.0/24 dev pangolin 172.16.0.0/16 dev ens18 proto kernel scope link src 172.16.6.67 metric 100 192.168.1.0/24 dev pangolin
Pangolinのクライアント画面を見て、クライアントがConnectedになっていることも確認しておきましょう。
これでUbuntuデスクトップから
ホストタイプのプライベートリソースの作成
CIDRタイプのプライベートリソースを使えば、LAN全体に対してアクセスできます。しかしこれはIPアドレスベースでのアクセスとなるため[4]、SSL証明書を利用しているWebサーバーへアクセスしたいような場合に問題が起きます。筆者の自宅でも、単一のDockerホスト上にNginx Proxy Managerを立て、複数のDockerコンテナでホストされるアプリを集約しているため、名前ベースでないと目的のアプリへアクセスできません。そういう時はホストタイプのプライベートリソースを作り、個別のサーバーを登録するとよいでしょう。
リソースの作成方法はCIDRタイプの時と同じです。以下のようにリソースの作成画面で、
Pangolinクライアントはデフォルトで、エイリアスが有効なモードで起動します。これはコネクションを張ると、カスタムDNSサーバーを使用して、内部的にエイリアスを使ったリソースの名前解決を可能にするモードです。LAN内でのみ使用できるドメインでサーバーの名前解決を行っているような場合は、プライベートリソースに同名のエイリアスを登録しておけば、Pangolin越しでも同じ名前でアクセスが可能になります。
Pangolinクライアントのサービス化
ここでのPangolinクライアントは
まず以下のコマンドを実行して、ユニットファイルを作成します。
$ sudo systemctl edit --full --force pangolin-cli.service
テキストエディタが起動するので、以下の内容を記述して保存してください[5]。
[Unit]
Description=Pangolin CLI
After=network.target
[Service]
ExecStart=/usr/local/bin/pangolin up --id クライアントID --secret シークレット --endpoint Pangolinのエンドポイント --attach
Restart=always
User=root
[Install]
WantedBy=multi-user.target
以後、
$ sudo systemctl start pangolin-cli.service $ sudo systemctl stop pangolin-cli.service
プライベートリソースを使えば、インターネットからアクセスしたいリソースを直接外部に晒すことなく、セキュアに運用できます。また通常のVPNと異なり、ユーザーやクライアント単位で、細かくリソースへのアクセスを制御可能です。比較的新しいPangolinの機能ですが、もしPangolinを運用しているのであれば、ぜひ試してみてください。