EC2 를 이용한 WireGuard Full Tunnel 구성

✅ VPN 서버 설정

  • WireGuard 내부 대역: 10.100.0.0/24
  • EC2 VPC 대역: 10.1.0.0/16

EC2 설정

EC2 를 VPN 서버로 사용하기 위해서는 일단 Client 와 연결하기 위한 Port 가 오픈이 돼 있어야 합니다. Wireguard 는 51820 UDP 포트를 사용하므로 해당 포트를 통해 Client 가 접속할 수 있도록 보안 그룹 허용 목록에 추가해줍니다.

EC2 보안그룹 설정

EC2 에 WireGuard 설치

Debian 계열 리눅스

# 패키지 목록 업데이트
sudo apt update

# WireGuard 설치
sudo apt install wireguard -y

# WireGuard 버전 확인
wg --version

RHEL 계열 리눅스

# EPEL 저장소 추가
sudo dnf install epel-release -y

# WireGuard 설치
sudo dnf install wireguard-tools -y

# 커널 모듈 확인
sudo modprobe wireguard
lsmod | grep wireguard

# WireGuard 설치
sudo pacman -S wireguard-tools

설치 확인

# WireGuard 명령어 확인
which wg
/usr/bin/wg

which wg-quick
/usr/bin/wg-quick

# 커널 모듈 확인
❯ lsmod | grep wireguard
wireguard 118784 0
curve25519_x86_64 36864 1 wireguard
libchacha20poly1305 16384 1 wireguard
ip6_udp_tunnel 16384 1 wireguard
udp_tunnel 32768 1 wireguard
libcurve25519_generic 49152 2 curve25519_x86_64,wireguard

EC2 에 WireGuard 서버 설정

WireGuard 설정 파일에는 VPN 연결을 위한 Server 와 Client 의 키 정보가 필요합니다.

WireGuard 서버 키 쌍 생성

# 서버 비밀키 생성
umask 077
wg genkey | sudo tee server_private.key

# 서버 공개키 생성
sudo cat server_private.key | wg pubkey | sudo tee server_public.key

# 키 확인
sudo cat server_private.key
sudo cat server_public.key

클라이언트 키 쌍 생성

# 클라이언트 비밀키 생성
umask 077
wg genkey | sudo tee client_private.key

# 클라이언트 공개키 생성
sudo cat client_private.key | wg pubkey | sudo tee client_public.key

# 키 확인
sudo cat client_private.key
sudo cat client_public.key

서버 네트워크 인터페이스 확인

❯ ip route | grep default

default via 10.1.0.1 dev ens5 proto dhcp src 10.1.9.228 metric 100

서버 설정 파일 생성

/etc/wireguard/ 경로의 wg0.conf 파일에 아래 내용을 추가해줍니다.

/etc/wireguard/wg0.conf
[Interface]
# 서버의 VPN IP 주소
Address = 10.100.0.1/24
# 서버가 리스닝할 포트
ListenPort = 51820
# 서버 비밀키 (server_private.key의 내용)
PrivateKey = <SERVER_PRIVATE_KEY>

PostUp = sysctl -w net.ipv4.ip_forward=1
PostDown = sysctl -w net.ipv4.ip_forward=0

PostUp = iptables -A FORWARD -i %i -j ACCEPT
PostUp = iptables -A FORWARD -o %i -j ACCEPT
PostDown = iptables -D FORWARD -i %i -j ACCEPT
PostDown = iptables -D FORWARD -o %i -j ACCEPT

# PostUp/PostDown: 방화벽 규칙 설정 (ens5 를 실제 인터페이스명으로 변경, eth0 일 수 있음)
PostUp = iptables -t nat -A POSTROUTING -s 10.100.0.0/24 -o ens5 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -s 10.100.0.0/24 -o ens5 -j MASQUERADE

# 클라이언트 1
[Peer]
# 클라이언트 공개키
PublicKey = <CLIENT_PUBLIC_KEY>
# 클라이언트에게 할당할 IP
AllowedIPs = 10.100.0.2/32

# # 클라이언트 2
# [Peer]
# PublicKey = <CLIENT2_PUBLIC_KEY>
# AllowedIPs = 10.100.0.3/32

WireGuard 서비스 시작

# WireGuard 인터페이스 시작
❯ sudo wg-quick up wg0

[#] ip link add wg0 type wireguard
[#] wg setconf wg0 /dev/fd/63
[#] ip -4 address add 10.100.0.1/24 dev wg0
[#] ip link set mtu 8921 up dev wg0
[#] iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
# 상태 확인
❯ sudo wg show

interface: wg0
public key: <SERVER_PUBLIC_KEY>
private key: (hidden)
listening port: 51820

시스템 서비스 추가

# 부팅 시 자동 시작 설정
sudo systemctl enable wg-quick@wg0

# systemd로 서비스 관리
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0

✅ 클라이언트 설정

VPN 접속을 위해서는 EC2 에 외부 접속을 위한 Elastic IP 가 할당돼 있어야 합니다. VPN 이 설치된 EC2 인스턴스에서 퍼블릭 IP 가 있는지 확인합니다.

EC2 Elastic IP 확인

Full Tunnel

AllowedIPs0.0.0.0/0 로 설정하게 되면 Full Tunnel 상태로 모든 트래픽이 VPN 으로 향하게 됩니다.

[Interface]
PrivateKey = <CLIENT_PRIVATE_KEY>
Address = 10.100.0.2/32
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <EC2_PUBLIC_IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

특정 IP 대역만 VPN을 통해 통신하도록 설정하려면, AllowedIPs 에 해당 IP 대역을 명시하면 됩니다. 이렇게 설정하면 지정한 IP 대역의 트래픽만 VPN을 경유하고, 그 외 트래픽은 기존 네트워크 경로를 그대로 사용하게 됩니다.

[Interface]
PrivateKey = CLIENT_PRIVATE_KEY
Address = 10.100.0.2/32
DNS = 1.1.1.1, 8.8.8.8

[Peer]
PublicKey = <SERVER_PUBLIC_KEY>
Endpoint = <EC2_PUBLIC_IP>:51820

# 특정 네트워크만 VPN으로 라우팅
AllowedIPs = 10.10.0.0/16

PersistentKeepalive = 25

5. 문제 발생

  • VPN 연결은 성공
  • 라우팅도 정상
  • 하지만 인터넷 불가
  • wg show에 handshake 없음

6. NAT 확인

iptables -t nat -S POSTROUTING

-P POSTROUTING ACCEPT
-A POSTROUTING -s 10.100.0.0/24 -d 10.1.0.0/20 -j MASQUERADE
-A POSTROUTING -s 10.100.0.0/24 -o ens5 -j MASQUERADE

불필요한 eth0 룰 제거:

iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

7. tcpdump로 패킷 확인

tcpdump -ni ens5 udp port 51820

→ UDP 패킷 도착 확인

Share