WireGuard 서버 이중화: Keepalived 예제 구성
WireGuard로 VPN 서버 이중화를 구현하는 과정과 Keepalived를 이용한 가상 IP 구성, 헬스체크 스크립트, 장애 전환 테스트 및 방화벽·라우팅 고려사항까지 설명하는 설정 예제
목차
개요
이 글은 WireGuard 기반 VPN을 이중화(HA)로 구성하는 방법을 설명한다. Keepalived를 사용해 가상 IP(VIP)를 제공하고, 간단한 헬스체크로 WireGuard 인터페이스 상태를 감시한다. 처음 접하는 사람도 이해할 수 있도록 단계별로 정리했다.
전제 조건
- 두 대의 Linux 서버(A, B), 동일한 WireGuard 구성 가능
- Keepalived 설치 가능(Root 권한)
- 서버 간 라우팅과 방화벽 설정에 대한 기본 이해
구성 개요
목표는 클라이언트가 항상 동일한 가상 IP(VIP)로 접속하도록 하는 것이다. VIP는 Keepalived의 VRRP로 양쪽 서버 중 하나에 할당된다. WireGuard 인터페이스(wg0)가 올라오지 않거나 터널 경로에 문제가 생기면 Keepalived가 VIP를 다른 노드로 이동시킨다.
네트워크 토폴로지
- 서버 A: 공인 IP a.a.a.a, WireGuard 인터페이스 wg0
- 서버 B: 공인 IP b.b.b.b, WireGuard 인터페이스 wg0
- VIP: v.v.v.v (클라이언트는 이 IP로 접속)
WireGuard 설정 예제
두 서버에 동일한 포트와 키 구조를 적용하되, 각 서버의 PrivateKey만 다르게 한다. 간단한 wg0.conf 예시는 다음과 같다.
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = SERVER_A_PRIVATE_KEY
[Peer]
# 동료 서버나 클라이언트 설정
PublicKey = PEER_PUBLIC_KEY
AllowedIPs = 10.0.0.2/32, 0.0.0.0/0
다른 서버는 Address를 10.0.0.2로 바꾸고 그에 맞는 PrivateKey를 사용한다. 클라이언트는 VIP(v.v.v.v) 또는 WireGuard 내부 주소로 라우팅할 수 있다.
Keepalived 설치 및 기본 설정
Keepalived는 VRRP를 통해 VIP를 관리한다. 아래는 Master(우선 노드)와 Backup의 기본 구성 예제이다.
Master 노드의 /etc/keepalived/keepalived.conf
vrrp_script chk_wg {
script "/usr/local/bin/check_wg.sh"
interval 2
weight 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state MASTER
interface eth0
virtual_router_id 51
priority 100
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
v.v.v.v/32
}
track_script {
chk_wg
}
}
Backup 노드의 /etc/keepalived/keepalived.conf
vrrp_script chk_wg {
script "/usr/local/bin/check_wg.sh"
interval 2
weight 2
fall 3
rise 2
}
vrrp_instance VI_1 {
state BACKUP
interface eth0
virtual_router_id 51
priority 90
advert_int 1
authentication {
auth_type PASS
auth_pass secret
}
virtual_ipaddress {
v.v.v.v/32
}
track_script {
chk_wg
}
}
헬스체크 스크립트
Keepalived는 WireGuard가 정상 동작하는지 확인하기 위해 스크립트를 실행한다. 스크립트는 wg 인터페이스가 존재하고 피어가 연결되었는지 확인한다. /usr/local/bin/check_wg.sh 예시:
#!/bin/bash
# 단순한 WireGuard 상태 검사
WG_IF="wg0"
if ip link show "$WG_IF" > /dev/null; then
# 인터페이스가 있으면 피어 상태 검사
PEERS=$(wg show "$WG_IF" peers | wc -l)
if [ "$PEERS" -ge 1 ]; then
exit 0
fi
fi
exit 1
스크립트에 실행 권한을 부여한다: chmod +x /usr/local/bin/check_wg.sh
방화벽 및 라우팅 고려사항
VIP로 들어오는 패킷이 실제 WireGuard 터널로 적절히 전달되어야 한다. 일반 설정 고려사항은 다음과 같다.
- WireGuard 포트(예: 51820)를 허용
- VIP에 대한 입력 정책을 허용
- IP 포워딩 활성화(sysctl net.ipv4.ip_forward=1)
- 서버 간 Keepalived VRRP 프로토콜(프로토콜 번호 112 또는 IP 프로토콜 vrrp)이 허용되는지 확인
테스트 절차
- 양쪽 서버에서 WireGuard를 시작하고 피어가 연결되는지 확인
- Keepalived를 시작하여 VIP가 Master 노드에 붙는지 확인
- Master에서 WireGuard 인터페이스를 내리거나 헬스체크 스크립트를 실패시키면 VIP가 Backup으로 이동하는지 확인
- 클라이언트에서 VIP로 트래픽을 보내고 장애 전환 후에도 연결 지속 여부 확인
문제 해결 팁
- Keepalived 로그: /var/log/syslog 또는 systemd-journal에서 VRRP 관련 로그 확인
- 헬스체크 스크립트 반환 코드와 실행 권한 확인
- VIP가 붙은 인터페이스와 라우팅 테이블 확인: ip addr show, ip route show
- Firewall 문제: nftables 또는 iptables 규칙으로 포트/프로토콜 차단 여부 점검
운영상 유의사항
Keepalived의 우선순위 및 advert_int 값을 상황에 맞게 조정한다. 너무 짧은 advert_int는 불필요한 전환을 유발할 수 있고, 너무 길면 장애 인지 시간이 늘어난다. 헬스체크 주기를 네트워크 특성에 맞춰 조절한다.
마무리
WireGuard와 Keepalived를 결합하면 단일 VIP로 안정적인 접속을 제공할 수 있다. 이 글의 예제는 기본 흐름을 설명하기 위한 것이다. 실제 운영환경에서는 모니터링, 로그 수집, 보안 정책을 추가로 적용해 운영 안정성을 높인다.