MCP

MCP Tunnel 완전분석 — 방화벽 열지 않고 내부망 MCP 서버에 연결하는 방법

cell-devlog 2026. 5. 28. 14:24
반응형

88%. 2026년 4월 Cloud Security Alliance 조사에서 AI 에이전트 보안 사고를 경험한 기업의 비율입니다. 그리고 46%의 IT팀이 "내부 시스템 연동"을 에이전트 도입의 가장 큰 장벽으로 꼽았습니다. Anthropic이 MCP Tunnel로 정확히 그 장벽을 겨냥했습니다.


핵심 요약 → 2026년 5월 19일 Code with Claude London에서 리서치 프리뷰 공개 → MCP Tunnel = Claude 에이전트가 방화벽 안 내부망 MCP 서버에 연결하는 암호화 채널 → 인바운드 방화벽 규칙 없음, 퍼블릭 엔드포인트 불필요, IP 화이트리스트 불필요 → 작동 원리: 내부망에 경량 게이트웨이 배포 → 단일 아웃바운드 연결만 개방 → 연결 가능 대상: 내부 DB, 사설 API, Jira/GitLab 등 내부망 서비스 → Claude Console에서 관리, Managed Agents + Messages API 모두 지원 → Self-Hosted Sandbox와 함께 사용 시 실행 환경까지 완전 내부화 가능 → 현재 리서치 프리뷰 — 프로덕션 SLA 미적용, GA 일정 미발표


왜 지금 이게 필요한가

기존 Claude Managed Agents의 한계는 명확했습니다. 에이전트가 도구를 실행하는 환경이 Anthropic 서버에 있었습니다. 스타트업 프로토타입엔 괜찮지만, 규제 데이터를 다루는 기업에겐 구조적 차단벽이었습니다.

# 기존 구도 vs MCP Tunnel 이후

[기존]
Claude Agent (Anthropic 서버)
  └→ MCP Tool 호출
      └→ 퍼블릭 인터넷 경유
          └→ 내부 DB 접근 ❌ (방화벽 차단)
          └→ 내부 Jira ❌
          └→ 사설 API ❌

→ 선택지:
  1. 내부 시스템 퍼블릭 노출 (보안 위협)
  2. VPN 구성 (복잡, 비용)
  3. 에이전트 포기

[MCP Tunnel 이후]
Claude Agent (Anthropic 서버 — 오케스트레이션 담당)
  └→ MCP Tunnel (암호화 채널)
      └→ 내부망 게이트웨이 (아웃바운드 연결만)
          └→ 내부 DB ✅
          └→ 내부 Jira ✅
          └→ 사설 API ✅

→ 인바운드 방화벽 규칙 = 0개
→ 퍼블릭 엔드포인트 = 0개

1. 아키텍처 원리 — 어떻게 방화벽을 열지 않고 연결하나

핵심은 연결 방향을 뒤집는 것입니다.

# MCP Tunnel 연결 흐름

기존 방식 (인바운드 필요):
  외부 → [방화벽] → 내부 서버
  → 방화벽에 인바운드 포트 오픈 필수
  → IP 화이트리스트 관리 필요
  → 보안팀 승인 프로세스 수주

MCP Tunnel 방식 (아웃바운드만):
  내부망 게이트웨이 → [방화벽] → Anthropic Tunnel Edge
  → 방화벽은 아웃바운드 HTTPS(443)만 허용 (이미 대부분 열려 있음)
  → Anthropic Tunnel Edge ↔ Claude Agent 구간 End-to-End 암호화
  → 내부 서버는 퍼블릭 IP 없음, 노출 없음

비유:
  기존 = 집 대문 열어두기 (누가 들어올지 모름)
  Tunnel = 집에서 먼저 전화 걸기 (내가 통화 주도)
# 아키텍처를 코드로 표현하면

# Step 1: 내부망에 게이트웨이 배포 (Docker)
# 이 컨테이너가 아웃바운드 연결을 Anthropic으로 개통

# docker-compose.yml (내부 서버에 배포)
"""
version: '3.8'
services:
  mcp-tunnel-gateway:
    image: anthropic/mcp-tunnel-gateway:latest
    environment:
      - ANTHROPIC_API_KEY=${ANTHROPIC_API_KEY}
      - TUNNEL_ID=${TUNNEL_ID}          # Claude Console에서 발급
      - MCP_TARGET_HOST=internal-db     # 연결할 내부 서비스
      - MCP_TARGET_PORT=5432
    # 인바운드 포트 노출 없음
    # 아웃바운드 443만 필요
"""

# Step 2: Claude Console에서 Tunnel 생성
# → Tunnel ID 발급
# → 연결할 MCP 서버 엔드포인트 등록
# → 인증 정책 설정

# Step 3: Managed Agents API 호출 시 tunnel_id 참조
import anthropic

client = anthropic.Anthropic()

