이중 NAT 환경에서 WireGuard VPN 구축기
배경
집에 Ubuntu 서버를 운영하고 있다. 회사에서 서버에 접근할 때 지금까지는 SSH 터널링을 써왔다.
1
ssh -L 9999:192.168.1.1:80 root@203.0.113.10 -p 50022
포트 하나 접근할 때마다 터널을 새로 뚫어야 했고, MariaDB, SVN, 공유기 설정 페이지까지 각각 포워딩해야 했다.
불편함이 쌓이던 중에 WireGuard VPN을 도입하기로 했다.
환경
1
2
3
4
5
6
7
인터넷 (공인 IP: 203.0.113.10)
↓
인터넷 모뎀 H614G (192.168.55.1) ← SK브로드밴드
↓ LAN 1번 포트
ASUS 공유기 RT-AX53U (192.168.1.1)
↓
홈 서버 home-server (192.168.1.100) ← WiFi 연결
이중 NAT 구조다. 외부에서 서버까지 도달하려면 모뎀과 공유기 두 군데 모두 포트포워딩이 필요하다.
왜 WireGuard인가
기존 SSH 터널링 방식의 한계:
1
2
3
문제 1: 포트 하나마다 터널 설정 필요
문제 2: 터미널 세션 유지해야 터널 유지
문제 3: 포트포워딩 + 방화벽 규칙 각각 관리
WireGuard로 전환하면:
1
2
3
4
VPN 연결 한 번 → 192.168.1.0/24 전체 접근 가능
MariaDB: 192.168.1.100:3306 직접 접속
SVN: 192.168.1.100:3690 직접 접속
공유기: http://192.168.1.1 직접 접속
1단계 — 서버에 WireGuard 설치
1
sudo apt install wireguard -y
서버 키 생성
1
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
2단계 — IP 포워딩 활성화
VPN 트래픽이 내부망으로 전달되려면 IP 포워딩이 켜져 있어야 한다.
1
2
echo "net.ipv4.ip_forward=1" | sudo tee -a /etc/sysctl.conf
sudo sysctl -p
3단계 — 서버 설정 파일 작성
1
sudo vi /etc/wireguard/wg0.conf
아래 키값은 예시 키다. 실제 운영 시에는 반드시 직접 생성한 키를 사용해야 한다.
1
2
3
4
5
6
[Interface]
PrivateKey = sErVeRpRiVaTeKeYSaMpLe0123456789abcdef= # 서버 프라이빗 키
Address = 10.0.0.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
eth0은 서버의 네트워크 인터페이스명이다.ip a로 확인 후 맞게 변경해야 한다.
VPN 전용 가상 네트워크 10.0.0.0/24 를 새로 만드는 개념이다.
1
2
3
실제 서버 IP → 192.168.1.100 (집 내부망)
VPN 서버 IP → 10.0.0.1 (VPN 가상망)
VPN 클라이언트 → 10.0.0.2, 10.0.0.3...
4단계 — 클라이언트 키 생성
1
wg genkey | tee /etc/wireguard/client1_private.key | wg pubkey > /etc/wireguard/client1_public.key
서버 설정에 클라이언트 추가
wg0.conf 맨 아래에 Peer 추가:
아래 키값은 예시 키다.
client1_public.key에서 출력된 실제 퍼블릭 키를 입력해야 한다.
1
2
3
[Peer]
PublicKey = cLiEnTpUbLiCkEySaMpLe0123456789abcdefg= # 클라이언트 퍼블릭 키
AllowedIPs = 10.0.0.2/32
클라이언트 설정 파일 작성
아래 키값은 예시 키다. 실제 생성한 키로 교체해야 한다.
1
2
3
4
5
6
7
8
9
10
[Interface]
PrivateKey = cLiEnTpRiVaTeKeYSaMpLe0123456789abcdef= # 클라이언트 프라이빗 키
Address = 10.0.0.2/24
DNS = 8.8.8.8
[Peer]
PublicKey = sErVeRpUbLiCkEySaMpLe0123456789abcdefgh= # 서버 퍼블릭 키
Endpoint = 203.0.113.10:51820
AllowedIPs = 192.168.1.0/24
PersistentKeepalive = 25
키 역할 정리:
| 키 | 위치 | 설명 |
|---|---|---|
| 서버 프라이빗 키 | 서버 [Interface] | 절대 외부 노출 금지 |
| 서버 퍼블릭 키 | 클라이언트 [Peer] | 클라이언트에 배포 |
| 클라이언트 프라이빗 키 | 클라이언트 [Interface] | 절대 외부 노출 금지 |
| 클라이언트 퍼블릭 키 | 서버 [Peer] | 서버에 등록 |
핵심 설정 AllowedIPs = 192.168.1.0/24 — 집 내부망 전체를 VPN으로 라우팅한다. 인터넷 트래픽은 기존 경로로 나가는 Split Tunneling 방식이다.
5단계 — WireGuard 서비스 등록
1
2
3
4
sudo chmod 600 /etc/wireguard/wg0.conf
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0
sudo systemctl status wg-quick@wg0
6단계 — 방화벽 설정
1
2
3
sudo ufw allow 51820/udp
sudo ufw allow from 10.0.0.0/24
sudo ufw reload
7단계 — 이중 NAT 포트포워딩
여기서 이중 NAT 환경의 핵심이 나온다. 모뎀과 공유기 두 군데 모두 51820/UDP 포트포워딩이 필요하다.
1
2
3
4
5
외부 요청 203.0.113.10:51820
↓ 모뎀 H614G 포트포워딩
→ 192.168.55.100:51820 (공유기 WAN IP)
↓ 공유기 RT-AX53U 포트포워딩
→ 192.168.1.100:51820 (서버)
모뎀 H614G 설정
1
2
3
4
5
접속: http://192.168.55.1
메뉴: NAT → 포트 포워딩
프로토콜: UDP
포트 범위: 51820-51820
로컬 IP: 192.168.55.100
ASUS 공유기 설정
1
2
3
4
5
메뉴: WAN → 가상 서버 / 포트 포워딩
프로토콜: UDP
외부 포트: 51820
내부 IP: 192.168.1.100
내부 포트: 51820
이중 NAT에서 흔한 실수는 한 군데만 설정하는 것이다. 모뎀과 공유기 둘 다 빠짐없이 설정해야 한다.
8단계 — 클라이언트 연결 테스트
Windows PC에 WireGuard 앱을 설치하고 client1.conf 를 등록했다.
연결 후 ipconfig 결과:
1
2
3
알 수 없는 어댑터 client1:
IPv4 주소: 10.0.0.2
서브넷 마스크: 255.255.255.0
핑 테스트:
1
2
3
ping 192.168.1.100
192.168.1.100의 응답: 바이트=32 시간=4ms TTL=64
평균 4ms. 내부망 직접 접속과 다를 게 없다.
마무리
이중 NAT 환경이면 포트포워딩을 두 번 해야 한다. 모뎀이랑 공유기 한 군데만 설정하면 안 된다. 처음에 이거 몰라서 한참 헤맸다.
WireGuard를 도입하면서 기존에 SSH(22), MariaDB(3306), SVN(3690) 각각 포워딩하던 걸 51820 하나로 통합했다. AllowedIPs = 192.168.1.0/24로 설정해서 집 내부망 트래픽만 VPN을 타고, 일반 인터넷은 기존 경로로 나가니까 속도 영향도 없다.
포트마다 SSH 터널 뚫고 포트포워딩 각각 관리하던 거에 비하면, VPN 연결 한 번으로 내부망 전체를 접근할 수 있는 게 확실히 편하다.