Nebula
Overlay VPN by Slack
Slack이 개발한 오픈소스 오버레이 VPN. WireGuard와 유사한 경량 메시 네트워크로 X.509 인증서 기반 인증 제공.
Overlay VPN by Slack
Slack이 개발한 오픈소스 오버레이 VPN. WireGuard와 유사한 경량 메시 네트워크로 X.509 인증서 기반 인증 제공.
Nebula는 Slack이 자사의 분산 인프라 보안을 위해 개발한 오픈소스 오버레이 네트워크 VPN입니다. 2019년에 오픈소스로 공개되었으며, 수천 개의 노드를 안전하게 연결하면서도 중앙 서버 없이 작동하는 것이 특징입니다. Go 언어로 작성되어 크로스 플랫폼을 지원합니다.
Nebula의 핵심은 X.509 인증서 기반 인증입니다. 각 호스트는 고유한 인증서를 발급받아 네트워크에 참여하며, 이 인증서에는 호스트의 IP 주소, 그룹 멤버십, 유효 기간이 포함됩니다. 중앙 인증 서버가 필요 없고, 인증서 자체가 신뢰의 기반이 됩니다.
WireGuard와 유사하게 Noise 프로토콜을 기반으로 암호화된 터널을 생성하지만, Nebula는 피어 투 피어(P2P) 메시 네트워크를 자동으로 구축합니다. Lighthouse라는 특수 노드가 다른 노드들의 위치를 알려주고 NAT 통과(hole punching)를 지원하여, 방화벽 뒤에 있는 호스트들도 직접 통신할 수 있습니다.
Nebula는 기존 VPN 솔루션의 단점을 해결합니다. OpenVPN이나 IPSec처럼 중앙 게이트웨이를 거치지 않아 병목이 없고, 설정이 단순하며, 수만 개의 노드까지 확장 가능합니다. 클라우드, 온프레미스, 엣지 환경을 하나의 네트워크로 연결하는 하이브리드 인프라에 적합합니다.
# 1. Nebula 바이너리 다운로드
wget https://github.com/slackhq/nebula/releases/download/v1.9.0/nebula-linux-amd64.tar.gz
tar -xzf nebula-linux-amd64.tar.gz
sudo mv nebula nebula-cert /usr/local/bin/
# 2. CA(인증 기관) 키 쌍 생성 - 최초 1회
nebula-cert ca -name "MyOrg Nebula CA" -duration 8760h
# 결과: ca.crt (공개), ca.key (비밀 - 안전하게 보관!)
# 3. Lighthouse 노드용 인증서 생성
nebula-cert sign -name "lighthouse1" \
-ip "10.100.0.1/24" \
-groups "lighthouse,servers"
# 4. 일반 노드용 인증서 생성
nebula-cert sign -name "server-web-01" \
-ip "10.100.0.10/24" \
-groups "servers,web"
nebula-cert sign -name "laptop-alice" \
-ip "10.100.0.100/24" \
-groups "employees,engineering"
# 5. 인증서 정보 확인
nebula-cert print -path server-web-01.crt
# Name: server-web-01
# IP: 10.100.0.10/24
# Groups: ["servers", "web"]
# Valid: 2024-01-01 ~ 2025-01-01
# 6. 인증서 갱신 (만료 전)
nebula-cert sign -name "server-web-01" \
-ip "10.100.0.10/24" \
-groups "servers,web" \
-duration 8760h # 1년
# config.yaml - Nebula 설정 파일
pki:
ca: /etc/nebula/ca.crt
cert: /etc/nebula/host.crt
key: /etc/nebula/host.key
# Lighthouse 서버 목록 (공인 IP 필요)
static_host_map:
"10.100.0.1": ["lighthouse.example.com:4242"]
lighthouse:
am_lighthouse: false # Lighthouse 노드면 true
interval: 60
hosts:
- "10.100.0.1"
# 네트워크 인터페이스 설정
tun:
disabled: false
dev: nebula1
drop_local_broadcast: false
drop_multicast: false
tx_queue: 500
mtu: 1300
# UDP 리스닝 포트
listen:
host: 0.0.0.0
port: 4242
# NAT 통과 설정
punchy:
punch: true
respond: true
delay: 1s
# 방화벽 규칙 (그룹 기반 접근 제어)
firewall:
outbound:
- port: any
proto: any
host: any
inbound:
# 같은 그룹 내 모든 통신 허용
- port: any
proto: any
group: servers
# engineering 그룹만 SSH 허용
- port: 22
proto: tcp
group: engineering
# 모든 호스트에서 ICMP 허용
- port: any
proto: icmp
host: any
# 로깅 설정
logging:
level: info
format: text
# Nebula 실행 (포그라운드)
sudo nebula -config /etc/nebula/config.yaml
# systemd 서비스로 등록
sudo tee /etc/systemd/system/nebula.service <<EOF
[Unit]
Description=Nebula Overlay Network
Wants=basic.target network-online.target
After=basic.target network-online.target
Before=sshd.service
[Service]
Type=simple
ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yaml
ExecReload=/bin/kill -HUP \$MAINPID
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF
# 서비스 시작
sudo systemctl daemon-reload
sudo systemctl enable nebula
sudo systemctl start nebula
# 상태 확인
sudo systemctl status nebula
journalctl -u nebula -f
# 연결된 피어 확인 (디버그 모드)
sudo nebula -config /etc/nebula/config.yaml -test
# 네트워크 인터페이스 확인
ip addr show nebula1
# 10.100.0.10/24 할당 확인
# 다른 Nebula 노드로 ping
ping 10.100.0.1 # Lighthouse
ping 10.100.0.100 # 다른 호스트
# 방화벽에서 UDP 4242 허용 (필수)
sudo ufw allow 4242/udp
# 또는 iptables
sudo iptables -A INPUT -p udp --dport 4242 -j ACCEPT
"WireGuard도 좋지만, 노드가 100개 넘어가면 설정 관리가 힘들어요. Nebula는 인증서 기반이라 각 노드가 자동으로 피어를 찾아서 P2P 연결합니다. Lighthouse만 공인 IP에 두면 나머지는 NAT 뒤에 있어도 됩니다."
"Nebula의 장점은 그룹 기반 접근 제어입니다. 인증서 발급 시 그룹을 지정하면, 방화벽 규칙에서 'engineering 그룹만 서버에 SSH 허용' 같은 정책을 적용할 수 있어요. 네트워크 레벨 RBAC인 셈이죠."
"Nebula와 WireGuard의 차이점을 설명하면, WireGuard는 커널 모듈로 더 빠르고, Nebula는 유저스페이스에서 동작하지만 자동 피어 디스커버리와 인증서 기반 인증이 강점입니다. 대규모 분산 환경에선 Nebula가, 소규모 고성능 VPN에선 WireGuard가 적합합니다."
ca.key가 유출되면 공격자가 임의의 인증서를 발급할 수 있습니다. CA 키는 에어갭 환경이나 HSM에 보관하고, 인증서 발급 시에만 사용하세요.
인증서가 만료되면 노드가 네트워크에서 즉시 차단됩니다. 만료 30일 전 자동 갱신 스크립트를 구축하고, 모니터링 알림을 설정하세요.
Lighthouse가 다운되면 새 피어 연결이 불가합니다. 최소 2개 이상의 Lighthouse를 다른 리전에 배포하고, static_host_map에 모두 등록하세요.
Lighthouse는 최소 2개 이상 다중화. 인증서 유효기간은 1년 이하로 설정하고 자동 갱신 구축. 방화벽 규칙에서 최소 권한 원칙 적용. UDP 4242 포트만 열고 나머지는 Nebula 방화벽으로 제어.