본문으로 건너뛰기
50% 할인 모든 플랜, 기간 한정. 시작 가격 $2.48/mo
12 min left
보안 및 네트워킹

VPS에 WireGuard VPN 설정하는 방법

Pius Bodenmann 작성자 Pius Bodenmann 12 분 분량 업데이트: Mir 22d ago
WireGuard VPN tunnel active on an Ubuntu VPS terminal and a phone client

직접 호스팅하는 WireGuard VPN은 노트북과 휴대폰에 사용자가 제어하는 서버로 향하는 암호화된 경로를 제공합니다. 고정 출구 IP가 필요하거나, 신뢰할 수 없는 Wi-Fi에서 안전하게 접속하거나, 다른 네트워크로 가는 사설 경로가 필요할 때 유용합니다. 익명성을 보장하지는 않습니다. 웹사이트는 여전히 하나의 VPS 주소를 보고, 호스팅 업체는 여전히 기반 네트워크를 운영합니다.

이 가이드는 Ubuntu Server에서 IPv4 전체 터널 VPN을 구축합니다. WireGuard를 설치하고, 제한적인 권한으로 키를 생성하고, 라우팅을 활성화하고, 방화벽과 NAT 규칙을 추가하고, 데스크톱과 모바일 클라이언트를 연결한 뒤 터널을 검증합니다. 같은 구조로 IPv6도 지원할 수 있지만, VPS에 라우팅된 IPv6 대역이 있고 IPv6 포워딩과 방화벽 규칙을 별도로 구성한 뒤에만 가능합니다.

WireGuard란 무엇인가?

WireGuard는 암호화된 IP 패킷을 UDP로 전달하는 현대적인 크로스 플랫폼 VPN 프로토콜이자 구현체입니다. WireGuard 프로토콜 명세 이 명세는 ChaCha20-Poly1305, Curve25519, BLAKE2s, SipHash24, HKDF를 포함한 고정된 암호 프리미티브 집합을 정의합니다. 의도적으로 작게 설계한 덕분에 교체 가능한 암호 스위트가 많은 프로토콜보다 설정과 감사가 간단합니다.

WireGuard에는 중앙 계정 시스템이나 내장 사용자 디렉터리가 없습니다. 각 기기는 자체 키 쌍, 터널 주소, AllowedIPs 규칙을 가진 피어입니다. VPS에서는 보통 한 피어가 인터넷을 향한 게이트웨이 역할을 하고, 노트북과 휴대폰이 그쪽으로 연결을 시작합니다.

왜 VPS에서 WireGuard를 사용할까?

  • 단순한 피어 모델: 각 기기는 키 쌍 하나와 피어 항목 하나를 갖습니다.
  • 작은 공격 표면: WireGuard는 오래된 옵션을 길게 늘어놓는 대신, 간결한 프로토콜과 고정된 암호 스위트를 사용합니다.
  • 우수한 성능: Linux의 커널 통합과 효율적인 암호화는 높은 처리량을 낼 수 있지만, 결과는 여전히 CPU, 네트워크 용량, 지연 시간, 패킷 크기에 좌우됩니다.
  • 크로스 플랫폼 클라이언트: Windows 10과 11, macOS, Android, iOS용 공식 클라이언트가 있으며, Linux와 여러 BSD 계열은 네이티브 도구나 패키지를 제공합니다.
  • 로밍: 피어는 새로운 WireGuard 신원을 발급받지 않고도 네트워크와 출발지 IP를 바꿀 수 있습니다. 서버가 가장 최근에 인증된 엔드포인트를 학습합니다.
  • 명확한 라우팅 제어: AllowedIPs는 어떤 목적지가 터널을 사용할지와, 어떤 터널 주소가 각 피어에 속하는지를 함께 결정합니다.

함께 읽어보기: VPN용 VPS에 대한 Cloudzy 가이드. 오래된 환경이라면 다음을 참고하세요: Cloudzy의 PPTP 설정 가이드. 보안이 중요한 새 VPN에는 PPTP를 선택하지 마세요.

수동 설치 건너뛰기: 원클릭 WireGuard

기술적 배경이 없거나 직접 설치하고 싶지 않다면, Cloudzy가 원클릭 WireGuard VPN 배포를 제공합니다. 이 가이드의 나머지는 수동 구축을 다루고, 이 섹션은 지름길을 다룹니다.

  1. Cloudzy 제어판에 로그인합니다.
  2. 애플리케이션 목록에서 WireGuard를 선택합니다.
  3. 원하는 위치에 원하는 요금제로 VPS를 생성합니다. 기본 사양의 Ubuntu 머신이면 충분합니다.

