WireGuard와 Docker Compose로 개인 VPN 구축
Docker Compose와 WireGuard를 결합해 개인 VPN을 이해하기 쉽게 정리한 설치·설정 예제와 운영 시 주의사항을 포함한 기술자료
목차
소개
이 글은 Docker Compose와 WireGuard를 이용해 개인 VPN을 만드는 과정을 단계별로 설명한다. 네트워크 개념이 처음인 사람도 따라오기 쉽도록 핵심 원리와 설정 파일 예제를 담았다. 목적은 안전한 원격 접속과 간단한 운영 환경 구성이다.
왜 WireGuard와 Docker Compose인가
WireGuard는 경량 암호화 기반의 VPN으로 설정이 단순하고 성능이 우수하다. Docker Compose는 여러 컨테이너 서비스의 선언적 구성을 돕는다. 이 둘을 합치면 배포·관리 편의성과 보안성을 동시에 얻을 수 있다.
주요 장점
- 간단한 구성으로 빠른 연결 수립
- 컨테이너화로 환경 일관성 확보
- 재현 가능한 배포와 버전 관리
아키텍처 개요
기본 구성은 다음과 같다. WireGuard 서버는 Docker 컨테이너로 실행되며, 클라이언트는 개인 기기에서 WireGuard 인터페이스를 통해 접속한다. 서버는 공개 IP와 포트로 대기하고, 내부 네트워크를 통해 내부 서비스에 접근을 허용할 수 있다.
준비물
- 리눅스 서버 또는 VPS(공인 IP 권장)
- Docker와 Docker Compose 설치
- WireGuard 키 쌍 생성 도구(wg, wg-quick 등)
구성 흐름
- 서버와 클라이언트 키 생성
- docker-compose.yml 파일 작성
- WireGuard 서버 설정 파일 작성
- 포트 및 방화벽 규칙 확인
- 클라이언트 구성 적용 후 연결 확인
docker-compose 예제
아래는 WireGuard를 실행하는 간단한 docker-compose 설정 예제이다. 이 예제는 호스트의 /etc/wireguard를 사용해 구성 파일을 관리한다.
version: '3.8'
services:
wireguard:
image: linuxserver/wireguard
container_name: wireguard
cap_add:
- NET_ADMIN
- SYS_MODULE
environment:
- PUID=1000
- PGID=1000
- TZ=Asia/Seoul
volumes:
- ./config:/config
- /lib/modules:/lib/modules
ports:
- "51820:51820/udp"
sysctls:
- net.ipv4.conf.all.src_valid_mark=1
restart: unless-stopped
WireGuard 서버 설정 예제
컨테이너 내부에서 사용하는 기본 서버 설정 파일 예제는 다음과 같다. 서버 공개 키와 클라이언트 공개 키는 실제 생성 결과로 대체해야 한다.
[Interface]
Address = 10.6.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY
SaveConfig = true
# 클라이언트 예시
[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.6.0.2/32
클라이언트 설정 예제
클라이언트 설정은 각 기기에 적용한다. 아래는 일반적인 구성 샘플이다.
[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.6.0.2/24
DNS = 1.1.1.1
[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = your.server.ip:51820
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
키 생성 예시
서버와 클라이언트 키는 로컬에서 생성한 뒤 구성 파일에 삽입한다. 예시는 리눅스 환경을 기준으로 한다.
# 서버 키
wg genkey | tee server_private.key | wg pubkey > server_public.key
# 클라이언트 키
wg genkey | tee client_private.key | wg pubkey > client_public.key
방화벽과 라우팅 확인
포트 포워딩과 방화벽 규칙을 확인한다. 서버가 NAT 뒤에 있다면 라우터에서 UDP 51820 포트를 포워딩해야 한다. 또한 서버에서 IP 포워딩을 활성화해야 내부 네트워크 접근이 가능하다.
핵심 명령
- IP 포워딩 활성화: sysctl -w net.ipv4.ip_forward=1
- iptables 예시: POSTROUTING에 MASQUERADE 추가
테스트 및 검증
클라이언트에서 WireGuard를 활성화한 뒤, 서버의 VPN IP로 ping을 보낸다. 정상 연결 시 내부 서비스나 인터넷 트래픽이 WireGuard를 통해 흐르는 것을 확인할 수 있다. 연결 문제 시 로그와 컨테이너 상태를 확인한다.
운영 시 보안 고려사항
- 키 관리는 안전한 위치에 보관하고 주기적으로 교체를 검토
- 필요한 클라이언트만 허용하도록 AllowedIPs와 Peer 설정을 제한
- 로그 감시와 접근 제어로 비정상 트래픽 모니터링
문제 해결 팁
- 연결이 되지 않으면 포트·방화벽·키값을 우선 검토
- 컨테이너 로그에서 실패 원인을 찾기
- 클라이언트와 서버의 AllowedIPs 설정 불일치 주의
마무리
Docker Compose WireGuard 환경은 개인용 VPN을 간단히 운영할 수 있는 실용적 방법이다. 위 예제를 통해 기본 원리를 익히고, 운영 환경에 맞춰 보안과 접근 제어를 강화하면 안전한 원격 접속 환경을 구축할 수 있다. 추가로 DNS 설정, 내부 라우팅, 자동화 배포를 적용하면 관리 편의성이 더 높아진다.