WireGuard와 Docker 통합으로 컨테이너 네트워크 구성
WireGuard와 Docker를 통합해 컨테이너 네트워크를 안전하고 간결하게 구성하는 원리, docker-compose 예제, 라우팅 및 보안 고려사항을 정리한 자료
목차
개요
컨테이너 환경에서 네트워크 보안과 분리 요구가 커지면서 WireGuard 기반의 VPN을 Docker에 통합하는 사례가 늘고 있다. 본문은 Docker WireGuard 설정을 처음 접하는 사람도 이해할 수 있게 개념부터 실무 예제까지 단계별로 정리한다.
WireGuard와 Docker 통합의 접근 방식
1) 호스트 네트워크에서 WireGuard 실행
간단한 방법이다. 호스트에 WireGuard를 설치하고 컨테이너는 호스트 라우팅을 이용한다. 설정과 성능은 유리하지만 컨테이너 단위 트래픽 분리는 어렵다.
2) WireGuard를 별도 컨테이너로 띄워 게이트웨이로 사용
WireGuard 컨테이너를 VPN 게이트웨이로 구성하고 다른 컨테이너를 해당 네트워크 네임스페이스에 연결한다. Docker-compose WireGuard 구성에서 자주 쓰이는 방식이다. 컨테이너별 트래픽 제어가 가능하고 이식성이 높다.
3) Sidecar 패턴
각 서비스에 WireGuard 사이드카 컨테이너를 붙이는 방식이다. 서비스별 분리 수준이 높지만 관리 오버헤드가 커질 수 있다.
설계 시 고려사항
- 트래픽 분리 필요 여부
- 포트 및 NAT 규칙의 복잡성
- 키 관리와 시크릿 보관 방식
- 로그와 모니터링 통합
- 재시작과 마이그레이션 전략
docker-compose 예제
아래 예제는 linuxserver/wireguard 컨테이너를 사용해 VPN 게이트웨이를 만들고, app 컨테이너가 해당 게이트웨이의 네트워크 네임스페이스를 공유하도록 한다. Docker-compose WireGuard 예제는 실전 환경에 맞춰 경로와 권한을 조정해야 한다.
version: "3.8"
services:
wireguard:
image: linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
volumes:
- ./config:/config
- /lib/modules:/lib/modules
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Seoul
ports:
- "51820:51820/udp"
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
app:
image: nginx:alpine
depends_on:
- wireguard
network_mode: "service:wireguard"
restart: unless-stopped
설명
- network_mode: "service:wireguard"는 app 컨테이너가 wireguard 컨테이너의 네트워크 네임스페이스를 직접 사용하게 한다.
- WireGuard 설정 파일은 ./config에 보관한다. 키와 피어 설정을 이곳에 둔다.
- 호스트 포트 포워딩을 통해 외부에서 VPN 접속을 받을 수 있다.
설정 절차
- 1. 키 생성: WireGuard 키 쌍을 생성해 config에 저장한다.
- 2. docker-compose로 서비스 시작: wireguard와 app을 띄운다.
- 3. 라우팅 설정: 필요 시 컨테이너 내부에서 정책 라우팅을 적용한다.
- 4. 방화벽 규칙: 호스트와 컨테이너 양쪽에서 허용되는 포트와 IP를 제한한다.
라우팅과 DNS
컨테이너가 WireGuard 네임스페이스를 공유하면 기본 라우트와 DNS는 WireGuard 쪽 설정을 따른다. 내부 서비스에서 특정 트래픽만 VPN을 통하도록 분리하려면 ip rule과 iptables 기반의 마크-라우팅을 고려한다.
테스트와 문제 해결
- 컨테이너 내부에서 wg 명령으로 피어 상태 확인
- 호스트에서 udp 포트 51820이 열려 있는지 검사
- 패킷이 예상 경로로 흐르는지 traceroute로 검증
- 로그 파일에서 키 교환 오류나 인증 실패 확인
보안 및 운영 고려사항
- 키는 외부 저장소에 백업하고 접근 제어를 엄격히 한다.
- 컨테이너 재시작 시 인터페이스 초기화 순서를 고려한다.
- 최소 권한 원칙을 적용해 컨테이너 권한을 제한한다.
- 업데이트 정책과 모니터링을 통해 연결 안정성을 확보한다.
결론
컨테이너 WireGuard 네트워크 구성은 보안과 분리 측면에서 유리하다. Docker WireGuard 설정은 목적에 따라 호스트 기반, 게이트웨이 컨테이너, 사이드카 패턴을 선택하면 된다. docker-compose 예제를 기반으로 키 관리, 라우팅, 방화벽을 함께 설계하면 안정적인 VPN 통합 운영이 가능하다.