VPS가 준비되면 로그인한 뒤 다음 명령을 실행해 설정을 확인합니다:

cat client.conf

다음과 같은 내용이 표시됩니다:

Terminal output of cat client.conf on a one-click WireGuard VPS, showing the Interface and Peer blocks with the keys and endpoint redacted

이 설정으로 PC의 WireGuard 클라이언트에서 새 터널을 만들면 연결이 준비됩니다. 모든 구성 요소를 직접 이해하고 싶거나, 원클릭 이미지가 다루지 않는 구조가 필요하다면 아래 수동 구축으로 이어가세요.

Ubuntu에서 WireGuard 설정하는 방법

Six-step WireGuard setup cycle around a VPS: install, generate keys, configure wg0 with 10.8.0.1/24, enable forwarding between wg0 and eth0, add firewall and NAT rules on UDP 51820, then start and verify the interface

아래 명령은 최신 Ubuntu Server 릴리스를 기준으로 합니다. sudo 권한이 있는 사용자로 SSH를 통해 실행하세요. 방화벽이 확인될 때까지 SSH 세션을 열어 두고, 제공업체가 지원한다면 먼저 VPS 스냅샷을 만들어 두세요.

필수 조건

  • 공인 IPv4 주소를 가진 Ubuntu VPS 한 대
  • sudo 권한이 있는 비root 계정
  • SSH 접속 권한과 VPS 제공업체의 복구 콘솔 정보
  • 공식 WireGuard 앱이나 명령줄 도구를 갖춘 클라이언트 기기 한 대

두 번째 Ubuntu 서버는 필요 없습니다. 클라이언트는 Windows PC, Mac, Linux 노트북, Android 폰, iPhone 어느 것이든 가능합니다.

1단계: WireGuard 설치

sudo apt update
sudo apt install wireguard -y

도구가 사용 가능한지 확인합니다:

wg --version

2단계: 서버 키를 안전하게 생성

WireGuard 디렉터리를 만들고 제한적인 umask로 키 쌍을 생성합니다. 개인 키는 절대 클라이언트로 복사하거나 로그에 남겨서는 안 됩니다.

sudo install -d -m 700 /etc/wireguard
sudo sh -c 'umask 077; wg genkey > /etc/wireguard/server.key; wg pubkey < /etc/wireguard/server.key > /etc/wireguard/server.pub'

설정 파일에 붙여 넣어야 할 때 키를 출력합니다:

sudo cat /etc/wireguard/server.key
sudo cat /etc/wireguard/server.pub

3단계: 서버 설정 만들기

인터페이스 설정 파일을 엽니다:

sudo nano /etc/wireguard/wg0.conf

다음 블록을 붙여 넣고 SERVER_PRIVATE_KEY를 이전 단계의 개인 키로 바꿉니다:

[Interface]
Address = 10.8.0.1/24
ListenPort = 51820
PrivateKey = SERVER_PRIVATE_KEY

10.8.0.0/24 터널 네트워크는 예시일 뿐입니다. 접근해야 하는 가정, 사무실, 클라우드 네트워크와 겹친다면 다른 사설 대역을 고르세요. SaveConfig = true는 추가하지 마세요. 인터페이스가 내려갈 때 파일을 다시 쓰면서 직접 편집한 내용을 지울 수 있습니다.

sudo chmod 600 /etc/wireguard/wg0.conf

4단계: IPv4 포워딩 활성화

VPS는 wg0과 공용 네트워크 인터페이스 사이에서 패킷을 라우팅해야 합니다. 이 설정은 전용 sysctl 파일에 넣으세요:

sudo nano /etc/sysctl.d/70-wireguard-routing.conf
net.ipv4.ip_forward = 1

적용한 뒤 확인합니다:

sudo sysctl -p /etc/sysctl.d/70-wireguard-routing.conf
sysctl net.ipv4.ip_forward

이는 다음 문서의 라우팅 모델을 따릅니다: Ubuntu의 WireGuard 게이트웨이 가이드. IPv6에는 라우팅된 IPv6 프리픽스, 별도의 터널 주소, IPv6 포워딩, IPv6 방화벽 규칙이 필요합니다. 그 경로가 완성되기 전에는 클라이언트 트래픽을 ::/0으로 보내지 마세요.

5단계: 방화벽 및 NAT 규칙 추가

VPS의 공용 인터페이스 이름을 확인하세요. 아래 출력에서 dev 뒤의 값을 보면 됩니다. 흔한 이름으로는 eth0, ens3, enp1s0이 있습니다.

ip route show default

