포트 포워딩
이 호스트에서 수신하는 포트를 다른 장치나 서비스로 전달합니다.
기능
- TCP와 UDP
- IPv4와 IPv6, v4 / v6 간 상호 포워딩
- 포트 범위와 다중 포트
- 다중 대상과 장애 조치
- 연결 수 제한
- 트래픽 통계와 실행 로그
- 대상에 PROXY 프로토콜(v1 / v2)을 보내 실제 클라이언트 주소를 하위 단계에 전달
- SNI 라우팅: TLS를 복호화하지 않고 TLS 핸드셰이크의 도메인에 따라 여러 서비스가 443 같은 포트 하나를 함께 사용
PROXY 프로토콜
포트 포워딩은 TCP 중계만 하므로 하위 서비스에는 기본적으로 Gately 자신의 주소만 보입니다. 규칙에서 「PROXY 프로토콜」을 v1 또는 v2로 설정하면 Gately가 대상에 연결한 뒤 PROXY 헤더를 먼저 보내므로, 하위 서비스가 실제 클라이언트 주소를 얻어 로그, 속도 제한, 접근 제어에 활용할 수 있습니다.
대상에서 해당 수신 옵션을 켜야 하며, 그렇지 않으면 연결이 거부됩니다. 예:
- haproxy:
bind 192.168.1.8:4434 accept-proxy - nginx:
listen 4435 ssl proxy_protocol; - Gately 웹 서비스: 리스너에서 「PROXY 프로토콜 수신」을 켜고 출처를 신뢰할 PROXY 출처에 추가합니다.
이 옵션은 TCP에만 적용되며 UDP 포워딩에는 영향을 주지 않습니다.
SNI 라우팅: 443 포트 공유
여러 서비스가 같은 공개 포트를 써야 할 때(예: VPN, 웹 서버, 터널이 모두 443을 사용) 규칙의 전달 모드를 「포트 포워딩」에서 「SNI 라우팅」으로 바꿉니다. Gately는 첫 번째 TLS 메시지인 ClientHello에서 도메인(SNI)을 읽고, 해당 도메인에 맞는 백엔드로 연결 전체를 그대로 전달합니다. TLS는 복호화하지 않으므로 인증서는 백엔드에 그대로 둘 수 있습니다. haproxy의 req_ssl_sni 규칙과 같은 역할을 합니다.
이 모드의 규칙에는 다음 설정이 있습니다.
- 라우트: 각 라우트에는 이름, 하나 이상의 도메인, 대상 주소(여러 개면 차례로 시도하며 장애 조치), 선택 사항인 대상 포트(비우면 수신 포트와 같음), PROXY 프로토콜 설정(보내지 않음, v1, v2)을 지정합니다. 백엔드에 따라 PROXY가 필수인 곳도 있고 거부하는 곳도 있으므로 PROXY 설정은 라우트별로 둡니다.
- 기본 대상: 규칙 자체의 대상 주소, 대상 포트, PROXY 프로토콜 설정입니다.
도메인은 정확한 도메인(vpn.example.com), 와일드카드(*.example.com, 모든 단계와 일치), *(도메인을 포함한 모든 연결)를 쓸 수 있으며 대소문자를 구분하지 않습니다. 매칭 순서는 정확한 도메인, 가장 긴 와일드카드, *, 기본 대상 순입니다. 도메인 하나는 라우트 하나에만 속할 수 있습니다.
다음 경우에 연결은 기본 대상으로 갑니다. 일치하는 라우트가 없거나, 클라이언트가 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에서는 규칙 하나가 됩니다.
| 설정 | 값 |
|---|---|
| 모드 / 프로토콜 | 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에서 수신하는 백엔드와 충돌하지 않도록 수신 주소를 서버의 공인 주소로 지정하세요. 웹사이트를 Gately가 직접 제공하려면 127.0.0.1:8443에 웹 서비스 리스너를 추가하고 「PROXY 프로토콜 수신」을 켠 뒤 신뢰할 PROXY 출처에 127.0.0.0/8을 추가합니다. 포트를 수신할 수 있는 프로그램은 하나뿐이므로 규칙을 켜기 전에 haproxy를 중지하세요.
대표 사용 사례
- NAS의 서비스 포트를 하나의 진입점으로 노출
- IPv6와 IPv4 사이의 상호 연결 포워딩
- 서비스 하나에 주/예비 백엔드 두 개 구성
- VPN, 웹 서버, 기타 TLS 서비스가 443 포트를 함께 사용
배포 팁
포트 포워딩은 호스트 포트를 직접 수신하므로 Docker 배포에서는 --network host를 권장합니다.
Lucky에서 마이그레이션
규칙은 lucky_portforward.lkcf에서 가져올 수 있습니다. TLS / 스트림 암호화와 속도 제한 등의 옵션은 아직 지원하지 않으며 가져올 때 안내가 표시됩니다.