VM에서 투명 프록시 모드 활성화

VM에서 투명 프록시 모드 활성화 (Enable transparent proxy mode on VMs)

이 주제에서는 서비스 메시에서 투명 프록시(transparent proxy) 모드를 사용하는 방법을 설명해요. 투명 프록시를 사용하면 애플리케이션이 구성을 수정하지 않고도 서비스 메시를 통해 통신할 수 있어요. 또한 투명 프록시는 메시를 우회하는 직접 인바운드 연결을 방지하여 애플리케이션 보안을 강화해요.

출처: 문서

본문

이 주제에서는 서비스 메시에서 투명 프록시 모드를 사용하는 방법을 설명합니다. 투명 프록시를 사용하면 애플리케이션이 구성을 수정하지 않고도 서비스 메시를 통해 통신할 수 있습니다. 또한 투명 프록시는 메시를 우회하는 직접 인바운드 연결을 방지하여 애플리케이션 보안을 강화합니다. 자세한 내용은 Transparent proxy overview를 참조하세요.

요구 사항 (Requirements)

투명 프록시를 사용하려면 네트워크가 다음 환경 및 소프트웨어 요구 사항을 충족해야 합니다.

  • v1.11.1+가 설치된 Consul 데이터센터가 최소 두 개의 Linux 클라이언트 노드로 실행 중.
  • Consul 클라이언트 노드에서 DNS forwarding 활성화.
  • Consul 클라이언트 노드에 Envoy 설치. Consul 설치가 지원하는 Envoy 버전에 대한 자세한 내용은 Envoy proxy 구성 참조를 참조하세요.
  • Consul을 실행할 전용 사용자. Consul은 사용자 ID를 사용하여 Consul 관련 트래픽을 투명 프록시에서 제외합니다. 이 지침은 consul Linux 사용자를 사용합니다.
  • Envoy를 실행할 전용 사용자. Consul은 사용자 ID를 사용하여 프록시 관련 트래픽을 투명 프록시에서 제외합니다. 이 지침은 envoy Linux 사용자를 사용합니다.

수동 구성 (Manual configuration)

Consul 서비스 메시가 투명 프록시를 사용하도록 수동으로 구성하려면 다음 단계를 따르세요:

  1. 서비스 등록
  2. 트래픽을 프록시로 리디렉트
  3. 서비스 연결

서비스 등록 (Register the service)

서비스 정의의 connect 블록에서 서비스가 투명 프록시 모드를 사용하도록 구성합니다.

{
 "service": {
   "connect": {
     "sidecar_service": {
       "proxy": {
         "mode": "transparent"
       }
     }
   },
   "name": "${service_name}",
   "port": "${service_port}"
 }
}

그런 다음 Consul에 서비스를 등록하세요.

투명 프록시가 활성화된 서비스의 경우 Consul은 240.0.0.0/4 범위에서 가상 IP를 할당하므로, 다운스트림 서비스는 서비스 메시가 할당한 고유 IP를 사용하여 업스트림 서비스에 연결할 수 있습니다.

트래픽을 프록시로 리디렉트 (Redirect traffic to proxies)

명명된 서비스에 대해 VM에서 투명 프록시를 활성화하려면 consul connect redirect-traffic 명령을 사용하세요.

이 명령은 consul과 envoy의 사용자 ID를 포함하여 투명 프록시가 Consul과 Envoy의 트래픽을 리디렉션에서 제외하도록 합니다.

경고 (Warning)

이 명령은 제외를 지정하지 않으면 기존 인바운드 트래픽을 거부하는 iptables 규칙을 추가합니다. 결과적으로 SSH를 포함한 Consul 및 Envoy와 관련되지 않은 VM에 대한 모든 연결이 끊어집니다.

$ consul connect redirect-traffic \
   -proxy-id="${service_name}-sidecar-proxy" \
   -proxy-uid="$(id --user envoy)" \
   -exclude-uid="$(id --user consul)"

특정 포트나 IP 주소에서 인바운드 또는 아웃바운드 트래픽을 제외하려면 제외를 지정하는 추가 인수를 추가하세요.

예를 들어 로그인을 위해 SSH 포트로의 인바운드 트래픽을 제외해야 할 수 있습니다:

$ consul connect redirect-traffic \
   -proxy-id="${service_name}-sidecar-proxy" \
   -proxy-uid="$(id --user envoy)" \
   -exclude-uid="$(id --user consul)" \
   -exclude-inbound-port=22

