ポート転送
ローカルで待ち受けているポートを、別のデバイスやサービスへ転送します。
機能
- TCP と UDP
- IPv4 と IPv6。v4 と v6 の間で相互に転送できます
- ポート範囲と複数ポート
- 複数ターゲットとフェイルオーバー
- 接続数制限
- トラフィック統計と実行ログ
- 転送先への PROXY プロトコル(v1 / v2)の送信。実際のクライアントアドレスを下流に渡せます
- SNI 振り分け:TLS を復号せずに、TLS ハンドシェイクのドメイン名に応じて、複数のサービスで 443 などの 1 つのポートを共用できます
PROXY プロトコル
ポート転送は TCP を中継するだけなので、下流からはデフォルトで Gately 自身のアドレスしか見えません。ルールで「PROXY プロトコル」を v1 または v2 に設定すると、Gately は転送先に接続した直後に PROXY ヘッダーを送信します。下流は実際のクライアントアドレスを取得でき、ログ、レート制限、アクセス制御に利用できます。
転送先では対応する受信オプションを有効にする必要があります。有効でない場合、接続は拒否されます。例:
- haproxy:
bind 192.168.1.8:4434 accept-proxy - nginx:
listen 4435 ssl proxy_protocol; - Gately Web サービス:リスナーで「PROXY プロトコルを受信」を有効にし、送信元を信頼する PROXY 送信元に追加します
このオプションは TCP にのみ作用し、UDP の転送には影響しません。
SNI 振り分け:443 番ポートの共用
複数のサービスで同じ公開ポートを使いたい場合(たとえば VPN、Web サーバー、トンネルがすべて 443 番を使う場合)は、ルールの転送モードを「ポート転送」から「SNI 振り分け」に切り替えます。Gately は最初の TLS メッセージである ClientHello からドメイン名(SNI)を読み取り、そのドメインに対応するバックエンドへ接続全体をそのまま中継します。TLS は復号しないため、証明書はバックエンド側に置いたままで使えます。haproxy の req_ssl_sni ルールと同じ役割を果たします。
このモードのルールには次の設定があります。
- ルート:各ルートに、名前、1 つ以上のドメイン、ターゲットアドレス(複数の場合は順に試行し、フェイルオーバーします)、任意のターゲットポート(空欄は待ち受けポートと同じ)、PROXY プロトコルの設定(送信しない、v1、v2)を指定します。PROXY の設定をルートごとに持つのは、必須のバックエンドと拒否するバックエンドがあるためです。
- デフォルトターゲット:ルール自身のターゲットアドレス、ターゲットポート、PROXY プロトコルの設定です。
ドメインには、完全一致(vpn.example.com)、ワイルドカード(*.example.com、任意の階層に一致)、*(ドメインを含むすべての接続)を指定でき、大文字と小文字は区別されません。一致の順序は、完全一致、最も長いワイルドカード、*、デフォルトターゲットの順です。1 つのドメインを登録できるルートは 1 つだけです。
次の場合、接続はデフォルトターゲットに送られます。一致するルートがない、クライアントが SNI を送らない(たとえば IP アドレスで接続した場合)、データが TLS ではない、ClientHello を解析できない、クライアントが 5 秒以内に何も送らない(SSH のようにサーバーが先に話すプロトコル)。デフォルトターゲットがない場合、これらの接続は切断され、「拒否」として集計されます。ClientHello を最後まで送る前に切断したクライアントは破棄されます。
補足:
- SNI 振り分けは TCP のみです。HTTP/3(QUIC)などの UDP トラフィックは振り分けられないため、別のルールを使ってください。
- ClientHello は複数の TLS レコードに分割されていてもよく、最大 64 KB まで受け付けます。
- ルールのカードには、各ルートとデフォルトターゲットが受け付けた接続数が表示されます。
例:haproxy の置き換え
次のような haproxy の設定は、
frontend https
bind 192.0.2.10:443
mode tcp
tcp-request inspect-delay 5s
tcp-request content accept if { req_ssl_hello_type 1 }
use_backend ocserv if { req_ssl_sni -i tz.example.com }
default_backend web
backend ocserv
server ocserv 127.0.0.1:443 send-proxy-v2
backend web
server web 127.0.0.1:8443 send-proxy-v2Gately では 1 つのルールになります。
| 設定 | 値 |
|---|---|
| モード / プロトコル | SNI 振り分け / TCP |
| 待ち受けアドレス / ポート | 192.0.2.10 / 443 |
ルート ocserv | ドメイン tz.example.com、ターゲット 127.0.0.1、ポート 443、PROXY v2 |
| デフォルトターゲット | 127.0.0.1、ターゲットポート 8443、PROXY v2 |
バックエンドが 127.0.0.1:443 で待ち受けている場合と衝突しないよう、待ち受けアドレスにはサーバーのパブリックアドレスを指定してください。Web サイトを Gately 自身で配信するには、127.0.0.1:8443 で Web サービス のリスナーを追加し、「PROXY プロトコルを受信」を有効にして、信頼する PROXY 送信元に 127.0.0.0/8 を追加します。ポートを待ち受けられるプログラムは 1 つだけなので、ルールを有効にする前に haproxy を停止してください。
典型的な利用シーン
- NAS のサービスポートを共通の入口にまとめて公開する
- IPv6 と IPv4 の間で相互接続できるよう転送する
- 1 つのサービスに主系・待機系の 2 つのバックエンドを設定する
- VPN、Web サーバー、その他の TLS サービスで 443 番ポートを共用する
デプロイのヒント
ポート転送はホストのポートを直接待ち受けるため、Docker でデプロイする場合は --network host を推奨します。
Lucky からの移行
ルールは lucky_portforward.lkcf からインポートできます。TLS / ストリーム暗号化や速度制限などのオプションは未対応で、インポート時に通知されます。