# beta 헤더 필수 (리서치 프리뷰)
response = client.beta.agents.run(
    model="claude-opus-4-7",
    tools=[{
        "type": "mcp",
        "server": {
            "type": "tunnel",
            "tunnel_id": "tun_xxxxxxxxxxxxxxxx"  # Console에서 발급
            # → 이 tunnel_id가 내부망 MCP 서버를 가리킴
            # → Claude는 이 서버를 일반 MCP 서버처럼 사용
        }
    }],
    messages=[{
        "role": "user",
        "content": "내부 DB에서 이번 달 이상 거래 패턴 조회해줘"
    }],
    extra_headers={"anthropic-beta": "managed-agents-2026-04-01"}
)

2. Self-Hosted Sandbox와 함께 쓰면 — 완전 내부화 아키텍처

MCP Tunnel 단독으로는 "MCP 서버 접근"만 내부화됩니다. Self-Hosted Sandbox와 결합하면 도구 실행 환경까지 고객 인프라 안으로 들어옵니다.

# 두 기능의 역할 분리

MCP Tunnel:
  Claude가 내부망 MCP 서버에 접근하는 채널
  (데이터 접근 레이어)

Self-Hosted Sandbox:
  Claude가 도구를 실행하는 환경 자체를 고객 인프라로 이동
  (실행 레이어)

Anthropic이 관리하는 것 (변경 없음):
  - 에이전트 오케스트레이션
  - 컨텍스트 관리
  - 에러 복구 로직

# 결합 시 데이터 흐름

Claude (Anthropic 오케스트레이션)
  │
  ├─ [Tunnel] → 내부 MCP 서버 (데이터 접근)
  │              └ 내부 DB, 사설 API, Jira, GitLab
  │
  └─ [Self-Hosted Sandbox] → 고객 인프라 실행 환경
                              └ 파일 쓰기, 코드 실행, 네트워크 이그레스
                              └ 감사 로그, 보안 도구 적용됨
# Self-Hosted Sandbox + MCP Tunnel 결합 패턴

# 1. 먼저 Self-Hosted 환경 등록
import requests

env_response = requests.post(
    "https://api.anthropic.com/v1/environments",
    headers={
        "x-api-key": ANTHROPIC_API_KEY,
        "anthropic-beta": "managed-agents-2026-04-01",
        "content-type": "application/json"
    },
    json={
        "name": "internal-prod",
        "config": {
            "type": "self_hosted",
            "provider": "cloudflare"  # cloudflare | daytona | modal | vercel
        }
    }
)
env_id = env_response.json()["id"]

# 2. 에이전트 실행 시 sandbox + tunnel 동시 지정
client = anthropic.Anthropic()

response = client.beta.agents.run(
    model="claude-opus-4-7",
    environment_id=env_id,          # Self-Hosted Sandbox
    tools=[
        {
            "type": "mcp",
            "server": {
                "type": "tunnel",
                "tunnel_id": "tun_internal_jira"  # MCP Tunnel
            }
        },
        {
            "type": "mcp",
            "server": {
                "type": "tunnel",
                "tunnel_id": "tun_internal_db"    # 두 번째 Tunnel
                # → 여러 내부 서비스를 각각 Tunnel로 연결 가능
            }
        }
    ],
    messages=[{
        "role": "user",
        "content": "Jira 이슈 조회해서 DB에 결과 저장해줘"
    }],
    extra_headers={"anthropic-beta": "managed-agents-2026-04-01"}
)

# 결과:
# → 실행 환경: 고객 인프라 (Self-Hosted)
# → 데이터 접근: 내부망 MCP (Tunnel)
# → 오케스트레이션: Anthropic
# → 민감 데이터가 Anthropic 서버를 경유하지 않음

3. 실전 연결 가능 내부 서비스 목록

# MCP Tunnel로 연결 가능한 내부 서비스 예시

INTERNAL_SERVICES = {
    # 데이터베이스
    "PostgreSQL": {
        "mcp_server": "postgres-mcp",
        "tunnel_target": "internal-pg:5432",
        "use_case": "금융 데이터 조회, 트랜잭션 분석"
    },
    "MySQL/MariaDB": {
        "mcp_server": "mysql-mcp",
        "tunnel_target": "internal-mysql:3306",
        "use_case": "운영 DB 직접 쿼리"
    },

    # 이슈 트래커
    "Jira (사내 설치형)": {
        "mcp_server": "jira-mcp",
        "tunnel_target": "jira.internal:8080",
        "use_case": "이슈 생성, 조회, 업데이트 자동화"
    },
    "GitLab (On-Prem)": {
        "mcp_server": "gitlab-mcp",
        "tunnel_target": "gitlab.internal:443",
        "use_case": "MR 생성, 코드 리뷰, CI 트리거"
    },

    # 지식 관리
    "Confluence (사내)": {
        "mcp_server": "confluence-mcp",
        "tunnel_target": "confluence.internal:8090",
        "use_case": "내부 문서 검색, 페이지 생성"
    },
    "사내 벡터 DB": {
        "mcp_server": "custom-rag-mcp",
        "tunnel_target": "qdrant.internal:6333",
        "use_case": "사내 RAG, 지식 검색"
    },

    # 사설 API
    "내부 마이크로서비스": {
        "mcp_server": "custom-api-mcp",
        "tunnel_target": "api.internal:8080",
        "use_case": "결제 시스템, 재고 관리 등 사내 API"
    }
}

