はじめに
自宅サーバ (Proxmox VE) 上に構築した n8n に対し、Nginx Proxy Manager (NPM) を用いて「管理画面」と「Webhookエンドポイント」を別々のドメイン・ネットワーク経路で制御する構成を作成しました。
「管理画面はVPN経由でのみアクセスさせたいが、Webhookは外部サービスから叩けるように公開したい」という要件に対する解法の一つとして、設定手順を共有します。
前提環境と構成
本記事は以下の環境・前提に基づいています。
- ハイパーバイザ: Proxmox VE
-
ドメイン管理:
- AWS (Route53): 外部公開用(Webhook用)
- DuckDNS: 内部管理用(Tailscale IPに紐付け)
-
ネットワーク:
- Tailscale: 管理者アクセスの経路として使用
- ルータ: YAMAHA RTX830 (静的IPマスカレード設定)
構成の概要:
-
webhook.<AWSドメイン>→ インターネット公開 (Webhook受信専用) -
n8n.<DuckDNSドメイン>→ Tailscale経由 (管理画面アクセス用)
詳細な構成図は以下を参照してください。
https://x.com/yut_720/status/1994254119788531986?s=20
※ Proxmox自体のインストール解説は省略します。
1. Nginx Proxy Managerのインストール
Proxmox VE Helper-Scriptsを使用して、LXCコンテナとしてインストールします。
https://community-scripts.github.io/ProxmoxVE/scripts?id=nginxproxymanager
サイト内の How to install からコマンドをコピーします。
Proxmoxのホストシェルに貼り付けて実行します。
インストールオプションを聞かれますが、基本的には Default 設定を選択して進めます。
注意
スクリプト実行中は画面を閉じないでください。LXCにIPアドレスが割り振られ、完了メッセージが表示されるまで待機します。
SDN (Software Defined Network) を使用している方は、この段階でネットワーク設定を変更し、LXCを再起動してください。
以下の画面が表示されたらインストール完了です。
ブラウザでポート 81 にアクセスし、初期アカウントでログインします。
Email: admin@example.com
Password: changeme
ログイン後、すぐにメールアドレスとパスワードの変更を求められるので、自身のものに変更してください。
2. ドメインとSSLの設定
Nginx Proxy Manager (以下NPM) に2種類のドメインを設定し、SSL証明書(Let's Encrypt)を取得します。
2-1. AWS管理ドメイン (Webhook用)
用途: 外部からのWebhook受信用
ドメイン例: webhook.example.com (AWS Route53で管理)
NPMの SSL Certificates > Add SSL Certificate を選択し、以下のように設定します。
- Domain Names: 取得したいドメインを入力
- DNS Challenge: Route53を使用するため有効化
-
Credentials: AWSの
aws_access_key_idとaws_secret_access_keyを入力
2-2. DuckDNSドメイン (管理画面用)
用途: 管理画面へのアクセス (Tailscale経由)
ドメイン例: my-home.duckdns.org
同様にSSL証明書を取得します。
ワイルドカード証明書を含めると、今後サブドメインを増やす際に便利です。
-
Domain Names:
<ドメイン>, *.<ドメイン>の形式で入力 - DNS Challenge: DuckDNSを選択
- Credentials: DuckDNSで発行されたTokenを入力
2つの証明書ステータスが「Healthy」になれば準備完了です。
3. n8nのインストール
NPMと同様に、Proxmox VE Helper-Scriptsを使用してインストールします。
https://community-scripts.github.io/ProxmoxVE/scripts?id=n8n
インストールオプションはデフォルトで問題ありません。
環境変数の設定 (重要)
インストール完了後、n8nのLXCコンソールを開き、Webhookの受取URLをAWS管理のドメインに固定する設定を行います。
設定ファイルを開きます。
nano /opt/n8n.env
以下の行を追記(または修正)します。
WEBHOOK_URL=https://webhook.<AWS管理ドメイン>
※ ポート番号を含める必要がある場合は :<ポート番号> を付与してください。
編集後、設定を反映させるためにLXCを再起動します。
ポート 5678 で管理画面にアクセスし、アカウント登録画面が表示されれば完了です。
4. n8nをプロキシに紐づける
ここが本設定の肝となります。内部アクセスと外部アクセスを分離するための設定を行います。
4-1. Access Listの作成 (内部アクセスの制限)
管理画面へのアクセスを「LAN内」と「Tailscale経由」のみに制限するためのリストを作成します。
NPMの Access Lists から新規作成します。
-
LAN: ご自宅のネットワーク帯域 (例:
192.168.1.0/24) -
Tailscale:
100.64.0.0/10(Tailscale利用者共通の範囲)
※ DuckDNSの解決先をTailscale IPにしている時点で外部からはアクセスできませんが、多層防御として設定することを推奨します。
4-2. 管理画面用プロキシの設定
DuckDNSドメインを使用して、管理画面へアクセスする設定です。
- Forward Host: n8nのIPアドレス
- Forward Port: 5678
- Websockets Support: 必ず有効化 (n8nのUI動作に必須)
- Access List: 先ほど作成したリストを選択
- SSL: DuckDNSの証明書を選択し、Force SSLを有効化
4-3. Webhook用プロキシの設定
AWS管理ドメインを使用して、Webhookのみを受け入れる設定です。
ここには少し特殊な設定を行います。
Detailsタブ:
-
Forward Host/Port: ダミーの設定を入力します (例:
127.0.0.1:80)。- ※ ルートパス(
/)へのアクセスは弾きたいため、あえて繋がらない、または空の場所へ向けます。
- ※ ルートパス(
Custom Locationsタブ:
特定のパス(Webhookのエンドポイント)のみをn8nへ転送します。
-
Location:
/webhook - Forward Host: n8nのIPアドレス
- Forward Port: 5678
同様に /webhook-test も作成しておくと、テスト実行時のWebhookも受信できます。
Advancedタブ:
ポート変換対策の設定とルートパスへアクセスした時に404を返答する設定を行います。
# ポート変換を行っている環境で、リダイレクト時のポート番号ズレを防ぐ設定
listen <外部公開用ポート> ssl;
listen [::]:<外部公開用ポート> ssl;
# ルートパスなど、Custom Locations以外へのアクセスは404を返す
location / {
return 404;
}
4-4. ルータとDNSの設定
DNS (AWS Route53):
webhook.<AWS管理ドメイン> のAレコードを、自宅のグローバルIPに向けます。
ルータ (静的IPマスカレード/ポートフォワーディング):
外部からの443番ポート(HTTPS)へのアクセスを、NPMのIPアドレスへ転送します。
※以下はYAMAHA RTX830の例です。
- 内側アドレス: NPMのIPアドレス (例: 192.168.100.2)
-
ポート: HTTPSなので通常は
443ですが、ルータの管理画面等と競合する場合は適宜変換してください。- NPM側はLXCの構成により
443で待ち受けているため、ポート変換時は注意してください。
- NPM側はLXCの構成により
LAN内からのアクセスについて(ヘアピンNAT)
IPv6 IPoE環境などでは、LAN内からグローバルIP(webhook.<AWSドメイン>)へのアクセスができない場合があります(NATループバック問題)。
その際は、ルータのDNS設定やPCのhostsファイルで、ドメイン名をNPMのローカルIPに解決させる等の対策が必要です。
動作確認
最後に以下の確認を行います。
-
管理画面: Tailscale接続状態で
https://n8n.<DuckDNSドメイン>にアクセスできること。 -
Webhook: n8nでWebhookノードを作成し、外部ネットワーク(スマホの4G等)から
https://webhook.<AWSドメイン>/webhook/...を叩いて反応があること。
動作確認用のワークフローを置いておきます。
{
"name": "My workflow",
"nodes": [
{
"parameters": {
"path": "3914ccae-2ff4-40c4-a81e-4d2416893022",
"responseMode": "responseNode",
"options": {}
},
"type": "n8n-nodes-base.webhook",
"typeVersion": 2.1,
"position": [0, 0],
"id": "2c38d40f-71ae-4460-ad97-3fb742b757fc",
"name": "Webhook",
"webhookId": "3914ccae-2ff4-40c4-a81e-4d2416893022"
},
{
"parameters": {
"respondWith": "json",
"responseBody": "{\"message\": \"このメッセージが見えているということは正常にWebhookを受信できたということです\"}",
"options": {}
},
"type": "n8n-nodes-base.respondToWebhook",
"typeVersion": 1.4,
"position": [208, 0],
"id": "b2e96816-af60-4871-a503-2bc055132733",
"name": "Respond to Webhook"
}
],
"pinData": {},
"connections": {
"Webhook": {
"main": [
[
{
"node": "Respond to Webhook",
"type": "main",
"index": 0
}
]
]
}
},
"active": true,
"settings": {
"executionOrder": "v1"
},
"versionId": "ab33a39e-0c4b-4519-856f-5f90f8042e29",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "dd58200ba572d485c22e37b95925694673f2dc4c644dc2d18a8f3d1895015dbe"
},
"id": "za2sr58qutGsFx2Q",
"tags": []
}
おわりに
n8nをセルフホストすることで、高機能な自動化環境を低コストで構築できます。
Nginx Proxy Managerと組み合わせることで、セキュリティと利便性を両立した運用が可能になりますので、ぜひ試してみてください。











