배경

해외에 있다보면, 국내에서만 접근 가능한 사이트들이 있는데, VPN서비스들을 이용하자니, 개인 정보가 유출될 염려도 있어서, 가장 간단한 방법으로 VPN 구현

WireGuard 가 보안, 속도, 설치 난이도가 다른 VPN이나 proxy보다 쉬워서, 이걸로 진행

WireGuard를 선택한 이유

비교 항목 WireGuard OpenVPN IPSec
코드 라인 수 ~4,000줄 ~100,000줄 복잡
속도 매우 빠름 보통 보통
설정 난이도 쉬움 보통 어려움
암호화 최신 (ChaCha20) 선택 가능 선택 가능

WireGuard는 코드가 간결하여 보안 감사가 쉽고, 커널 레벨에서 동작하여 속도가 빠릅니다. 특히 모바일 환경에서 네트워크 전환(WiFi ↔ LTE) 시에도 연결이 끊기지 않는 점이 큰 장점입니다.

사전 준비

  • AWS EC2 인스턴스 (한국 리전: ap-northeast-2)
  • EC2 인스턴스에 SSH 접속 가능한 상태
  • 인스턴스의 보안 그룹에서 UDP 포트를 열 수 있는 권한

EC2 인스턴스는 t2.micro (프리 티어)로도 충분합니다. VPN 트래픽은 CPU를 거의 사용하지 않습니다.

WireGuard 설치 스크립트

curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh

sudo bash ./wireguard-install.sh

위에 실행 했을 때, amazon linux2에서 안되면, wireguard-install.sh 에서 OS="${ID}"OS="centos"로 변경 Amazon linux2가 ID_LIKE="centos rhel fedora" 로 centos 명령어도 작동하는 것으로 보임

설치 중 입력 항목

IPv4 or IPv6 public address: 입력할 때, 서버의 public ip를 입력할 것. 기본값으로 내부 ip가 설정됨

Server WireGuard port [1-65535]: 에서 입력한 포트를 security guard inbound에 UDP로 설정해줘야 함

Client name 은 형식 맞춰서 아무거나 입력해주면 됨

AWS 보안 그룹 설정

설치 스크립트에서 입력한 포트를 EC2 보안 그룹의 인바운드 규칙에 추가해야 합니다:

  • 유형: 사용자 지정 UDP
  • 포트 범위: 설치 시 입력한 포트 번호
  • 소스: 0.0.0.0/0 (모든 IP에서 접속 허용)

이 설정을 빠뜨리면 클라이언트에서 VPN 서버에 연결할 수 없습니다.

클라이언트 추가

이미 설치된 서버에 클라이언트를 추가하려면 스크립트를 다시 실행합니다:

sudo bash ./wireguard-install.sh

메뉴에서 “Add a new client”를 선택하면 새로운 클라이언트 설정 파일이 생성됩니다. 디바이스마다 별도의 클라이언트를 만들어 사용하는 것이 보안상 좋습니다.

클라이언트용 설정 파일 예시 (Android용)

Android 디바이스에 WireGuard를 설치하고, 파일 또는 압축파일로 불러오기로 추가해서, .conf파일을 추가한다.

.conf파일은 서버 환경 구축이 끝나면, 로그에 Your client config file is in xxx.conf 라고 찍히는데, 해당 파일을 다운 받아서, 추가해주면 됨.

대략 아래와 같은 형태

[Interface]
PrivateKey = (클라이언트의 개인키, client_private.key에서 복사)
Address = 10.0.0.2/32
DNS = 1.1.1.1

[Peer]
PublicKey = (서버의 공개키, server_public.key에서 복사)
Endpoint = (서버공인IP):(서버 설정시 port값)
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

설정 항목 설명

  • PrivateKey: 클라이언트의 비밀키. 절대 외부에 공유하면 안 됩니다.
  • Address: VPN 네트워크 내에서 이 클라이언트에 할당된 IP 주소
  • DNS: VPN을 통해 사용할 DNS 서버 (1.1.1.1은 Cloudflare DNS)
  • AllowedIPs: 0.0.0.0/0은 모든 트래픽을 VPN으로 라우팅한다는 의미입니다. 특정 IP만 VPN으로 보내려면 해당 IP 대역을 지정합니다.
  • PersistentKeepalive: NAT 뒤에 있는 클라이언트가 연결을 유지하기 위해 주기적으로 패킷을 보내는 간격(초)

다른 플랫폼에서 사용하기

WireGuard 클라이언트는 거의 모든 플랫폼에서 사용할 수 있습니다:

  • Android: Google Play에서 WireGuard 앱 설치
  • iOS: App Store에서 WireGuard 앱 설치
  • macOS: App Store 또는 brew install wireguard-tools
  • Windows: 공식 사이트에서 다운로드

모든 플랫폼에서 동일한 .conf 파일을 사용하거나 QR 코드로 설정을 가져올 수 있습니다.

트러블슈팅

VPN 연결은 되지만 인터넷이 안될 때

서버에서 IP 포워딩이 활성화되어 있는지 확인합니다:

sudo sysctl net.ipv4.ip_forward
# 결과가 0이면 활성화 필요
sudo sysctl -w net.ipv4.ip_forward=1

속도가 느릴 때

EC2 인스턴스의 네트워크 대역폭이 인스턴스 유형에 따라 제한됩니다. t2.micro는 기본 대역폭이 낮으므로, 더 높은 속도가 필요하면 인스턴스 유형을 업그레이드하세요.

연결 상태 확인

sudo wg show

이 명령어로 연결된 클라이언트, 마지막 핸드셰이크 시간, 전송된 데이터량 등을 확인할 수 있습니다.

끝~!