コンテンツにスキップ
ProxerProxerv0.13.0

ルーティングと信頼済みプロキシ

ホストルーティング、ルート経路、サブドメイン経路、forwardedヘッダーを扱います。

Proxerはホスト名でルーティングします。普通の話に見えますが、DNS、TLS、reverse proxyの背後にトンネルを置くときに一番ずれやすい部分です。

ルート経路とサブドメイン経路

Section titled “ルート経路とサブドメイン経路”

公開ルートドメインを指定してサーバーを起動します。

proxer server --listen 0.0.0.0:8080 --domain proxy.example.com --token dev-token

--subdomainなしのクライアントには、サーバーがランダムなサブドメインを割り当てます。

proxer http 3000 --server wss://proxy.example.com --token dev-token

クライアントはhttps://px-k7m3q9t2ab.proxy.example.comのようなpublic URLを表示します。同じ実行中の再接続では、この割り当てを使い続けます。

ルート経路が必要な場合だけ--subdomain @を使います。

proxer http 3000 --server wss://proxy.example.com --subdomain @ --token dev-token

proxy.example.comへのリクエストは、このルート経路のクライアントへ行きます。ルート経路は、サーバーを--domain付きで起動している場合に最も分かりやすく動きます。--domainがない場合、Proxerはリクエストホストの最初のlabelをサブドメイン経路として扱います。

--subdomain demoを指定したクライアントはdemo.proxy.example.comを登録します。

proxer http 3000 --server wss://proxy.example.com --subdomain demo --token dev-token

不明なホストは404を返します。localhostやIPアドレス宛てのリクエストも、接続中のクライアントへ自動ルーティングされません。

DNSなしで試す場合は、ホストヘッダーを明示します。

curl -H 'Host: demo.proxy.example.com' http://127.0.0.1:8080/

ホストヘッダーが違うと、Proxerはどのトンネルへ送るべきか判断できません。

インターネットに公開するサーバーでは、Caddy、Traefik、NGINX、ロードバランサーなどのreverse proxyでTLSを終端する構成がよく使われます。そのproxyからProxerへ、loopbackまたはプライベートネットワーク経由でHTTP/WebSocketトラフィックを渡します。

元のホスト名は保持してください。Traefikでは通常、passHostHeaderを有効にしたデフォルトのままで大丈夫です。

次に、どのTCP peerからのforwardedヘッダーを信頼するかをProxerへ伝えます。

proxer server \
--listen 0.0.0.0:8080 \
--domain proxy.example.com \
--trusted-proxy loopback \
--trusted-proxy private \
--token "$PROXER_TOKEN"

環境変数では次の形です。

PROXER_TRUSTED_PROXIES=loopback,private,10.42.0.0/16 proxer server --domain proxy.example.com

信頼済みプロキシ値には、loopbackprivate、IP literal、CIDRレンジを使えます。

peerを信頼すると、Proxerはそのpeerから来たX-Forwarded-ForX-Real-IPX-Forwarded-HostX-Forwarded-Protoを使うことがあります。reverse proxyは、外部クライアントから届いたX-Forwarded-*X-Real-IPヘッダーをProxerへ渡す前に、必ず上書きまたは削除してください。自分で管理していないproxyアドレスは信頼しないでください。

信頼済みプロキシを設定しない場合、Proxerはルーティング判断にforwarded host、protocol、client IPヘッダーを使いません。

公開運用では--domainを設定してください。設定しない場合、Proxerはリクエストホストの最初のlabelからサブドメイン経路を取り出します。ローカル実験には使えますが、実際のDNSやreverse proxyが入ると混乱しやすくなります。

内部エンドポイントはすべて/__proxer__/配下です。

/__proxer__/control
/__proxer__/health/live
/__proxer__/health/ready

これらのパスをアプリへ送らないでください。公開Proxerサーバーがアプリのルーティングより先に処理します。