2026-02-03 12:55 PM
폐쇄망(내부망) Kubernetes 환경에서는 보통 클러스터 전체 egress를 막아야 합니다. 하지만 현실에서는 다음 같은 요구가 종종 생깁니다.
이 글에서는 gost (GO Simple Tunnel)을 활용해, 내부 폐쇄 K8s의 특정 Pod만 외부로 통신시키는 구조와 구축 방법을 기술적으로 정리합니다. 마지막에는 Istio로 비슷한 요구를 해결하는 대안도 비교 관점으로 덧붙입니다.
핵심 아이디어는 간단합니다.

Mermaid 렌더러 호환성 이슈가 있어 다이어그램은 정적 이미지로 고정했습니다.
구성 요소는 두 덩어리입니다.
gost는 “프록시 + 터널 + 포트포워딩 + 체인(Proxy chain)”을 한 바이너리로 해결합니다. 이 글에서 특히 유용한 포인트는 다음입니다.
참고: gost 문서는 기능이 많아 처음 보면 복잡하지만, “우리 요구”는 크게 두 케이스로 정리할 수 있습니다.
이 글은 다음 전제를 권장합니다.
이렇게 하면 “특정 Pod만 외부 통신”을 만들 때도, 통제 지점이 분산되지 않습니다.
가장 구현/운영 난이도가 낮은 방식은 Sidecar gost를 두고,
애플리케이션은 HTTP_PROXY/HTTPS_PROXY 를 localhost 로 향하게 하는 것입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-with-egress
spec:
replicas: 1
selector:
matchLabels:
app: app-with-egress
template:
metadata:
labels:
app: app-with-egress
spec:
containers:
- name: app
image: your/app:tag
env:
- name: HTTP_PROXY
value: http://127.0.0.1:18080
- name: HTTPS_PROXY
value: http://127.0.0.1:18080
- name: NO_PROXY
value: ".svc,.cluster.local,10.0.0.0/8,172.16.0.0/12,192.168.0.0/16"
- name: gost
image: ginuerzh/gost:latest
args:
# 로컬에서 HTTP proxy를 열고(-L), DMZ gost로 전달(-F)
- "-L=http://:18080"
- "-F=h2://dmz-gost.example.dmz:443?ping=30"
ports:
- containerPort: 18080여기서 포인트는 -F 입니다.
-L=http://:18080 : Pod 내부(네임스페이스 네트워크)에서 HTTP 프록시를 엽니다.-F=h2://dmz-gost... : 프록시 체인(포워드)을 DMZ gost로 보냅니다.DMZ에서는 “내부에서 온 연결을 받아 외부로 나가는” 역할을 합니다. 가장 단순한 형태는 DMZ에서 gost를 HTTP 프록시로 열고, 내부가 거기로 붙는 구조입니다.
# DMZ 서버에서: h2(HTTP/2 터널) 리스닝
gost -L=h2://:443그리고 DMZ에서 실제 외부 통신을 어디로 보낼지는 환경마다 다릅니다.
후자의 경우는 gost의 체인(-F)을 DMZ 쪽에 한 단계 더 넣는 식으로 구성할 수 있습니다.
# DMZ에서 외부 표준 프록시로 체인
gost -L=h2://:443 -F=http://corp-outbound-proxy.dmz:3128팁: DMZ Outbound Proxy에 도메인 allowlist / URL filtering / 사용자 인증 / 로깅을 집중시키면 “K8s 내부에서 누가 어디로 나갔는지” 추적이 훨씬 쉬워집니다.
HTTP/HTTPS 프록시는 애플리케이션이 환경변수를 따라줘야 합니다. 하지만 현실에서는 다음 상황이 자주 발생합니다.
이때는 Pod 네트워크에서 특정 목적지 트래픽을 강제로 로컬 프록시로 리다이렉트(iptables redirect) 하는 방식이 필요합니다.