wg0.conf를 다시 열고 [Interface] 아래에 다음 줄을 추가합니다. 공용 인터페이스 이름이 다르다면 eth0을 모두 바꿔 주세요:

PostUp = iptables -I FORWARD 1 -i %i -o eth0 -j ACCEPT; iptables -I FORWARD 1 -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE
PreDown = iptables -D FORWARD -i %i -o eth0 -j ACCEPT; iptables -D FORWARD -i eth0 -o %i -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT; iptables -t nat -D POSTROUTING -s 10.8.0.0/24 -o eth0 -j MASQUERADE

UFW가 활성 상태라면 상태를 건드리기 전에 SSH를 먼저 허용한 다음, WireGuard UDP 포트를 엽니다:

sudo ufw allow OpenSSH
sudo ufw allow 51820/udp
sudo ufw status

UFW가 지금 비활성 상태이고 켜고 싶다면, 먼저 OpenSSH 규칙이 있는지 확인하세요. 단지 이 규칙들을 적용하려고 SSH로 UFW를 껐다 켜지 마세요. 피할 수 있는 접속 차단 위험이 생깁니다.

6단계: WireGuard 인터페이스 시작

sudo systemctl enable --now wg-quick@wg0
sudo systemctl status wg-quick@wg0 --no-pager
sudo wg show

서비스가 실패하면 다른 것을 바꾸기 전에 journalctl부터 실행하세요:

sudo journalctl -u wg-quick@wg0 -n 50 --no-pager

WireGuard 클라이언트 추가

A VPS at 10.8.0.1/32 holding separate peer entries for a laptop, tablet, and phone, each with its own keypair and /32 tunnel address, its private key staying on the device, and a QR code marked as containing a private key

모든 기기에는 고유한 키 쌍과 터널 IP가 필요합니다. 하나의 클라이언트 설정을 두 기기에 재사용하지 마세요. 키와 주소가 중복되면 라우팅을 예측할 수 없게 되고, 깔끔한 폐기도 불가능해집니다.

1단계: 클라이언트 키 생성

공식 데스크톱 및 모바일 앱은 빈 터널을 만들 때 키를 생성할 수 있습니다. Linux 클라이언트에서는 다음을 사용하세요:

umask 077
wg genkey | tee client.key | wg pubkey > client.pub

client.key는 해당 기기에 그대로 두세요. 서버에는 client.pub만 복사합니다.

2단계: 서버에 피어 추가

sudo nano /etc/wireguard/wg0.conf

피어 블록을 하나 추가합니다. CLIENT_PUBLIC_KEY를 클라이언트의 공개 키로 바꾸세요:

[Peer]
PublicKey = CLIENT_PUBLIC_KEY
AllowedIPs = 10.8.0.2/32

Address = 10.8.0.2/32 줄은 클라이언트 쪽 터널 주소를 지정합니다. 서버의 [Peer] 블록에서 AllowedIPs = 10.8.0.2/32는 라우팅과 출발지 검증을 위해 그 주소를 이 피어와 연결합니다. 다음 기기에는 10.8.0.3/32를 쓰고, 중복 없이 위로 이어가세요.

sudo systemctl restart wg-quick@wg0

3단계: 클라이언트 설정 만들기

클라이언트에서 client.conf를 만들고 모든 자리표시자를 바꿉니다:

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.8.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = VPS_PUBLIC_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0으로 두면 IPv4 전체 터널이 됩니다. VPN 네트워크에만 접근하려면 AllowedIPs = 10.8.0.0/24를 쓰세요. PersistentKeepalive는 NAT 뒤에 있으면서 유휴 상태에도 매핑이 유지되어야 하는 클라이언트에 유용합니다. WireGuard 빠른 시작 가이드 빠른 시작 가이드는 대부분의 피어에는 이 설정이 필요 없다고 설명합니다.

4단계: 설정 가져오기

사용 WireGuard 클라이언트 설치 가이드 를 참고해 사용 중인 플랫폼에 맞는 지원 클라이언트를 받으세요.

  • Windows: Add Tunnel을 선택한 뒤 client.conf를 가져옵니다.
  • macOS: Import tunnel(s) from file을 선택하고 client.conf를 고릅니다.
  • Android 또는 iOS: 파일을 가져오거나, 그 파일로 만든 QR 코드를 스캔합니다.

client.conf가 있는 Ubuntu 또는 Debian 클라이언트에서 qrencode를 설치하고 해당 클라이언트의 터미널에 파일을 출력합니다:

sudo apt install qrencode -y
qrencode -t ansiutf8 < client.conf

