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 Proxy | Forward Proxy |
| 위치 | 서버 앞 | 클라이언트 앞 |
| 주요 용도 | 로드밸런싱, SSL 종료, WAF | 인터넷 접속 통제, 로그 집중, 캐싱 |
| 대표 디렉티브 | proxy_pass | tunnel_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_pass | CONNECT 요청을 받아 터널을 생성 (핵심) |
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 # 호스트 차단 → 502curl -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 12345192.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로 문의 주세요!