Self-Hosting Netbird: 프라이버시 우선, 관리형 오버레이 네트워크에 대한 대안
Source: Dev.to
위에 제공된 소스 링크만 포함되어 있으며 번역할 실제 텍스트가 제공되지 않았습니다. 번역을 원하시는 본문을 알려주시면 한국어로 번역해 드리겠습니다.
소개
규제된 환경에서 인프라 엔지니어로서 우리는 딜레마에 직면합니다: Tailscale 및 Twingate와 같은 현대적인 오버레이 네트워크 솔루션은 뛰어난 사용자 경험을 제공하지만, 중앙 집중식 제어 플레인은 컴플라이언스 우려를 불러일으킵니다. 엄격한 데이터 거버넌스 프레임워크(GDPR, BSI IT‑Grundschutz, 분야별 규제)를 따르는 조직에게는 자체 호스팅 대안이 선호가 아니라 필수가 됩니다.
관리형 vs. 자체‑호스팅 오버레이 네트워크
| 항목 | 관리형 (Tailscale / Twingate) | 자체‑호스팅 (Netbird) |
|---|---|---|
| 제어 플레인 위치 | 미국 / 클라우드 제공업체 | 온‑프레미스 / 전용 VPS |
| 메타데이터 노출 | 연결 로그 및 피어 IP가 제공업체에 노출 | 완전 격리 |
| 데이터 주권 | 제공업체 인프라에 의존 | 완전한 제어 |
| 벤더 종속성 | 독점 조정 프로토콜 | 오픈 프로토콜 (WireGuard) |
| 감사 로그 | 제공업체 관리 | 자체 관리 |
공공 부문 기관이나 민감한 데이터를 다루는 조직의 경우, 제어 플레인 위치가 컴플라이언스 장벽이 됩니다.
Netbird 아키텍처
┌─────────────────────────────────────────┐
│ Netbird │
│ ──► Control Plane (Management Server) │
│ ──► Data Plane (WireGuard tunnels) │
└─────────────────────────────────────────┘
주요 특성
- 관리 서버를 통한 트래픽 라우팅 없음 – 초기 조정 후 피어는 직접 WireGuard 터널을 설정합니다.
- STUN/TURN 폴백 – 직접 연결이 실패할 경우에만 사용됩니다(기업 방화벽, 대칭 NAT 등).
- Identity‑Provider 통합 – 인증을 위해 OIDC(OpenID Connect)를 사용하며, Zitadel, Keycloak, Authentik 등과 연동됩니다.
표준 Netbird 배포에서는 관리 API와 STUN/TURN 서비스를 인터넷에 노출합니다. 무차별 공격 및 자원 고갈을 완화하기 위해 CrowdSec(협업형 침입 방지 시스템)을 통합합니다.
- 맞춤 로그 파싱 – Netbird의 Go 기반 로깅은 인증 실패를 감지하기 위해 커스텀 Grok 패턴이 필요합니다.
- 행동 분석 – 누수 버킷 시나리오를 통해 반복된 피어 로그인 실패를 식별합니다.
- 방화벽 적용 –
iptables/nftables와 직접 연동하여 악성 IP가 애플리케이션 로직에 도달하기 전에 차단합니다. - 커뮤니티 인텔리전스 – CrowdSec의 글로벌 블록리스트와 위협 데이터를 공유합니다(옵트인).
예시 시나리오
30분 이내에 Netbird‑피어 인증 실패가 5회 이상 감지 → 소스 IP를 48시간 동안 차단합니다.
스택 개요
| 구성 요소 | 역할 |
|---|---|
| Caddy | 자동 TLS(Let’s Encrypt)를 갖춘 리버스 프록시 |
| Netbird Management | 피어 조정 및 정책 적용 |
| Zitadel | 자체 호스팅 OIDC 아이덴티티 제공자(Authentik/Keycloak로 교체 가능) |
| Coturn | NAT 트래버설을 위한 STUN/TURN 서버(명시적 포트 바인딩을 통해 네트워크 격리) |
| CrowdSec + Firewall Bouncer | 실시간 위협 차단 |
구성 철학
- 서비스 격리를 위해
network_mode: host사용을 피합니다. - 와일드카드 리스너 대신 명시적 IPv4/IPv6 포트 바인딩을 사용합니다.
- 디스크 고갈을 방지하기 위해 로그 회전 제한(컨테이너당 100 MiB)을 설정합니다.
전체 Docker‑Compose 구성은 저장소에서 확인할 수 있습니다:
➡️ Netbird‑self‑hosted‑stack on GitHub
Docker‑Compose 발췌 (Coturn)
coturn:
image: coturn/coturn:latest
restart: unless-stopped
ports:
- "${PUBLIC_IP}:3478:3478/udp"
- "${PUBLIC_IP}:3478:3478/tcp"
- "${PUBLIC_IP}:5349:5349/tcp"
- "${PUBLIC_IP}:49152-65535:49152-65535/udp"
volumes:
- ./config/turnserver.conf:/etc/turnserver.conf:ro
왜 network_mode: host를 사용하지 않을까?
- 컨테이너를 Docker 브리지 네트워크 내부에 유지합니다.
- CrowdSec 방화벽 규칙이 모든 서비스에 일관되게 적용될 수 있도록 합니다.
- 임시 포트에서 호스트 서비스가 실수로 노출되는 것을 방지합니다.
CrowdSec Integration
Netbird의 JSON 형식 로그는 기본 CrowdSec 파서와 일치하지 않으므로, 맞춤형 Grok 패턴을 제공합니다.
Parser Example – netbird-auth.yaml
# /etc/crowdsec/parsers/s01-parse/netbird-auth.yaml
type: grok-patterns
name: netbird/auth-failure
description: Detect Netbird management authentication failures
grok:
patterns:
- '%{TIMESTAMP_ISO8601:timestamp} %{WORD:log_level} %{DATA:component} - Authentication failed for peer %{DATA:peer_id}'
on_failure:
- ignore
Corresponding Scenario – netbird-brute-force.yaml
# /etc/crowdsec/scenarios/netbird-brute-force.yaml
type: threshold
name: netbird/brute-force
description: Detect multiple authentication failures from the same IP
filter: "evt.Line contains 'Authentication failed'"
group_by: "source_ip"
threshold: 5
time_window: 30m
ban_duration: 48h
전체 파서 및 시나리오 구성은 저장소에 포함되어 있습니다.
프로덕션 결과 (Hetzner VPS, Ubuntu 24.04 LTS)
| 항목 | 값 |
|---|---|
| 로드 평균 | 0.12 |
| RAM 사용량 | ~12 % |
| CrowdSec에 의해 차단된 IP | ~28 000 (CAPI + local decisions) |
| SSH 공격 (port 2222 + CrowdSec) | ↓ ≈ 40 /일에서 0 |
팁:
.env파일을 버전 관리에서 제외하세요 (git add .env→.gitignore에 추가하여 무시).
스택 배포
Docker Compose(또는 선호하는 오케스트레이터)를 사용하여 서비스를 시작합니다:
docker compose up -d
# or, if using Docker Swarm/Kubernetes, apply the provided manifests
모든 컨테이너가 실행 중인지 확인합니다:
docker compose ps
CrowdSec Bouncer 키 생성
# Inside the CrowdSec container (or on the host if CrowdSec is installed locally)
docker exec -it crowdsec /usr/local/bin/crowdsec bouncer add
# The command will output a bouncer key, e.g.:
# Bouncer key: 1234567890abcdef1234567890abcdef12345678
생성된 키를 복사하세요.
.env에 키 추가
.env 파일을 편집하고 CROWDSEC_BOUNCER_KEY 변수를 설정합니다:
CROWDSEC_BOUNCER_KEY=1234567890abcdef1234567890abcdef12345678
변경 사항을 적용하려면 스택을 재시작합니다:
docker compose restart crowdsec
Overview
Self‑hosting Netbird provides a production‑ready, compliant overlay network without sacrificing usability. By integrating CrowdSec, you gain security hardening through log‑based threat detection at the infrastructure layer—no custom application code required.
Why Use This Stack?
- Data sovereignty: Keeps all traffic and metadata within your controlled environment.
- Compliance: Meets strict public‑sector regulations (e.g., GDPR, NIS2).
- Flexibility: Works with existing CI/CD pipelines and on‑premise hardware.
Disclaimer: The configurations are provided as‑is for educational purposes. Review them against your organization’s security policies before deploying to production.
추가 읽을거리
- Netbird Documentation
- CrowdSec Documentation
행복한 네트워킹! 🚀