NoctisNode
← 가이드네트워킹2026-10-239분

WireGuard 메시로 프라이빗 VPS 클러스터 구축하기

WireGuard 풀 메시로 VPS 노드를 프라이빗 클러스터로 연결하세요. 하나의 주소 계획, 노드마다 [Peer] 하나, /32 AllowedIPs, 엄격한 방화벽, wg0에 바인딩된 서비스.

짧은 답변: 여러 VPS를 프라이빗 클러스터로 만들려면 각 VPS 노드에 하나의 사설 서브넷에서 주소를 받은 WireGuard 인터페이스를 주고, 다른 모든 노드를 공인 `Endpoint`와 `AllowedIPs`의 `/32`로 `[Peer]`에 추가하고, UDP 51820은 자신의 노드에서만 허용하고, 데이터베이스와 내부 서비스는 공인 IP 대신 `wg0` 주소에 바인딩하세요. 노드 약 10개까지는 직접 또는 템플릿으로 쉽게 관리할 수 있으며, 그 이상은 설정을 생성하고 배포하는 도구를 사용하세요.

이 가이드는 WireGuard VPN 가이드의 기본 사항을 이미 알고 있고, SSH 강화 가이드대로 모든 노드의 SSH를 강화했다고 가정합니다. 에이전트 포워딩 없이 배스천을 통해 노드에 접근하려면 StrictModes와 에이전트 포워딩 가이드를 참고하세요.

VPN 노드의 주소 계획

사용 중인 다른 것(집 LAN, Docker, Kubernetes 파드 대역)과 겹치지 않는 사설 대역 하나를 고르세요. 소규모 클러스터에는 `/24`면 충분하고 주소도 읽기 쉽습니다. 각 노드에 고정 주소를 할당하고, 모든 설정이 여기서 파생되므로 계획을 버전 관리에 두세요.

노드역할공인 IPwg0 주소ListenPort
node1앱203.0.113.1110.88.0.1/2451820
node2앱203.0.113.1210.88.0.2/2451820
node3데이터베이스203.0.113.1310.88.0.3/2451820
node4모니터링203.0.113.1410.88.0.4/2451820

각 VPS 노드의 피어별 설정

풀 메시에서는 모든 노드가 다른 모든 노드와 직접 통신하므로, 각 설정에는 `[Interface]` 하나와 N-1개의 `[Peer]` 섹션이 있습니다. 노드 4개는 총 6개 터널, 노드 10개는 45개 터널입니다. 모든 노드에 공인 IP가 있으므로 `PersistentKeepalive`는 보통 필요 없습니다. 자세한 내용은 keepalive와 PresharedKey 가이드에 있습니다.

  1. 01.각 노드에서 `apt install wireguard`를 실행한 다음 `umask 077; wg genkey | tee /etc/wireguard/wg0.key | wg pubkey > /etc/wireguard/wg0.pub`를 실행하세요.
  2. 02.모든 공개 키와 주소 계획을 한곳에 모으세요.
  3. 03.포스트퀀텀 대비책으로 원한다면 노드 쌍마다 `wg genpsk` 키를 하나씩 생성하세요.
  4. 04.아래와 같이 각 노드에 `/etc/wireguard/wg0.conf`를 작성하세요.
  5. 05.`systemctl enable --now wg-quick@wg0`을 실행하고 `wg show`에서 모든 피어와 최근 핸드셰이크가 있는지 확인하세요.
# /etc/wireguard/wg0.conf on node1
[Interface]
Address = 10.88.0.1/24
ListenPort = 51820
PrivateKey = <node1 private key>

[Peer]
# node2
PublicKey = <node2 public key>
Endpoint = 203.0.113.12:51820
AllowedIPs = 10.88.0.2/32

[Peer]
# node3
PublicKey = <node3 public key>
Endpoint = 203.0.113.13:51820
AllowedIPs = 10.88.0.3/32

[Peer]
# node4
PublicKey = <node4 public key>
Endpoint = 203.0.113.14:51820
AllowedIPs = 10.88.0.4/32

메시에서 AllowedIPs가 작동하는 방식

`AllowedIPs`는 두 가지 역할을 동시에 합니다. 아웃바운드에서는 라우팅 테이블입니다. `10.88.0.3`으로 가는 패킷은 `10.88.0.3/32`를 나열한 피어로 갑니다. 인바운드에서는 접근 목록입니다. 해당 피어에서 도착한 패킷은 출발지 주소가 그 피어의 `AllowedIPs` 안에 있을 때만 허용됩니다. 그래서 각 피어는 전체 `/24`가 아니라 정확히 자신의 `/32`를 받습니다.

`Address` 줄의 `/24`는 `wg0`에 서브넷용 커널 경로만 만듭니다. 그러면 WireGuard가 목적지별로 올바른 피어를 선택합니다.

  • ▹같은 인터페이스에서 두 피어의 `AllowedIPs` 범위가 겹쳐서는 절대 안 됩니다. 마지막 것이 우선합니다.
  • ▹노드가 사설 서브넷도 라우팅한다면(예: node3의 Docker), 다른 노드들에서 node3의 `AllowedIPs`에 그 서브넷을 추가하세요.
  • ▹모든 트래픽이 그 노드를 통해 나가기를 정말 원하는 게 아니라면 메시 피어에 `0.0.0.0/0`을 넣지 마세요.

