NGINX Plus – HTTP CONNECT Forward Proxy 구성

이번 포스트에서는 NGINX Plus R36+에서 지원하는 HTTP CONNECT Forward Proxy 기능을 활용하여 사내 클라이언트 또는 특정 클라이언트가 외부 인터넷(HTTPS 포함)을 안전하게 사용할 수 있도록 구성하는 방법을 소개합니다.

기존에는 NGINX OSS에서 HTTP CONNECT 프록시를 구현하려면 복잡한 lua 스크립트나 추가 모듈이 필요했지만, NGINX Plus R36부터는 tunnel_pass, tunnel_allow_upstream 등 전용 디렉티브가 공식 지원되어 매우 깔끔하고 안정적으로 Forward Proxy를 운영할 수 있게 되었습니다.

특히 IP 기반 허용, 호스트 기반 허용, 포트 제한까지 모두 NGINX 레벨에서 제어할 수 있어 보안 정책을 중앙에서 강력하게 적용할 수 있습니다.

목차

1. HTTP CONNECT Forward Proxy란?
1-1. Reverse Proxy vs Forward Proxy
2. 실제 운영용 구성 예시
2-1. 주요 디렉티브 설명
2-2. 접근 제어 로직 (IP + Host + Port)
3. 테스트 및 로그 확인
4. 결론 및 운영 팁

1. HTTP CONNECT Forward Proxy란?

Forward Proxy는 클라이언트 → Proxy → 외부 인터넷 형태로 동작합니다. 주로 사내에서 외부 HTTPS 접속을 통제하거나, 로그를 집중적으로 남기고 싶을 때 사용됩니다.

HTTP CONNECT 메서드는 클라이언트가 Proxy에게 “내가 이 호스트:포트로 터널을 만들어줘”라고 요청하는 방식이며, 성공하면 Proxy와 클라이언트 사이에 투명한 TCP 터널이 만들어져 HTTPS 트래픽이 그대로 흘러갑니다.

1-1. Reverse Proxy vs Forward Proxy

구분Reverse ProxyForward Proxy
위치서버 앞클라이언트 앞
주요 용도로드밸런싱, SSL 종료, WAF인터넷 접속 통제, 로그 집중, 캐싱
대표 디렉티브proxy_passtunnel_pass

2. 실제 운영용 구성 예시

아래는 Forward Proxy 구성입니다. (NGINX Plus R36 기준)

resolver 8.8.8.8 valid=30s;
map $request_port $allow_port {
443 1;
default 0;
}
map $host $allow_host {
hostnames;
google.com 1;
*.google.com 1;
openai.com 1;
*.openai.com 1;
default 0;
}
geo $remote_addr $allow_user {
192.168.40.0/24 1;
default 0;
}
log_format proxy_log '$remote_addr [$time_local] '
'$host:$request_port '
'$status $bytes_sent';
server {
listen 3328;
access_log /var/log/nginx/proxy.log proxy_log;
tunnel_allow_upstream $allow_host $allow_user $allow_port;
# 성능/안정성 튜닝
tunnel_socket_keepalive on;
tunnel_connect_timeout 10s;
tunnel_read_timeout 300s;
tunnel_send_timeout 60s;
tunnel_buffer_size 64k;
tunnel_next_upstream error timeout;
tunnel_next_upstream_tries 2;
location / {
# CONNECT 요청 → 터널 생성
if ($request_method = CONNECT) {
tunnel_pass;
}
# 그 외 HTTP 요청 → Absolute URL → 프록시 동작 (필요 시)
proxy_pass $scheme://$http_host$uri$is_args$args;
proxy_http_version 1.1;
proxy_set_header Connection "";
proxy_connect_timeout 60s;
proxy_send_timeout 60s;
proxy_read_timeout 60s;
}
}

2-1. 주요 디렉티브 설명

디렉티브설명
tunnel_passCONNECT 요청을 받아 터널을 생성 (핵심)
tunnel_allow_upstream $var최종적으로 upstream 허용 여부 판단 (0이면 차단)
tunnel_socket_keepalive on백엔드 커넥션 재사용으로 성능 향상
tunnel_next_upstream연결 실패 시 재시도 정책
tunnel_buffer_size 64k터널용 버퍼 크기 조정

2-2. 접근 제어 로직 (IP + Host + Port)

  • IP 제한: geo 모듈 → 사내 192.168.40.0/24만 허용
  • 도메인 제한: map $host → google, openai 계열만 허용
  • 포트 제한: map $request_port → 443만 허용 (HTTPS 전용)

모든 조건이 충족되어야 $allow_user가 1이 되고, tunnel_allow_upstream이 통과합니다.

3. 테스트 및 로그 확인

# 정상 요청 (허용된 IP + 도메인 + 포트)
curl -x http://192.168.40.10:3328 https://www.google.com
# 차단되는 요청 예시
curl -x http://192.168.40.10:3328 https://naver.com # 호스트 차단 → 502
curl -x http://192.168.40.10:3328 https://google.com:8443 # 포트 차단 → 502

로그 예시 (/var/log/nginx/proxy.log):

192.168.40.55 [12/Dec/2025:22:15:43 +0900] www.google.com:443 200 12345
192.168.40.55 [12/Dec/2025:22:16:10 +0900] naver.com:443 502 0

4. 결론 및 운영 팁

  • NGINX Plus R36+부터는 별도 스크립트 없이 공식 디렉티브만으로 강력한 Forward Proxy 구현 가능
  • IP + 도메인 + 포트 3중 방어로 최소 권한 원칙 적용 가능
  • mTLS 인증도 동일 config에 추가 가능 (필요 시 알려드릴게요)
  • 로그는 반드시 별도 포맷으로 남겨서 SIEM 연동 추천

이제 더 이상 복잡한 lua나 외부 프록시 없이도 NGINX Plus 하나로 사내 인터넷 트래픽을 완벽하게 통제할 수 있습니다.

NGINX Plus의 HTTP CONNECT Forward Proxy 기능이 궁금하시거나, 실제 도입 컨설팅이 필요하시면 언제든 NGINX STORE로 문의 주세요!

NGINX STORE를 통한 솔루션 도입 및 기술지원 무료 상담 신청

* indicates required