TransparentProxy.MeshDestinationsOnly=true로 정의된 mesh 구성 항목이 있으면 트래픽을 리디렉트한 후 투명 프록시가 VM에 대한 모든 인바운드 및 아웃바운드 요청을 거부합니다. 투명 프록시는 패키지 다운로드 요청을 거부하므로 트래픽을 리디렉트하기 전에 애플리케이션과 그 의존성을 설치했는지 확인하세요.

서비스 연결 (Connect services)

ACL이 활성화되면 Consul 서비스 메시는 기본적으로 서비스 간 모든 트래픽을 거부합니다.

Consul은 서비스 의도를 기반으로 프록시가 적절한 업스트림 서비스로 트래픽을 라우팅하도록 구성합니다.

이 예제는 서비스 web과 서비스 api 사이의 트래픽을 허용하는 의도를 보여줍니다.

Kind = "service-intentions"
Name = "api"
Sources = [
  {
    Name   = "web"
    Action = "allow"
    Namespace  = "default"
    Partition  = "default"  
  }
]

서비스가 올바르게 구성되었는지 확인하려면 Consul DNS를 사용하여 web 서비스 클라이언트 노드에서 api 서비스를 해석하세요.

Consul DNS는 ${service_name}.virtual.consul 형식의 DNS 호스트 이름을 사용하여 업스트림 서비스의 메시 내 가상 IP를 해석합니다. 멀티 포트 서비스의 경우 ${port_name}.${service_name}.virtual.consul 형식으로 서비스 이름 앞에 명명된 포트를 지정하세요.

$ nslookup api.virtual.consul
Server:         127.0.0.53
Address:        127.0.0.53#53
 
Non-authoritative answer:
Name:   api.virtual.consul
Address: 240.0.0.2

web 서비스 클라이언트 노드에서 api 서비스에 도달할 수 있는지 확인하세요.

$ curl --head http://api.virtual.consul
HTTP/1.1 200 OK
Date: Wed, 25 Mar 2026 13:37:36 GMT
Content-Length: 234
Content-Type: text/plain; charset=utf-8
Connection: close

멀티 포트 서비스의 경우 도달하려는 포트의 명명된 가상 주소를 쿼리하세요:

$ nslookup http.api.virtual.consul
Server:         127.0.0.53
Address:        127.0.0.53#53

Non-authoritative answer:
Name:   http.api.virtual.consul
Address: 240.0.0.10

자동 구성 (Automatic configuration)

VM에서 투명 프록시를 활성화하는 프로세스는 모든 서비스에 표준적입니다.

프로세스를 수동으로 테스트한 후 서비스를 시작할 때 노드가 사이드카 프록시를 자동으로 설정하도록 구성하는 것을 권장합니다.

투명 프록시 구성 프로세스를 자동화하는 두 가지 방법:

  • systemd 유닛 파일 설정
  • Terraform 사용

systemd를 사용하여 Consul 서비스 메시의 사이드카 프록시를 시작하는 경우 유닛 파일에 두 개의 스크립트를 추가할 수 있습니다:

  • 프록시를 시작하기 전에 트래픽 리디렉션 활성화
  • 프록시를 중지한 후 iptables 규칙 정리

ExecStartPre 및 ExecStopPost 매개변수를 사용하여 스크립트를 systemd 유닛 파일에 추가할 수 있습니다:

[Unit]
Description=Consul Envoy
After=syslog.target network.target consul.service
Wants=consul.service

ConditionFileIsExecutable=<script for redirecting traffic>
ConditionFileIsExecutable=<script for cleaning up iptables>

[Service]
Type=simple
User=envoy
Group=envoy
EnvironmentFile=/etc/consul.d/consul.env
ExecStartPre=+<script for redirecting traffic> ${service_name}
ExecStart=/usr/bin/consul connect envoy -sidecar-for=${service_name}
ExecStopPost=+<script for cleaning up iptables>
Restart=on-failure
RestartSec=5
WorkingDirectory=/etc/consul.d/

[Install]
WantedBy=multi-user.target

Terraform을 사용하여 Consul 서비스 메시에서 작동하도록 설치되고 구성된 서비스로 Consul 클라이언트 노드를 배포할 수 있습니다.

자체 배포를 만들기 위한 템플릿으로 Consul 투명 프록시용 Terraform 모듈을 사용하세요.

모듈에는 다음이 포함됩니다:

더 알아보기 (Learn more)