조회수: 0
목차
왜 직접 VPN 서버를 만들까?
VPN이라 하면 흔히 상용 VPN 서비스를 떠올리지만, 직접 VPN 서버를 만들면 다음과 같은 장점이 생긴다.
- 외부 어디서든 집이나 사무실 네트워크에 안전하게 접속
- 카페 와이파이 같은 불안한 환경에서도 암호화된 트래픽으로 접속
- 특정 국가 IP로 접속해야 하는 서비스에 자체 우회 경로 확보
- 트래픽·로그를 제3자에게 맡기지 않고 직접 관리
이때 가볍고 성능이 좋은 솔루션이 바로 WireGuard다. 커널 레벨에서 동작해 속도가 빠르고 설정 파일이 단순해서, 리눅스에서 개인 VPN을 시작할 때 배우기 좋다.
WireGuard 간단 개념 정리
WireGuard는 “인터페이스 하나 추가하는 느낌”으로 이해하면 편하다.
- 리눅스에
wg0같은 가상 네트워크 인터페이스를 만든다. - 이 인터페이스에 사설 IP(예: 10.0.0.1/24)를 할당한다.
- 서버와 클라이언트가 서로 공개키·개인키를 교환해 암호화 터널을 만든다.
- 터널을 통해 오가는 패킷은 WireGuard가 자동으로 암호화·복호화한다.
즉, 기존 네트워크 위에 하나의 “가상 사설망”을 얹는 구조다. 이 가상망에 접속한 기기끼리는 마치 같은 내부망에 있는 것처럼 통신할 수 있다.
기본 구성 한눈에 보기
이번 글에서 다루는 기본 구성을 정리하면 다음과 같다.
- 서버
- 리눅스 서버 1대 (예: Ubuntu 서버)
- WireGuard 설치
- VPN 내부 주소: 10.0.0.1/24
- 외부에서 접속할 포트: UDP 51820
- 클라이언트
- 노트북, PC, 스마트폰 등
- 각 클라이언트마다 WireGuard 설치
- VPN 내부 주소: 10.0.0.2, 10.0.0.3 … 식으로 부여
- 네트워크
- 공유기에서 서버로 UDP 51820 포트 포워딩
- 또는 클라우드 VPS 환경이라면 방화벽에서 51820/UDP 허용
이 구성을 기준으로 실제 명령어와 설정 파일을 만들어 보자.
준비물 정리
시작하기 전에 필요한 것들을 간단히 정리해보면 다음과 같다.
- 리눅스 서버 1대
- Ubuntu 20.04 이상 또는 비슷한 계열 배포판
- root 또는 sudo 권한
- 공인 IP 또는 포트포워딩 가능한 공유기
- 외부에서 서버의 51820/UDP 포트로 들어올 수 있어야 한다.
- 클라이언트 기기
- Windows, macOS, Linux, Android, iOS 등
- 각 플랫폼용 WireGuard 앱 설치 가능
- 기본적인 SSH 접속 및 리눅스 명령어 사용 능력
서버에 WireGuard 설치하기 (Ubuntu 기준)
배포판마다 명령어가 조금씩 다르지만, Ubuntu 기준 설치 예시는 다음과 같다.
sudo apt update
sudo apt install -y wireguard
커널 모듈이 제대로 올라와 있는지 확인하려면 다음 명령을 사용할 수 있다.
sudo modprobe wireguard
lsmod | grep wireguard
여기까지 문제 없다면 WireGuard 설치는 끝난 상태다.
서버 키 쌍 생성 및 기본 설정
WireGuard는 공개키·개인키 방식으로 통신한다. 먼저 서버에서 키를 생성한다.
cd /etc/wireguard
sudo umask 077
sudo wg genkey | tee server_private.key | wg pubkey > server_public.key
server_private.key는 서버의 개인키server_public.key는 서버의 공개키
두 파일 모두 권한을 조심해야 한다. 특히 개인키는 다른 곳에 노출되면 안 된다.
이제 서버 인터페이스 설정 파일 /etc/wireguard/wg0.conf를 만든다.
sudo nano /etc/wireguard/wg0.conf
예시 설정:
[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = 서버_개인키_내용_여기에_붙여넣기
# 리눅스에서 패킷 포워딩을 활성화하려면 나중에 PostUp/PostDown에 iptables 규칙을 추가할 수 있다.
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
여기서 eth0는 실제 인터넷으로 나가는 네트워크 인터페이스 이름이다. 서버마다 이름이 다를 수 있으니 ip a로 확인 후 맞게 수정한다.
IP 포워딩 활성화
VPN 클라이언트 트래픽을 외부 인터넷으로 내보내고 싶다면 서버에서 IP 포워딩을 켜야 한다.
sudo nano /etc/sysctl.conf
다음 항목을 추가하거나 주석을 해제한다.
net.ipv4.ip_forward=1
적용:
sudo sysctl -p
이제 WireGuard 인터페이스가 올라올 때 PostUp 규칙과 함께 NAT가 적용되면서, 클라이언트가 서버를 통해 인터넷으로 나갈 수 있다.
UFW 또는 방화벽 설정
UFW를 사용 중이라면 WireGuard 포트를 허용해야 한다. 예를 들어 UFW가 active 상태라면 다음처럼 입력한다.
sudo ufw allow 51820/udp
UFW를 쓰지 않고 iptables만 직접 사용하는 환경이라면 해당 포트에 대한 규칙을 따로 추가해주면 된다.
서버에서 WireGuard 인터페이스 올리기
이제 wg0 인터페이스를 올려 보자.
sudo wg-quick up wg0
상태 확인:
sudo wg
ip a show wg0
wg명령에서 서버의 Public Key, Listen Port 등 정보가 나온다면 정상ip a에서 10.0.0.1/24 주소를 가진wg0인터페이스가 보이면 준비 완료다
부팅 시 자동으로 올리려면 다음 명령을 사용한다.
sudo systemctl enable wg-quick@wg0
클라이언트 설정: 키 생성과 피어 등록
이제 클라이언트에서 WireGuard를 설정할 차례다. 클라이언트도 서버와 마찬가지로 공개키·개인키를 가진다.
리눅스 클라이언트 예시:
wg genkey | tee client1_private.key | wg pubkey > client1_public.key
생성된 client1_public.key를 서버에 알려줘야 한다. 서버의 /etc/wireguard/wg0.conf 파일에 클라이언트 피어 항목을 추가한다.
[Peer]
PublicKey = 클라이언트1_공개키
AllowedIPs = 10.0.0.2/32
AllowedIPs는 이 클라이언트에게 할당할 VPN 내부 IP- 여러 클라이언트를 사용할 경우 10.0.0.3/32, 10.0.0.4/32처럼 확장
수정 후 서버에서 인터페이스를 다시 올린다.
sudo wg-quick down wg0
sudo wg-quick up wg0
또는 sudo wg addconf를 사용할 수도 있지만, 기본 셋업 단계에서는 down/up가 이해하기 쉽다.
클라이언트 측 설정 파일 만들기
이제 클라이언트에서 사용할 설정 파일을 만들어보자. 예를 들어 client1.conf라는 이름으로 다음 내용을 작성한다.
[Interface]
PrivateKey = 클라이언트1_개인키
Address = 10.0.0.2/32
DNS = 1.1.1.1
[Peer]
PublicKey = 서버_공개키
Endpoint = 서버_공인IP또는도메인:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25
여기서 각 항목의 의미는 다음과 같다.
Address: 클라이언트가 VPN에서 사용할 사설 IPDNS: VPN 사용 시 사용할 DNS 서버Endpoint: 서버의 공인 IP나 도메인과 포트AllowedIPs = 0.0.0.0/0: 모든 트래픽을 VPN을 통해 보내겠다는 뜻 (스플릿 터널링을 원하면 필요한 대역만 넣으면 된다)PersistentKeepalive: NAT 환경에서 연결 유지용 패킷 주기 (초 단위)
클라이언트 OS마다 WireGuard 앱에서 이 설정 파일을 불러오는 방식은 다르지만 구조는 동일하다. 모바일 앱의 경우 QR 코드로 설정을 가져오는 기능도 있어 편리하다.
공유기 포트포워딩 설정
집이나 사무실의 리눅스 서버라면, 공유기에서 UDP 51820 포트를 서버 내부 IP로 포워딩해야 한다.
- 외부 포트: 51820 (UDP)
- 내부 IP: 예) 192.168.0.10
- 내부 포트: 51820 (UDP)
여기서 실수하기 쉬운 부분은 다음과 같다.
- 서버의 내부 IP가 DHCP로 바뀌었는데 포트포워딩은 옛 IP에 고정되어 있는 경우
- TCP로만 포워딩하고 UDP를 빼먹은 경우
- 공유기 자체 방화벽에서 WAN→LAN 트래픽을 추가로 막고 있는 경우
설정 후에는 LTE 같은 외부 네트워크에서 실제로 연결을 시도해 보는 것이 좋다.
동작 확인과 트러블슈팅
클라이언트에서 WireGuard 연결을 켠 뒤 기본적인 테스트를 해볼 수 있다.
- 서버 VPN IP로 ping
ping 10.0.0.1
- 서버에서 클라이언트 IP로 ping
ping 10.0.0.2
서로 잘 가면 터널 자체는 정상적으로 올라온 것이다.
인터넷까지 VPN으로 나가는 구성을 했다면, 웹 브라우저에서 IP 확인 사이트에 접속했을 때 서버의 공인 IP로 보이는지도 체크해 볼 수 있다.
접속이 안 될 때는 다음 순서를 따라가면 원인 좁히기에 도움이 된다.
- 서버
wg0인터페이스가 올라와 있는지 - 서버와 클라이언트의 공개키·개인키를 서로 잘 맞게 넣었는지
- AllowedIPs에 겹치는 대역이나 잘못된 주소가 없는지
- 공유기 포트포워딩과 방화벽 설정이 정확한지
- UFW 등 로컬 방화벽에서 UDP 51820을 허용했는지
보안과 운용 팁
WireGuard는 기본적으로 최신 암호화를 사용하지만, 운영 방식에서의 실수는 항상 조심해야 한다.
- 개인키 파일 권한 최소화
- root만 읽을 수 있도록 600 권한 유지
- 사용하지 않는 클라이언트는 피어 목록에서 제거
- 포트 스캔에 조금 더 안전하게 접근하려면 필요 시 방화벽에서 접속 허용 IP 대역을 제한
- 정기적으로
wg show로 연결 상태와 트래픽 양을 확인해 이상 징후 체크
또한 상용 VPN과 달리 트래픽·로그·접속자가 모두 자신의 책임이므로, 서버가 어떤 용도로 사용되는지 항상 인지하고 운영하는 것이 좋다.
마무리: 최소한의 설정으로 시작해 점진적으로 확장하기
리눅스에서 WireGuard로 VPN 서버를 직접 만드는 기본 흐름은 생각보다 단순하다.
- 서버에 WireGuard 설치
- 서버 키 쌍 생성 및
wg0.conf작성 - IP 포워딩·방화벽·포트포워딩 설정
- 클라이언트 키 생성과 설정 파일 작성
- ping과 간단한 트래픽 테스트로 검증
처음에는 한 대의 서버와 한 대의 클라이언트만 연결해 단순하게 시작하고, 이후 여러 기기, 여러 네트워크 대역, 스플릿 터널링, 도메인 연결 등으로 조금씩 확장해 나가면 부담 없이 안정적인 개인 VPN 환경을 구축할 수 있다.