나만의 VPN 서버 구축하기 (wireguard)

이런 저런 보안 관련 테스트를 하거나 무언가 민감한 글(?)이나 댓글을 작성할 때 내 IP를 노출하고 싶지 않은 경우가 있다. 그 때 노출 되는 IP가 해외의 IP라면 더 좋을 것이다. 그래서 많은 사람들이 해외 업체의 VPN 서비스를 유료로 사용하기도 한다.

나름 IT 밥을 먹고 있다고 자부하는 1인으로서 사람으로서 그런 유료 서비스보다는 직접 해외에 VPN 서버를 구축해 사용하고자 지금까지는 오라클 클라우드의 Free Tier 서비스에서 제공하는 OpenVPN 가상서버를 활용했다.

그런데 Free Tier 서비스이기 때문에 가상 CPU 1개와 1 G 램의 제한이 있다. 게다가 OpenVPN 서버는 무겁고 느리기로 유명하지 않은가? 역시나 이따금씩 답답하게 느린 경우가 많았다. 그래서 최근에 사용자가 급증하고 있다는 가볍고 빠른 WireGuard VPN 서버를 구성했다.

설치 준비

오라클 클라우드에 Ubuntu 24.04를 Minimal 버전으로 설치했다. 그리고 다음과 같이 리눅스 커널의 설정을 변경한다. /etc/sysctl.conf 파일을 vi 또는 nano 편집기로 연 다음 기본적으로 주석(#)으로 막혀있는 다음 라인의 주석을 제거하고 저장한다.

net.ipv4.ip_forward=1

그리고 변경한 설정을 다음 명령을 실행해 적용한다.

sudo sysctl -p

그런 다음 불필요한 IPTable 정책을 모두 삭제한다. 접근통제는 Oracle Cloud에서 제공하는 Security List로 충분하다. 개인적으로 사용할 것이므로 IPTable에 불필요한 정책을 적용해 OS의 자원을 사용할 필요는 없다.

$ sudo iptables -F

리부팅했을 때 파일에 저장되어 있던 iptable 정책이 로드되지 않도록 iptable 정책 파일을 삭제하거나 이름을 변경한다.

$ sudo mv /etc/iptables/rules.v4 /etc/iptables/rules.v4.org
$ sudo mv /etc/iptables/rules.v6 /etc/iptables/rules.v6.org

WireGuard VPN 서버 설치

이제 WireGuard 를 설치한다.

$ sudo apt update
$ sudo apt install wireguard -y

WireGuard 패키지는 정말 작고 가볍다. 설치할 때 설치되는 파일의 용량만 봐도 알 수 있다. 설치가 완료되면 WireGuard VPN 서버의 공개키와 개인키 쌍을 생성한다. 이제부터는 root 계정에서만 접근할 수 있는 경로에서 작업이 진행되므로 sudo su – 명령을 실행해 root로 스위치 유저 후 실행한다.

$ sudo su - 
# wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key

이 명령을 실행하면 화면에 WireGuard VPN 서버의 공개키와 개인키로 사용할 키 2개가 화면에 표시되는데 다음의 명령을 통해 키 쌍이 제대로 파일에 생성되어 있는지 확인한다. 혹시 생성되어 있지 않다면 화면에 표시된 키를 각각의 파일에 저장해준다.

# cat /etc/wireguard/privatekey
# cat /etc/wireguard/publickey

WireGuard 터널 Config 파일 작성

설치는 매우 간단하다. 이제 WireGuard 클라이언트(PC, 스마트폰 등)에서 VPN 서버에 접속하기 위한 포트의 설정, 접속 후 터널 인터페이스를 통해 인터넷 구간으로 나가기 위한 라우팅을 위한 설정 등 WireGuard의 설정 파일을 작성해야 한다.

먼저 라우팅 설정에 사용될 가상머신의 네트워크 인터페이스 정보를 확인한다.

$ ip addr

ens3 이 가상머신이 사용하는 네트워크 인터페이스(이더넷) 이름이다. 이 이름을 기억하자. 아래의 wg0은 다음에 나올 WireGuard 설정파일을 작성한 다음 wireguard 서비스를 구동하면 생성되는 VPN 터널에서 사용되는 인터페이스다.

다음 명령으로 wg0.conf 라는 파일을 작성한다.

sudo vi /etc/wireguard/wg0.conf

내용은 다음과 같다. PrivateKey 자리에는 앞에서 생성한 개인키(/etc/wireguard/server_private.key 파일에 저장한)를 복사하여 붙여넣기 한다.

Address는 ens3에 할당된 IP의 대역과 중복되지 않도록 다른 IP 대역을 선택해 지정해준다.

[Interface]
Address = 10.0.10.1/24    # VPN 네트워크(터널 네트워크)에서 사용할 VPN 서버의 IP 주소
PrivateKey = uGGB*****dS7lE=    # Server-Private-Key
ListenPort = 51890    # WireGuard VPN 서버가 접속을 기다리는 포트

# NAT 설정 (ens3은 서버의 내부 인터페이스)
PostUp = iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -o ens3 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.0.10.0/24 -o ens3 -j MASQUERADE

# 포워딩 허용 (앞에서 설정해줬으면 불필요함)
PostUp   = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

ListenPort는 오라클 클라우드의 Security List에서 차단하지 않도록 열어주어야 한다. 프로토콜은 UDP라는 점을 주의하자.


WireGuard 서비스 구동 및 부팅 시 자동시작 설정

이제 WireGuard 서비스를 구동하고 가상 머신을 리부팅 했을 때 자동으로 시작되도록 다음 명령을 실행한다.

$ sudo systemctl enable wg-quick@wg0
$ sudo systemctl start wg-quick@wg0

이것으로 WireGuard 서버는 설치가 완료되었다.

클라이언트에 WireGuard 설치

이제 WireGuard VPN 서버에 접속할 클라이언트에 WireGuard를 설치한다. Windows PC를 기준으로 설명한다.

먼저 다음의 URL에서 WireGuard를 다운로드 받아 설치한다.

https://www.wireguard.com/install

클라이언트의 개인키와 공개키 생성

설치한 WireGuard를 실행하면 처음엔 아무것도 없는 휑~한 화면이 반겨준다. 아래 화면은 WireGuard VPN 서버에 접속하기 위한 접속정보가 등록된 화면이다. 처음엔 이마저도 없는 휑~한 화면이 보인다.

아무런 VPN 터널ㄷ 등록되어 있지 않은 WireGuard 화면 아래의 “Add Tunnel” 옆의 누워있는 삼각형을 누르면 v표시되면 보이는 “Add Empty Tunnel…” 메뉴를 선택한다.

다음과 같이 공개키(Public Key)와 개인키(PrivateKey)를 생성해서 보여준다.

이 두 키를 메모장에 복사해두자. 그리고 이 키는 저장하지 않아도 된다. 나중을 위해 보관하고자 한다면 저장해두어도 된다. 이 두 개의 키 중에서 Public Key(공개키는 서버의 wg0.conf 파일에 [Peer] 로 등록해야 한다.


서버의 wg0.conf 파일에 클라이언트 Peer 등록

앞에서 리눅스 서버에 WireGuard를 설치하고 /etc/wg0.conf 파일에 WireGuard 서버 정보와 생성할 터널의 정보를 등록했다. 이제 앞에서 생성한 클라이언트의 Peer 정보를 다음 명령을 실행하여 wg0.conf 파일을 열고 다음과 같이 등록한다.

$ sudo vi /etc/wireguard/wg0.conf

wg0.conf 파일에 아래의 [Peer] 부터 3줄을 추가한다.

[Interface]
Address = 10.0.10.1/24
PrivateKey = uGGB9NKLELL****3MMGdS7lE=    # Server-Private-Key
ListenPort = 51890

# NAT 설정 (ens3은 서버의 내부 인터페이스)
PostUp = iptables -t nat -A POSTROUTING -s 10.0.10.0/24 -o ens3 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.0.10.0/24 -o ens3 -j MASQUERADE

# 포워딩 허용
PostUp   = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

# 아래 내용 추가.
[Peer]
PublicKey = 1eRC9K86YVv7***vpVlBoTGCBQ=   # 클라이언트의 공개키(Public Key)
AllowedIPs = 10.0.10.2/32       # 서버의 Address와 같은 IP대역에서 중복되지 않는 IP를 선택해 입력. 아래의 클라이언트의 접속정보에도 클라이언트의 주소는 동일하게 입력해야 함

클라이언트에 접속할 VPN 서버 정보 파일 작성

공개키와 개인키를 생성하고 서버에 클리언트(Peer)를 등록했다면 WireGuard VPN 서버에 접속할 때 사용될 접속 정보 파일을 작성해야 한다. 메모장이나 노트패드를 사용해 다음의 내용을 포함하는 텍스트 파일을 생성한다.

[Interface]
PrivateKey = Client_PrivateKey   # 바로 앞에서 생성해 메모장에 복사해 둔 두개의 클라이언트 키 중 개인키
Address = 10.0.10.2/32   # 서버의 wg0.conf 파일에 등록한 Peer의 Address와 동일하게 입력해야 함
DNS = 8.8.8.8

[Peer]  # 터널의 상대 즉 VPN 서버의 정보
PublicKey = Server_PublicKey  # 서버에서 wg 명령으로 생성한 두 개의 서버 키 중 공개키
Endpoint = 159.111.111.201:51890 # WireGuard가 설치된 서버에 할당된 공인IP 주소
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

Endpoint는 접속할 WireGauard VPN 서버의 공인IP 주소와 가상머신의 wg0.conf 파일에서 지정한 접속 포트를 써준다.

이 파일을 vpn.conf 와 같은 파일명으로 저장한 다음 PC에 설치한 WireGuard를 실행하고 “Add Tunnel”의 “Import tunnel(s) from file…” 메뉴를 클릭해서 읽어들이면 앞의 화면에서 처럼 “Activate” 버튼이 보인다.

이 Activate 버튼을 누르면 WireGuard VPN 서버에 접속되고 다음과 같이 화면이 바뀐다. 키를 생성할 때 만들어진 터널정보가 있다면 그 터널정보는 삭제해도 된다.

Edit 버튼을 누르면 작성했던 터널 접속정보가 보인다.


Wireguard VPN 인터넷 속도 테스트

OpenVPN이 설치된 VM(인스턴스)를 사용할 때는 웹 서핑 중에도 멈추다시피 하는 경우가 종종 발생했다. 그런데 Wireguard로 변경한 뒤 속도는 놀라울 정도로 빠르고 안정적이다.

OCI 무료 인스턴스로 구성한 Wireguard VPN 인터넷 속도
OCI 무료 인스턴스로 구성한 Wireguard VPN 인터넷 속도

속도 테스트 중의 화면이다.

직접 구축한 Wireguard VPN  서버의 인터넷 속도
직접 구축한 Wireguard VPN 서버의 인터넷 속도

이제 집에서 집의 IP를 노출하지 않고 인터넷을 항해할 수 있다.

*** 2026.03.01 추가 ***

Wrieguard 등 VPN은 L3(Network Layer)에서 동작하기 때문에 URL 또는 도메인 기준으로 IP를 선택적으로 노출되지 않게 할 수는 없다. 하지만 Proxy 방식은 L7(Application Layer)에서 동작하기에 구현이 가능하다. 그래서 SSH 터널 기반의 Proxy 서버를 구축하는 방법을 찾았다.

#sslvpn #wireguard #ip세탁

“나만의 VPN 서버 구축하기 (wireguard)”에 대한 3개 응답

    • 속도 테스트 결과를 추가하였습니다. Wireguard VPN 연결 후 속도도 잘 나오네요. ^^

    • 오~ 무료 오라클 서버에서 저 정도 나오면, 갠찮네요~ 감사합니다

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다