Mermaid 렌더러 호환성 이슈가 있어 다이어그램은 정적 이미지로 고정했습니다.
주의: 실제로는 CNI, PSP/PSA 정책, Cilium/eBPF 여부, 커널 모듈 등에 따라 권한/구현이 달라집니다. 아래는 “패턴”을 보여주기 위한 예시입니다.
apiVersion: apps/v1
kind: Deployment
metadata:
name: app-transparent-egress
spec:
replicas: 1
selector:
matchLabels:
app: app-transparent-egress
template:
metadata:
labels:
app: app-transparent-egress
spec:
initContainers:
- name: init-iptables
image: ghcr.io/nicolaka/netshoot:latest
securityContext:
capabilities:
add: ["NET_ADMIN"]
command: ["sh", "-c"]
args:
- |
# 예: 443/80 목적지 트래픽을 로컬 15001로 리다이렉트
iptables -t nat -N GOST_REDIRECT || true
iptables -t nat -F GOST_REDIRECT
# 클러스터 내부 통신 제외(서비스/파드 CIDR은 환경에 맞게)
iptables -t nat -A GOST_REDIRECT -d 10.0.0.0/8 -j RETURN
iptables -t nat -A GOST_REDIRECT -d 172.16.0.0/12 -j RETURN
iptables -t nat -A GOST_REDIRECT -d 192.168.0.0/16 -j RETURN
# 외부로 나가는 TCP 80/443만 잡아서 gost로
iptables -t nat -A GOST_REDIRECT -p tcp --dport 80 -j REDIRECT --to-ports 15001
iptables -t nat -A GOST_REDIRECT -p tcp --dport 443 -j REDIRECT --to-ports 15001
iptables -t nat -A OUTPUT -p tcp -j GOST_REDIRECT
containers:
- name: app
image: your/app:tag
- name: gost
image: ginuerzh/gost:latest
args:
# 15001로 들어온 트래픽을 DMZ로 전달하는 엔드포인트(예시)
# 실제로는 목적(HTTP/HTTPS/TCP) 및 gost 모드에 따라 -L 형식이 달라질 수 있음
- "-L=redirect://:15001"
- "-F=h2://dmz-gost.example.dmz:443?ping=30"위 예시는 개념적으로는 “Istio의 sidecar redirect”와 동일한 패턴입니다. 즉, 앱이 몰라도 네트워크 레벨에서 트래픽을 옆 컨테이너로 우회시키는 방식입니다.
DMZ는 “외부 통신의 유일한 출구”이므로, 다음을 권장합니다.
gost를 잘 깔아도, 클러스터 레벨 통제가 없으면 우회가 가능합니다. 따라서 아래 2가지를 같이 가져가는 것을 권장합니다.
예시(개념): 해당 앱 라벨을 가진 Pod만 DMZ IP/Port로 egress 허용
apiVersion: networking.k8s.io/v1
kind: NetworkPolicy
metadata:
name: allow-egress-to-dmz-gost
namespace: default
spec:
podSelector:
matchLabels:
app: app-with-egress
policyTypes: ["Egress"]
egress:
- to:
- ipBlock:
cidr: 203.0.113.10/32 # DMZ gost VIP/IP
ports:
- protocol: TCP
port: 443실제로는 CNI가 NetworkPolicy를 지원해야 합니다(Cilium/Calico 등).
이 두 가지가 합쳐져야 “정말 특정 Pod만” 외부 통신이 가능해집니다.
/healthz 같은 HTTP 엔드포인트를 두기 어렵다면, TCP connect 체크를 별도로 둡니다.결론부터 말하면 가능한 경우가 많습니다. Istio는 “서비스 메시”이지만, egress 통제 패턴이 잘 정리되어 있습니다.

Mermaid 렌더러 호환성 이슈가 있어 다이어그램은 정적 이미지로 고정했습니다.
폐쇄망 K8s에서 외부 통신을 열 때 중요한 건 “열었다”가 아니라,
를 운영 가능한 형태로 만드는 것입니다.
gost는 이 요구를 비교적 낮은 복잡도로 구현할 수 있는 실전 도구이고, Istio는 이미 메시를 운영하는 조직이라면 더 강력한 정책/관측성을 제공할 수 있습니다.
필요하시면 다음 확장도 같이 정리할 수 있습니다.