포스트

이중 NAT 환경에서 WireGuard VPN 구축기

이중 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 연결 한 번으로 내부망 전체를 접근할 수 있는 게 확실히 편하다.

이 기사는 저작권자의 CC BY 4.0 라이센스를 따릅니다.