QR 코드에는 클라이언트의 개인 키가 들어 있습니다. 신뢰할 수 있는 터미널에서만 표시하고, 스크린샷을 저장하지 말고, 휴대폰이 가져온 뒤에는 터미널을 지우세요.

5단계: 터널 검증

터널을 활성화하고 클라이언트에서 트래픽을 발생시킨 뒤, VPS에서 다음을 확인합니다:

sudo wg show
ip -brief address show wg0

최근 핸드셰이크와 증가하는 전송 카운터는 WireGuard가 패킷을 주고받고 있다는 뜻입니다. 그다음 클라이언트에서 전체 터널 출구를 확인하세요:

curl -4 https://api.ipify.org; echo

이 명령은 VPS의 공인 IPv4 주소를 반환해야 합니다. 핸드셰이크가 없다면 엔드포인트 주소, UDP 포트, 클라우드 방화벽, UFW 규칙, 키를 확인하세요. 핸드셰이크는 되는데 인터넷이 안 된다면 IP 포워딩, 공용 인터페이스 이름, NAT 규칙, DNS를 확인하세요.

WireGuard를 Nginx 뒤에 둘 수 있을까?

원격 NGINX stream 모듈 문서 NGINX가 UDP를 한 포트에서 다른 포트로 중계하는 방법을 설명합니다. 즉 UDP/80이나 UDP/443을 UDP/51820의 WireGuard로 전달할 수 있습니다. 이는 UDP 중계일 뿐 HTTP 리버스 프록시가 아닙니다. WireGuard를 TCP나 HTTPS로 바꾸지도 않고, 프로토콜을 평범한 웹 트래픽처럼 보이게 만들지도 않습니다.

대부분의 배포에서는 WireGuard의 ListenPort를 바꾸고 해당 UDP 포트를 여는 편이 NGINX를 추가하는 것보다 간단합니다. 어떤 네트워크가 UDP를 통째로 차단하거나 심층 패킷 검사를 사용한다면, NGINX UDP 중계로는 문제가 해결되지 않습니다. WireGuard 제약 사항 문서 WireGuard 제약 사항 문서는 난독화가 프로토콜의 범위를 벗어난다고 명시합니다.

VPS를 홈 네트워크에 연결하기

A VPS hub relaying a roaming laptop and phone to a home gateway over WireGuard, with full-tunnel 0.0.0.0/0 and split-tunnel 192.168.1.0/24 paths, PersistentKeepalive on the home peer, and a warning that two overlapping 192.168.1.0/24 networks cannot route cleanly

VPS는 이동 중인 클라이언트와 집 안의 기기 사이에서 허브 역할을 할 수 있습니다. 집 쪽 피어가 VPS로 나가는 WireGuard 연결을 먼저 맺기 때문에, 집에 공인 IP가 없어도 됩니다. 그 집 쪽 피어가 NAT 뒤에 있다면 PersistentKeepalive를 설정하세요.

집 안 LAN 전체에 닿으려면 피어를 하나 추가하는 것만으로는 부족합니다. 홈 게이트웨이에 해당하는 VPS 쪽 피어 항목의 AllowedIPs에 192.168.1.0/24 같은 홈 서브넷이 들어가야 합니다. 전체 터널(AllowedIPs = 0.0.0.0/0)을 쓰는 원격 클라이언트는 이미 그 서브넷 트래픽을 VPS로 보냅니다. 클라이언트에 192.168.1.0/24를 추가하는 것은 분할 터널링을 쓸 때뿐입니다. 홈 게이트웨이도 WireGuard와 LAN 사이에서 트래픽을 전달해야 합니다. 가정용 라우터에 경로를 추가하거나, 홈 게이트웨이에 범위를 신중히 좁힌 NAT 규칙을 추가하세요. 먼저 겹침 여부를 확인하세요. 또 다른 192.168.1.0/24 네트워크에 연결된 클라이언트는 주소를 다시 매기거나 더 고급 정책 라우팅을 쓰지 않고서는 두 네트워크를 깔끔하게 라우팅할 수 없습니다.

직접 호스팅하는 WireGuard vs. 상용 VPN

직접 호스팅한다고 해서 VPN 운영 주체가 바뀔 뿐, 익명성이 저절로 좋아지지는 않습니다. 개인 VPS는 고정된 출구 IP 하나를 주는데, 이는 호스팅 네트워크와 연결 짓기 쉽습니다. 상용 서비스는 보통 공유 출구 주소와 손쉬운 위치 전환을 제공하지만, 그 업체의 정책과 운영, 그리고 공개된 독립 감사 결과에 의존해야 합니다.

