✅ VPN 서버 설정
WireGuard 내부 대역: 10.100.0.0/24
EC2 VPC 대역: 10.1.0.0/16
EC2 설정 EC2 를 VPN 서버로 사용하기 위해서는 일단 Client 와 연결하기 위한 Port 가 오픈이 돼 있어야 합니다. Wireguard 는 51820 UDP 포트를 사용하므로 해당 포트를 통해 Client 가 접속할 수 있도록 보안 그룹 허용 목록에 추가해줍니다.
EC2 에 WireGuard 설치 Debian 계열 리눅스 sudo apt update sudo apt install wireguard -y wg --version
RHEL 계열 리눅스 sudo dnf install epel-release -y sudo dnf install wireguard-tools -y sudo modprobe wireguard lsmod | grep wireguard sudo pacman -S wireguard-tools
설치 확인 ❯ 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 077wg 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 077wg 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 서비스 시작 ❯ sudo wg-quick up wg0 [ [ [ [ [
❯ sudo wg show interface: wg0 public key: <SERVER_PUBLIC_KEY> private key: (hidden) listening port: 51820
시스템 서비스 추가 sudo systemctl enable wg-quick@wg0 sudo systemctl start wg-quick@wg0 sudo systemctl status wg-quick@wg0
✅ 클라이언트 설정 VPN 접속을 위해서는 EC2 에 외부 접속을 위한 Elastic IP 가 할당돼 있어야 합니다. VPN 이 설치된 EC2 인스턴스에서 퍼블릭 IP 가 있는지 확인합니다.
Full Tunnel AllowedIPs 를 0.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_KEYAddress = 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 = 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 패킷 도착 확인