WireGuard · 2026-04-28

WireGuard 서버 이중화: Keepalived 예제 구성

WireGuard로 VPN 서버 이중화를 구현하는 과정과 Keepalived를 이용한 가상 IP 구성, 헬스체크 스크립트, 장애 전환 테스트 및 방화벽·라우팅 고려사항까지 설명하는 설정 예제

작성일 : 2026-04-28 ㆍ 작성자 : 관리자
post
목차

개요

이 글은 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로 안정적인 접속을 제공할 수 있다. 이 글의 예제는 기본 흐름을 설명하기 위한 것이다. 실제 운영환경에서는 모니터링, 로그 수집, 보안 정책을 추가로 적용해 운영 안정성을 높인다.

WireGuard HA 구성 Keepalived WireGuard 설정 WireGuard 이중화 서버 Keepalived WireGuard HA 구성 VRRP 서버 이중화 Linux 네트워크