ルーティングと信頼済みプロキシ
ホストルーティング、ルート経路、サブドメイン経路、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-tokenproxy.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アドレス宛てのリクエストも、接続中のクライアントへ自動ルーティングされません。
ローカルテスト
Section titled “ローカルテスト”DNSなしで試す場合は、ホストヘッダーを明示します。
curl -H 'Host: demo.proxy.example.com' http://127.0.0.1:8080/ホストヘッダーが違うと、Proxerはどのトンネルへ送るべきか判断できません。
Reverse proxy
Section titled “Reverse proxy”インターネットに公開するサーバーでは、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信頼済みプロキシ値には、loopback、private、IP literal、CIDRレンジを使えます。
peerを信頼すると、Proxerはそのpeerから来たX-Forwarded-For、X-Real-IP、X-Forwarded-Host、X-Forwarded-Protoを使うことがあります。reverse proxyは、外部クライアントから届いたX-Forwarded-*とX-Real-IPヘッダーをProxerへ渡す前に、必ず上書きまたは削除してください。自分で管理していないproxyアドレスは信頼しないでください。
信頼済みプロキシを設定しない場合、Proxerはルーティング判断にforwarded host、protocol、client IPヘッダーを使いません。
Domainを設定しない場合
Section titled “Domainを設定しない場合”公開運用では--domainを設定してください。設定しない場合、Proxerはリクエストホストの最初のlabelからサブドメイン経路を取り出します。ローカル実験には使えますが、実際のDNSやreverse proxyが入ると混乱しやすくなります。
内部エンドポイントはすべて/__proxer__/配下です。
/__proxer__/control/__proxer__/health/live/__proxer__/health/readyこれらのパスをアプリへ送らないでください。公開Proxerサーバーがアプリのルーティングより先に処理します。