이 글에서는 리눅스 서버에 WireGuard VPN을 구축하는 과정을 단계별로 자세히 안내합니다. 이를 통해 카페나 공항처럼 보안이 취약한 환경에서도 안전하게 인터넷 리소스에 접속할 수 있습니다.
왜 VPN인가? 그리고 왜 하필 WireGuard일까?
외부 장소에서 은행 웹사이트에 접속하면, 비밀번호와 같은 민감한 정보가 네트워크를 도청하는 사람에게 노출될 위험이 있습니다.
다행히 은행 웹사이트 자체는 암호화되어 있기 때문에, 은행과 여러분의 PC 또는 스마트폰 사이를 오가는 핵심 데이터는 중간에서 가로채더라도 읽을 수 없습니다.
그렇다면 집이나 사무실에서 접속할 때는 어떨까요? VPN을 사용하면 일반적인 암호화로 보호되지 않는 데이터까지도 엉뚱한 사람에게 보이지 않도록 막을 수 있습니다.
하지만 공항이나 카페의 공용 WiFi 라우터를 통해 접속한다면 어떨까요? 그 네트워크가 이미 침해되지 않았다고 확신할 수 있습니까? 눈에 띄지 않게 지켜보고 있는 해커가 없다고 장담할 수 있을까요?
이러한 현실적인 위협에 대응하려면, 노트북이나 휴대폰에서 VPN 서버로 연결을 열면 됩니다. 이렇게 하면 모든 데이터 전송이 가상 터널을 통해 이루어지며, 접속한 로컬 네트워크상의 누구도 민감한 연결 내용을 볼 수 없습니다.
WireGuard는 오픈소스 VPN 분야의 3대 주자 중 가장 최근에 등장한 것으로, 나머지 둘은 IPsec과 OpenVPN입니다.
WireGuard는 기존 솔루션보다 더 단순하고, 빠르며, 유연하게 설계되었습니다. 업계의 신참이지만 빠르게 강력한 지지세를 얻었습니다. 리눅스 창시자 리누스 토발즈(Linus Torvalds)의 권유로 WireGuard는 최근 리눅스 커널에 공식 통합되었습니다.
VPN 서버는 어디에 구축해야 할까?
물론 집에서 VPN 서버를 직접 구축하고 ISP 라우터에 포트 포워딩을 설정할 수도 있습니다. 하지만 실용성 면에서는 클라우드에서 운영하는 편이 더 합리적인 경우가 많습니다.
걱정하지 마세요. 이 방법이 훨씬 간편한 '설정 후 잊기(set it and forget it)' 방식에 가깝다는 것을 보장합니다. 또한 집에서 직접 만든 서버가 AWS 같은 대형 클라우드 제공업체의 인프라만큼 안정적이거나 안전하지 않을 가능성이 높습니다.
다만, 집에 전문적으로 보안이 강화된 인터넷 서버가 있는 경우(또는 굴러다니는 예비 라즈베리 파이로 도전해 볼 용기가 있다면)에도 거의 같은 방식으로 진행할 수 있습니다.
WireGuard 덕분에 클라우드든 물리 서버든, 집에서 직접 VPN을 만드는 일은 그 어느 때보다 쉬워졌습니다. 전체 설정은 30분이면 충분합니다.
준비하기
먼저 클라우드 인스턴스를 가동하세요. 관련 튜토리얼을 참고하면 큰 도움이 됩니다.
51820 포트가 서버에 열려 있는지 확인하세요. AWS에서는 보안 그룹(Security Groups), Google Cloud에서는 VPC 네트워크 방화벽으로 설정할 수 있습니다.
최신 데비안/우분투 배포판에서는 다음과 같이 패키지 매니저로 WireGuard를 설치할 수 있습니다:
sudo apt install wireguardyum을 사용하는 경우 EPEL 저장소에서 설치합니다:
sudo yum install kmod-wireguard wireguard-tools1단계: 암호화 키 생성
서버에서 공개키와 개인키 파일을 담고 싶은 아무 디렉터리에서 다음 명령어를 실행합니다:
umask 077; wg genkey | tee privatekey | wg pubkey > publickey클라이언트에서도 다른 디렉터리 또는 로컬 머신에서 동일한 작업을 수행합니다. 나중에 서버와 클라이언트의 키 세트를 혼동하지 않도록 미리 구분해 두는 것이 중요합니다.
빠른 설정을 위해 온라인 키 생성기를 사용할 수도 있지만, 처음에는 수동으로 진행하는 것을 권장합니다. 다음 단계에서 사용할 것이므로 키 해시가 담긴 파일들이 제대로 생성되었는지 반드시 확인하세요.
2단계: 서버 설정 파일 작성
/etc/wireguard 디렉터리에 .conf 파일을 만들어야 합니다. 서로 다른 포트를 사용하면 여러 개의 VPN을 동시에 운영하는 것도 가능합니다.
새 파일에 다음 내용을 입력합니다:
sudo nano /etc/wireguard/wg0.conf[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
# 서버의 PrivateKey 사용
PrivateKey = GPAtRSECRETLONGPRIVATEKEYB0J/GDbNQg6V0s=
# 피어는 원하는 만큼 추가할 수 있습니다
# 아래 값들은 해당 피어의 PublicKey로 교체하세요
[Peer]
PublicKey = NwsVexamples4sBURwFl6HVchellou6o63r2B0s=
AllowedIPs = 10.0.0.2/32
[Peer]
PublicKey = NwsexampleNbw+s4sBnotFl6HrealxExu6o63r2B0s=
AllowedIPs = 10.0.0.3/32VPN 시작하기
sudo systemctl start wg-quick@wg0systemd가 없는 환경(예: Amazon Linux를 실행하는 인스턴스)이라면 sudo wg-quick up wg0을 사용하세요.
3단계: 클라이언트 설정 파일 작성
먼저 클라이언트 머신에 WireGuard를 설치합니다. 리눅스라면 서버와 같은 방식으로, Windows, macOS, Android, iPhone이라면 앱 스토어를 통해 설치하면 됩니다.
1단계에서 온라인 키 생성기나 QR 스크립트를 사용했다면, QR 코드를 스캔하는 것만으로 휴대폰을 연결할 수 있습니다.
클라이언트에 WireGuard가 설치되면 다음 값들로 설정합니다:
# PrivateKey 값을 클라이언트 인터페이스의 키로 교체하세요
[Interface]
Address = 10.0.0.2/24
ListenPort = 51820
PrivateKey = CNNjIexAmple4A6NMkrDt4iyKeYD1BxSstzer49b8EI=
# VPN 서버의 PublicKey와 클라우드 인스턴스의 Endpoint IP를 사용하세요
[Peer]
PublicKey = WbdIAnOTher1208Uwu9P17ckEYxI1OFAPZ8Ftu9kRQw=
AllowedIPs = 0.0.0.0/0
Endpoint = 34.69.57.99:51820용도에 따라 DNS 지정이나 추가 보안 계층을 위한 사전 공유 키(pre-shared key) 같은 선택적 옵션도 활용할 수 있습니다.
리눅스라면 서버와 같은 방식으로 클라이언트를 시작하고, 다른 OS라면 애플리케이션 자체에서 실행합니다.
VPN 테스트하기
브라우저에서 "my ip"를 검색해 공인 IP 주소를 확인하세요. VPN을 시작하기 전 컴퓨터의 주소와 다른 IP가 표시된다면 성공입니다!
(이전 주소를 잊어버렸다면 sudo systemctl stop wg-quick@wg0으로 VPN을 끈 뒤 확인하고 다시 시작해 보세요.)
문제 해결 가이드
서버에 IP 포워딩이 설정되어 있는지 확인하세요. /etc/sysctl.conf 파일을 살펴보거나 다음 명령어를 실행합니다:
echo 1 > /proc/sys/net/ipv4/ip_forward연결이 자주 끊기나요? 클라이언트 설정의 [Peer] 섹션에 다음 줄을 추가하세요:
PersistentKeepalive = 25원인을 알 수 없다면, 클라이언트를 사용하면서 서버에서 sudo tcpdump -i eth를 실행해 패킷 흐름을 확인해 보세요.
마무리
이 가이드를 읽어주셔서 감사합니다. 더 깊이 알아보고 싶다면 Manning의 유료 WireGuard VPN 강좌를 참고해 보세요.