WireGuard 자체는 가볍고, 작은 VPS도 한 사람과 기기 몇 대에는 대체로 합리적인 출발점입니다. 특정 RAM이나 vCPU 수치를 처리량 보장으로 여기지 마세요. 실제 기기 수, 지역, 패킷 크기, 예상 대역폭으로 테스트한 뒤 CPU 포화나 패킷 손실, 지연이 한계가 되면 사양을 올리세요.

고정된 개인 출구 IP, 원격 접속, 서버 통제권이 위치 선택이나 편의성보다 중요하다면 직접 호스팅을 고르세요. 여러 국가, 공유 출구, 폭넓은 소비자 기기 지원, 그리고 장애를 대신 처리해 줄 곳을 원한다면 상용 VPN을 고르세요.

판단 기준직접 호스팅한 WireGuard상업용 VPN
비용 모델서버 한 대와 직접 들이는 관리 시간구독제, 장기 약정 시 할인되는 경우가 많음
출구 위치서버당 한 곳앱에서 다양한 위치 선택 가능
설치키, 라우팅, 방화벽 규칙, 클라이언트를 직접 설정앱을 설치하고 로그인
유지보수패치, 모니터링, 백업, 문제 해결을 직접 수행서비스는 제공업체가 운영
프라이버시 모델서버는 내가 통제하지만, 호스팅 업체는 여전히 메타데이터를 볼 수 있음제공업체의 정책과 공개된 독립 감사 결과에 의존
최적 선택고정된 개인 출구 IP, 원격 접속, 인프라 통제위치 전환, 적은 유지보수, 폭넓은 기기 지원

결론

믿을 만한 WireGuard 배포는 결국 다섯 가지로 요약됩니다. 보호된 개인 키, 겹치지 않는 피어 주소, 올바른 AllowedIPs, 제대로 동작하는 포워딩과 NAT, 그리고 수신 UDP 포트를 여는 방화벽 규칙입니다. 터널을 신뢰하기 전에 핸드셰이크와 공인 출구 주소를 모두 확인하고, 배포 후에도 VPS에 패치를 계속 적용하세요.

서버를 직접 구축하고 싶다면, 깨끗한 Cloudzy Ubuntu VPS 솔루션. 설치 단계를 건너뛰고 싶다면 Cloudzy의 원클릭 WireGuard 배포 를 이용해 곧바로 클라이언트 설정과 검증으로 넘어가세요.

자주 묻는 질문

WireGuard에 피어는 보이는데 핸드셰이크가 없는 이유는?

피어 항목이 있다는 건 설정이 읽혔다는 뜻일 뿐입니다. 핸드셰이크가 없다면 대개 클라이언트가 서버에 닿지 못했거나 키가 맞지 않는 것입니다. 클라이언트의 Endpoint, 서버의 공인 IP, 제공업체 방화벽과 UFW 양쪽의 UDP/51820, 그리고 양측 공개 키를 확인하세요. 확인 전에 클라이언트에서 트래픽을 발생시켜야 합니다. WireGuard는 유휴 상태에서는 조용하기 때문입니다.

터널은 연결되는데 인터넷이 끊기는 이유는?

핸드셰이크는 되는데 인터넷이 안 된다면 대개 암호화가 아니라 라우팅 문제입니다. net.ipv4.ip_forward를 확인하고, NAT 규칙의 공용 인터페이스 이름이 맞는지 확인하고, FORWARD 규칙을 점검하고, DNS를 순수 IP 연결과 분리해서 테스트하세요. 또한 클라이언트의 AllowedIPs가 의도한 전체 터널 또는 분할 터널 구성과 일치하는지도 확인하세요.

두 기기가 하나의 WireGuard 설정을 함께 쓸 수 있을까?

안 됩니다. 모든 기기에 각자의 개인 키, 공개 키, /32 터널 주소를 부여하세요. 설정을 재사용하면 엔드포인트와 경로가 충돌하고, 분실한 기기 하나만 폐기하려 해도 다른 기기까지 끊어야 합니다.

모든 클라이언트에 PersistentKeepalive가 필요할까?

아닙니다. NAT 뒤에 있는 피어가 유휴 시간에도 매핑을 열어 두어야 할 때 추가하세요. 휴대폰, 홈 게이트웨이, 일부 제한적인 네트워크에서 흔한 경우입니다. 피어가 자주 통신하거나, 유휴 상태에서 상대 쪽이 먼저 연결할 필요가 없다면 넣지 마세요.

공유

블로그 더 보기

계속 읽기.

배포할 준비가 되셨나요? 월 $2.48부터.

2008년부터 독립 클라우드. AMD EPYC, NVMe, 40 Gbps. 14일 환불 보장.