모두를 위한 VPN 서버 구축하기

Minseo Lim·2025년 8월 5일
post-thumbnail

VPN 서버를 구축하는 날이 오는구나...

왜 VPN 같은거 만듬?

그래 왜 만드냐 하면... 나는 킥온 프로젝트를 진행하며 인프라 접근에 대한 고민을 항상 해왔던 것 같다.
현재 킥온의 인프라는 Terraform을 기반으로 yaml 파일을 통해 config 설정 후 각 개발자의 작업환경 ip를 인바운드규칙에 추가하여 보안을 관리하고 있었다.

하지만 개발자가 늘어나면서 작업환경이 많이 다양해지기면서 ip가 시시각각 변하기도 하고 인바운드 규칙 하나당 할당할 수 있는 ip들의 수가 제한 되어 있어 관리하기 어려워지기 시작했다.

(Terraform 레포지토리를 서버 개발자들에게 공유하고 ip 추가하는 법도 공유했지만, state 파일 관리, ip 삭제할 수 있는지 컨펌 하는 등 오히려 관리 비용이 너무 늘어나는 느낌이었다.)

그래서 만듬

그래서 이전 회사에서 경험 했고, 현 회사에서도 내부망을 이용하고 있는 만큼 네트워크적으로 해결해보자는 생각으로 무작정 라즈베리파이를 구매했다...!

라즈베리 파이 여기서 삼


근데 이거 사니까 너무 간지가 안나서 케이스도 사버림 케이스는 여기서 삼
(근데 사는게 맞음 개이쁨!)

이제 이 이쁜 귀요미 컴퓨터에 VPN 서버를 구축해보겠음

개발 환경:

  • 📌 라즈베리파이4 (Raspberry Pi OS Lite 설치)
  • 📡 Wi-Fi로 공유기에 연결
  • 🌐 공유기 외부 IP: 211.206.30.203
  • 🎯 목적: 외부에서 VPN을 통해 AWS RDS, EC2 리소스에 접속

✅ 1. 라즈베리파이 OS 설치 (Raspberry Pi Imager 활용)

  1. Raspberry Pi Imager 다운로드 및 실행
  2. 라즈베리파이 디바이스 선택 (나는 라즈베리파이4 모델B 2GB)
  3. 운영체제 Raspberry Pi OS Lite (64-bit) 선택
    • 근데 OS는 라즈베리파이 자기 거에 맞춰서 선택해야 될듯? 사용함
  4. 그리고 저장소를 선택해야 하는데, 다이소에서 Micro SD카드 하나 사서 거기다 하면 됨. USB도 되는지 모르겠음
  5. 그리고 OS 커스터마이징으로 설정을 해줘야 되는데 설정 편집 들어가서 아래와 같이 설정하면 됨.




  6. 설정을 적용하시겠습니까?에 '예' 누르고 microSD에 이미지 굽고 라즈베리에 삽입
  7. 전원 연결 후 자동 부팅 (노란색 깜빡거리다가 빨간색만 남으면 된거임)

✅ 설정한 Wi-Fi로 자동 접속됨


✅ 2. 라즈베리파이 IP 고정 (공유기 DHCP에서 고정)

공유기 관리자 페이지 접속 후:

  • MAC 주소 기준으로 라즈베리파이에 고정 IP 할당
    예: 192.168.45.101

이렇게 하면 라즈베리파이 재부팅 시에도 IP가 바뀌지 않음


✅ 2-1. SSH로 라즈베리파이에 접속

ssh pi@192.168.45.101
# 비밀번호 입력

✅ 3. WireGuard VPN 서버 설치 및 설정

🔧 설치

sudo apt update
sudo apt install wireguard -y

🔐 키 생성

wg genkey | tee server_private.key | wg pubkey > server_public.key
wg genkey | tee client1_private.key | wg pubkey > client1_public.key

필요한 클라이언트 수만큼 키를 반복 생성

📁 서버 설정 파일

/etc/wireguard/wg0.conf

[Interface]
Address = 10.0.0.1/24
ListenPort = 51820
PrivateKey = <server_private_key>
SaveConfig = true

PostUp = iptables -t nat -A POSTROUTING -o wlan0 -j MASQUERADE
PostDown = iptables -t nat -D POSTROUTING -o wlan0 -j MASQUERADE

[Peer]
PublicKey = <client1_public_key>
AllowedIPs = 10.0.0.2/32
PersistentKeepalive = 25

[Peer]
PublicKey = <client2_public_key>
AllowedIPs = 10.0.0.3/32
PersistentKeepalive = 25

# 추가 클라이언트...

클라이언트가 많다면 Peer 항목 계속 추가

🤬 여기서 진짜 빡치는 점! 만약 자기가 라즈베리 파이를 인터넷선이랑 연결했다면 wlan0 대신 eth0 넣으면 될듯? 이거 때문에 몇시간 씀 ㅋㅋ

  • 인터넷 되도록 허용해주는거라고 함 (NAT 서버)

✅ 4. 공유기 포트 포워딩 설정

외부 포트: 51820

내부 IP: 192.168.45.101 (라즈베리파이 IP)

내부 포트: 51820

프로토콜: UDP

예: 211.206.30.203:51820 → 192.168.45.101:51820

✅ 공유기 NAT Loopback / Hairpin NAT 기능이 활성화되어 있어야 내부에서도 외부 IP로 접속 가능


✅ 5. AWS 보안 그룹 인바운드 규칙 설정

  • RDS / EC2의 보안 그룹에 아래와 같이 설정
유형	프로토콜	포트 범위	소스
All traffic	ALL	ALL	{공유기 외부 ip}/24

✅ 6. 클라이언트 설정

  • 예시: /etc/wireguard/wg0.conf (또는 모바일 앱 설정)
[Interface]
PrivateKey = <client1_private_key>
Address = 10.0.0.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = <server_public_key>
Endpoint = {공유기 외부 IP}:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 25

AllowedIPs = 0.0.0.0/0 으로 설정하면 Full Tunnel (모든 인터넷 트래픽을 VPN을 통해 전달)


✅ 7. 서버 시작 및 부팅 시 자동 실행

🔄 VPN 서버 시작

sudo systemctl start wg-quick@wg0

🔒 부팅 시 자동 실행

sudo systemctl enable wg-quick@wg0

🧪 테스트 방법

  • 클라이언트에서 VPN 연결
    https://ifconfig.me 접속 → 서버 IP 자기 외부 ip로 나오는지 확인
    -> AWS EC2, RDS에 접근 가능해야 함

🔁 DNS 설정 원복 (Mac 기준)

  • 인터넷에서 정보 찍먹하시다 DNS 서버 건드린 분들을 위해...
    VPN 연결 후 DNS 문제 생길 경우:
    sudo networksetup -setdnsservers Wi-Fi empty

혹시 설정하시다 잘 안 되시면 댓글 남겨주세용. 달려갑니다 🏃💨

profile
프로덕트 엔지니어 임민서입니다.

0개의 댓글