# 핵심: 이 모든 서비스가
# 퍼블릭 인터넷에 노출되지 않은 채로
# Claude 에이전트의 도구가 됨

4. 보안 모델 상세 — Anthropic은 무엇을 볼 수 있나

# MCP Tunnel 보안 경계

Anthropic이 접근 가능한 것:
  ✅ 에이전트 오케스트레이션 명령
  ✅ 도구 호출 메타데이터 (어떤 툴을 언제 호출했는지)
  ⚠ MCP 도구 결과값 — 오케스트레이션에 필요한 만큼

Anthropic이 접근 불가능한 것:
  ❌ 실제 파일 내용 (Self-Hosted Sandbox 사용 시)
  ❌ 내부 DB 스키마·데이터 (Tunnel 경유 시 암호화)
  ❌ 고객 인프라 내부 네트워크

고객이 직접 제어하는 것:
  ✅ Tunnel 게이트웨이 (고객 인프라에 배포)
  ✅ MCP 서버 접근 권한 (게이트웨이 수준에서 필터링 가능)
  ✅ 감사 로그 (기존 SIEM 도구 그대로 사용)
  ✅ 네트워크 이그레스 정책

⚠ 현재 한계 (리서치 프리뷰):
  - Self-Hosted 모드에서 Memory 미지원
  - AWS Bedrock 위 Claude Platform 미지원
  - 프로덕션 SLA 미적용
  - 세부 암호화 사양 공개 문서 미완성

5. Messages API에서 직접 쓰는 방법

Managed Agents뿐 아니라 Messages API에서도 MCP Tunnel을 직접 참조할 수 있습니다.

# Messages API + MCP Tunnel (직접 도구 호출 방식)

import anthropic

client = anthropic.Anthropic()

response = client.messages.create(
    model="claude-opus-4-7",
    max_tokens=4096,
    tools=[
        {
            "type": "mcp",
            "server": {
                "type": "tunnel",
                "tunnel_id": "tun_internal_db",
                "name": "internal-postgres"
            },
            # Tunnel 경유로 노출된 도구들이 자동으로 사용 가능해짐
            # 별도 tool 정의 없이 MCP 서버가 제공하는 도구 그대로 사용
        }
    ],
    messages=[
        {
            "role": "user",
            "content": "지난 7일 이상 거래 패턴 분석해서 요약해줘"
        }
    ],
    extra_headers={"anthropic-beta": "managed-agents-2026-04-01"}
)

# Claude가 내부 DB MCP 서버를 통해
# 방화벽 안 데이터를 직접 쿼리하고
# 분석 결과를 반환

6. 기업 도입 체크리스트

# MCP Tunnel 도입 전 확인 사항

네트워크 요구사항:
  □ 내부망 → 외부 HTTPS(443) 아웃바운드 허용 확인
    (대부분의 기업 네트워크에서 이미 열려 있음)
  □ Anthropic Tunnel Edge 도메인 화이트리스트 추가
    (*.anthropic-tunnel.com — 정확한 도메인은 문서 확인)
  □ 게이트웨이 컨테이너 배포 가능한 내부 서버 확보

보안 검토:
  □ MCP 서버 접근 권한 최소화 원칙 적용
    (게이트웨이에서 허용 툴 범위 제한)
  □ Tunnel ID → API 키 관리 정책 수립
  □ 감사 로그 SIEM 연동 계획 수립
  □ 리서치 프리뷰 상태 → 프로덕션 크리티컬 워크로드 투입 보류

현재 미지원 (주의):
  ❌ Self-Hosted 모드에서 Memory 기능
  ❌ AWS Bedrock 위 Claude Platform
  ❌ 정식 SLA 보장
  → GA 전환 시까지 PoC/파일럿 수준으로만 운영 권장

결론

MCP Tunnel이 해결하는 진짜 문제

  • 기업 AI 에이전트 도입의 46% 장벽("내부 시스템 연동 불가") 직접 제거
  • 인바운드 방화벽 규칙 없이 내부망 MCP 서버 연결 — 보안팀 설득 난이도 대폭 낮춤
  • Self-Hosted Sandbox와 결합 시 실행 환경까지 완전 내부화 가능

특히 유용한 케이스

  • 금융·의료·공공 규제 데이터를 다루는 에이전트
  • 사내 설치형(On-Prem) Jira·GitLab·Confluence 연동
  • 퍼블릭 클라우드 전환이 불가능한 레거시 내부 시스템 활용

지금 당장 프로덕션 투입을 보류해야 하는 이유

  • 리서치 프리뷰 — SLA 없음, 세부 암호화 사양 미완성
  • Memory 기능 미지원 (Self-Hosted 환경)
  • AWS Bedrock 환경 미지원
  • GA 타임라인 미발표 → 프리뷰 종료 시 마이그레이션 비용 발생 가능

관련 글

 

반응형