방화벽: 자신의 노드만 터널에 도달

WireGuard는 인증되지 않은 패킷에 응답하지 않지만, UDP 51820을 알려진 노드 IP로 제한하면 노이즈가 줄어듭니다. 터널 안에서는 각 서비스에 필요한 포트만 여세요. Debian 12/13과 Ubuntu 24.04용 이 nftables 예제는 `/etc/nftables.conf`에 넣습니다. `nft -f /etc/nftables.conf`로 불러오고 `nftables.service`를 활성화하세요. 테스트하는 동안 SSH 세션을 열어 두세요.

table inet filter {
  set mesh_peers {
    type ipv4_addr
    elements = { 203.0.113.11, 203.0.113.12, 203.0.113.13, 203.0.113.14 }
  }
  chain input {
    type filter hook input priority 0; policy drop;
    ct state established,related accept
    iif lo accept
    meta l4proto { icmp, ipv6-icmp } accept
    tcp dport 22 accept
    udp dport 51820 ip saddr @mesh_peers accept
    iifname "wg0" ip saddr 10.88.0.0/24 tcp dport { 5432, 6379, 9100 } accept
  }
}

서비스를 wg 인터페이스에 바인딩하기

방화벽은 하나의 계층이고, 두 번째 계층은 아예 공인 주소에서 리슨하지 않는 것입니다. 방화벽 실수로 노출되지 않도록 내부 서비스를 노드의 `wg0` 주소에 바인딩하세요. 서비스가 바인딩하기 전에 `wg0`이 존재해야 하므로 systemd 드롭인으로 유닛 순서를 정하거나, `net.ipv4.ip_nonlocal_bind = 1`로 아직 올라오지 않은 주소에 바인딩을 허용하세요.

# PostgreSQL on node3: postgresql.conf
listen_addresses = '10.88.0.3'
# pg_hba.conf
host  all  all  10.88.0.0/24  scram-sha-256

# Redis: /etc/redis/redis.conf
bind 10.88.0.3

# systemctl edit postgresql  (repeat for other services)
[Unit]
[email protected]
[email protected]

Note · `ss -tlnp`로 결과를 확인하세요. 내부 서비스는 `10.88.0.x`로 표시되어야 하며, `0.0.0.0`이나 공인 IP로 표시되어서는 안 됩니다.

확장: 도구로 전환할 시점

노드 수가 적고 변경이 드물 때는 직접 작성한 메시로 충분합니다. 새 노드마다 기존의 모든 설정을 수정해야 하므로 작업량은 제곱으로 늘어납니다. 그것이 귀찮아지면 설정을 직접 쓰는 대신 생성하세요.

NoctisNode에서는 모든 새 VPS 노드가 FI-1(핀란드)에 배포되며, 각각 전용 IPv4와 무제한 1 Gbps 포트를 갖습니다. 시간 단위 과금과 에이전트 API(자동 삭제 TTL 포함) 덕분에 테스트 노드를 저렴하게 추가하고 제거할 수 있습니다. 요금제는 Wisp 등급부터 시작합니다. VPS 요금제를 참고하세요.

클러스터 규모접근 방식
2–5개 노드직접 작성한 설정, 텍스트 파일의 주소 계획
5–15개 노드Ansible 등 설정 도구로 하나의 인벤토리에서 wg0.conf를 템플릿 생성
15개 이상 또는 잦은 변동키와 피어를 자동으로 배포하는 메시 관리자, 또는 허브 앤 스포크 설계

FAQ

Q여러 VPS를 프라이빗 네트워크로 연결하려면 어떻게 하나요?

A각 VPS에 WireGuard를 설치하고, 각 노드에 하나의 사설 서브넷에서 주소를 주고, 다른 모든 노드를 공인 엔드포인트와 /32 AllowedIPs로 피어에 나열하세요. 그다음 내부 서비스를 WireGuard 주소에 바인딩하세요.

QWireGuard 메시의 VPN 노드에 PersistentKeepalive가 필요한가요?

A보통은 필요 없습니다. 모든 VPS 노드에 공인 IP가 있어 직접 도달할 수 있기 때문입니다. NAT 뒤에 있는 노드에만 `PersistentKeepalive = 25`를 추가하세요.

Q각 VPS 노드의 AllowedIPs는 어떻게 설정해야 하나요?

A각 피어에는 자신의 WireGuard 주소만 /32로, 그리고 그 노드가 라우팅하는 서브넷만 지정합니다. 모든 피어에 클러스터 전체 서브넷을 쓰면 경로가 겹쳐 메시가 깨집니다.

QWireGuard 메시에는 노드를 몇 개까지 둘 수 있나요?

AWireGuard 자체는 많은 피어를 처리하지만, 모든 노드에 다른 모든 노드의 설정이 필요하므로 직접 관리하는 풀 메시는 약 10개 노드를 넘으면 번거로워집니다. 그 이상은 자동화로 설정을 생성하거나 메시 관리자를 사용하세요.

WireGuard 메시로 프라이빗 VPS 클러스터 구축하기 · NoctisNode