Skip to content
このページは AI で翻訳されており、不正確な表現が含まれる場合があります。GitHub で改善にご協力ください。

ポート転送 ​

ローカルで待ち受けているポートを、別のデバイスやサービスへ転送します。

機能 ​

  • 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 の設定は、

text
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-v2

Gately では 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 / ストリーム暗号化や速度制限などのオプションは未対応で、インポート時に通知されます。

Apache-2.0 ライセンスで公開されています。