VPS에서 WireGuard PersistentKeepalive 25와 PresharedKey
PersistentKeepalive = 25는 25초마다 keepalive를 보내 NAT가 터널을 열어 두게 합니다. NAT 뒤의 클라이언트에 설정하세요. PresharedKey는 대칭 키 기반의 포스트퀀텀 대비책을 더합니다.
짧은 답변: `PersistentKeepalive = 25`는 WireGuard가 25초마다 피어에 아주 작은 인증 패킷을 보내게 해, NAT와 상태 기반 방화벽의 매핑을 유지하고 상대편이 계속 당신에게 도달할 수 있게 합니다. 보통 공인 IP를 가진 VPS가 아니라 NAT 뒤에 있는 피어(노트북, 휴대폰, 집 라우터)에만 설정합니다. `PresharedKey`는 피어 쌍마다 추가하는 선택적 256비트 대칭 비밀로, `wg genpsk`로 생성하며 Curve25519에 대한 미래의 양자 공격에 대비해 핸드셰이크에 섞입니다.
이 가이드는 두 옵션을 설명하고 WireGuard VPS용으로 작동하는 서버 및 클라이언트 설정을 제공합니다. NAT와 DNS를 포함한 전체 VPN 설정은 WireGuard VPN 가이드를 참고하세요.
PersistentKeepalive = 25가 실제로 하는 일
WireGuard는 설계상 조용합니다. 데이터가 흐르지 않으면 아무것도 보내지 않습니다. 프라이버시와 배터리에는 좋지만, NAT와 연결 추적을 하는 라우터는 유휴 UDP 매핑을 버리며, 흔히 30초 후, 때로는 몇 분 후에 버립니다. 매핑이 사라지면 클라이언트가 다시 무언가를 보낼 때까지 서버의 패킷이 NAT 뒤의 클라이언트에 도달할 수 없습니다.
`PersistentKeepalive`는 초 단위 간격입니다. `25`로 설정하면 피어는 25초 동안 아무것도 보내지 않았을 때마다 암호화된 빈 keepalive를 보냅니다. 25는 가장 짧은 일반적인 UDP 타임아웃보다 안전하게 짧기 때문에 WireGuard 문서에서 권장하는 값입니다. 이 설정은 기본적으로 꺼져 있으며(`0`), 오버헤드는 피어당 약 25초마다 작은 패킷 하나입니다.
| 값 | 효과 | 사용 시기 |
|---|---|---|
| 0 또는 미설정 | keepalive 없음, 유휴 시 터널이 조용함 | 두 피어 모두 공인 IP가 있거나, 클라이언트만 트래픽을 시작하는 경우 |
| 25 | 유휴 25초마다 keepalive | 계속 도달 가능해야 하는 NAT 또는 CGNAT 뒤의 클라이언트 |
| 15–20 | 더 잦은 keepalive | UDP 타임아웃이 유난히 공격적인 네트워크 |
| 60+ | 패킷은 적지만 매핑 손실 위험이 큼 | 거의 유용하지 않음, 대부분의 NAT 장비는 더 빨리 타임아웃됨 |
어느 쪽에 PersistentKeepalive가 필요한가
직접 도달할 수 없는 피어, 즉 NAT 뒤에 있는 피어에 keepalive를 설정하세요. 그 피어가 바깥으로 패킷을 보내 자신의 NAT 매핑을 갱신합니다. 공인 IPv4 주소를 가진 VPS 앞에는 NAT가 없으므로 도달 가능성을 유지하는 데 이 옵션이 필요 없고, 클라이언트 엔드포인트를 클라이언트의 패킷으로만 알게 되므로 스스로 원격 NAT를 열어 둘 수도 없습니다.
클라이언트가 터널을 통해 브라우징만 한다면 트래픽을 보낼 때마다 즉시 다시 연결되므로 keepalive는 선택 사항입니다. 서버나 다른 피어가 클라이언트로 연결을 시작해야 할 때, 예를 들어 집 머신으로의 SSH, 모니터링, 사이트 간 링크에는 필요합니다.
- ▹NAT 뒤의 노트북이나 휴대폰에서 VPS로: 클라이언트에만 `PersistentKeepalive = 25`를 설정하세요.
- ▹공인 IP를 가진 VPS 간: 보통 설정하지 않습니다. [WireGuard 메시 가이드](/guides/wireguard-mesh-vps-cluster)를 참고하세요.
- ▹VPS를 통해 노출되는 CGNAT 뒤의 집 서버: 집 서버에 설정하세요. 그렇지 않으면 VPS가 몇 분 안에 경로를 잃습니다.
- ▹모바일 클라이언트: keepalive는 배터리를 다소 소모하므로, 기기가 도달 가능해야 할 때만 활성화하세요.
PresharedKey: 선택적 대칭 계층
WireGuard 핸드셰이크는 Curve25519 키 교환을 사용합니다. 충분히 큰 양자 컴퓨터는 이론적으로 그 교환을 깰 수 있으며, 공격자는 지금 트래픽을 기록해 두었다가 나중에 복호화할 수 있습니다. `PresharedKey`는 핸드셰이크에 256비트 대칭 키를 추가로 섞습니다. 그 크기의 대칭 키는 알려진 양자 알고리즘으로 현실적으로 깰 수 없다고 여겨지므로, PSK가 비밀로 유지되는 한 공개 키 부분이 깨지더라도 기록된 트래픽은 보호됩니다.
PSK는 피어 쌍마다 하나이며, 양쪽 피어의 `[Peer]` 섹션에서 동일해야 하고, 쌍마다 고유해야 합니다. 개인 키를 대체하지 않으며 추가 계층입니다. PSK가 일치하지 않으면 핸드셰이크가 조용히 실패하고 `wg show`에 `latest handshake`가 표시되지 않습니다.
- ▹`wg genpsk`로 생성하세요. 무작위 32바이트 키를 base64로 인코딩해 출력합니다.
- ▹SSH처럼 이미 신뢰하는 채널로 전달하고, 채팅이나 이메일로는 절대 보내지 마세요.
- ▹쌍마다 PSK 하나를 사용하세요. 노드 5개의 메시라면 서로 다른 PSK 10개입니다.
- ▹기기를 분실하거나 폐기하면 다른 비밀과 마찬가지로 교체하세요.
키와 PresharedKey 생성하기
Debian 12/13 또는 Ubuntu 24.04에서 `apt install wireguard`로 도구를 설치한 다음, 각 개인 키가 머물 머신에서 키를 생성하세요. PSK는 어느 쪽에서 생성해도 되며 다른 쪽으로 복사하면 됩니다. `umask 077`은 파일을 root만 읽을 수 있게 합니다.
umask 077
cd /etc/wireguard
# on the VPS
wg genkey | tee server.key | wg pubkey > server.pub
# on the client
wg genkey | tee client.key | wg pubkey > client.pub
# once, on either side; copy to the other over SSH
wg genpsk > client.pskVPS의 서버 설정: /etc/wireguard/wg0.conf
서버는 고정된 리슨 포트를 가지며, 클라이언트에 대한 keepalive와 `Endpoint`가 없습니다. 인증된 패킷으로 클라이언트의 현재 주소를 알게 되기 때문입니다.
[Interface]
Address = 10.8.0.1/24, fd08::1/64
ListenPort = 51820
PrivateKey = <contents of server.key>
[Peer]
# laptop
PublicKey = <contents of client.pub>
PresharedKey = <contents of client.psk>
AllowedIPs = 10.8.0.2/32, fd08::2/128Note · VPS 방화벽에서 UDP 51820을 열고 `systemctl enable --now wg-quick@wg0`으로 터널을 시작하세요. 다른 것을 노출하기 전에 SSH 강화 가이드대로 SSH를 잠그고, StrictModes 가이드로 키 권한을 확인하세요.
NAT 뒤의 클라이언트 설정
클라이언트는 VPS의 공인 주소를 가리키고 keepalive를 담당합니다. 사설 터널만 원하면 `AllowedIPs = 10.8.0.0/24, fd08::/64`를, 모든 트래픽을 VPS로 보내려면 `0.0.0.0/0, ::/0`을 사용하세요.
[Interface]
Address = 10.8.0.2/32, fd08::2/128
PrivateKey = <contents of client.key>
[Peer]
PublicKey = <contents of server.pub>
PresharedKey = <contents of client.psk>
Endpoint = 203.0.113.10:51820
AllowedIPs = 10.8.0.0/24, fd08::/64
PersistentKeepalive = 25Note · 전용 IPv4가 있는 NoctisNode Wisp VPS(1 vCPU, 1 GB RAM, 28일 주기당 $6)는 개인용 WireGuard 엔드포인트로 충분하며, 가입 시 이메일과 비밀번호만으로 Monero나 기타 크립토로 결제할 수 있습니다.
확인과 문제 해결
양쪽에서 `wg show`를 실행하세요. 정상적인 클라이언트는 해당 피어에 대해 최근의 `latest handshake`, `persistent keepalive: every 25 seconds`, `preshared key: (hidden)`을 표시합니다.
- 01.핸드셰이크가 전혀 없음: VPS에서 UDP 51820이 열려 있는지, `Endpoint`가 올바른 IP와 포트를 사용하는지 확인하세요.
- 02.PSK 없이는 핸드셰이크가 되지만 PSK를 넣으면 안 됨: 두 설정의 PresharedKey가 다릅니다. 다시 복사하세요.
- 03.터널이 작동하다가 1분 후 서버가 클라이언트에 도달하지 못함: 클라이언트에 `PersistentKeepalive = 25`를 추가하세요.
- 04.재시작 없이 keepalive 변경: `wg set wg0 peer <server-public-key> persistent-keepalive 25`.
- 05.실행 중에 파일에서 PSK 추가: `wg set wg0 peer <public-key> preshared-key /etc/wireguard/client.psk`.
FAQ
QWireGuard에서 PersistentKeepalive 25는 무슨 뜻인가요?
A다른 트래픽 없이 25초가 지나면 피어가 암호화된 keepalive 패킷을 보내게 합니다. 이를 통해 NAT와 방화벽 매핑이 열려 있어 상대편에서 터널에 계속 도달할 수 있습니다.
QPersistentKeepalive는 서버와 클라이언트 중 어디에 설정하나요?
ANAT 뒤에 있는 피어, 즉 거의 항상 클라이언트에 설정합니다. 공인 IP를 가진 VPS는 필요 없으며, 스스로 클라이언트의 NAT 매핑을 열어 둘 수도 없습니다.
QWireGuard PresharedKey는 필수인가요?
A아니요, 선택 사항입니다. Curve25519에 대한 미래의 양자 공격에 대비해 핸드셰이크에 대칭 비밀을 추가하므로, 오래 유지되는 터널에는 좋은 기본값입니다.
QWireGuard PresharedKey는 어떻게 생성하나요?
A`wg genpsk > peer.psk`를 실행하고 같은 값을 양쪽 피어의 `[Peer]` 섹션의 `PresharedKey` 줄에 넣으세요. 피어 쌍마다 다른 PSK를 사용하세요.
QPersistentKeepalive는 대역폭을 많이 쓰나요?
A아니요. 유휴 시간 약 25초마다 작은 패킷 하나를 보내므로 VPS에서는 무시할 수준이지만, 휴대폰에서는 배터리 수명이 약간 줄어들 수 있습니다.