공인 IP 가 있는 서버에 wg-easy(Docker)로 WireGuard 를 띄우고, 집이나 사무실 PC 를 VPN 클라이언트로 붙여 두면 외부에서 그 PC 의 서비스로 들어갈 수 있다. 아래 예시에서 VPN 대역은 wg-easy 기본값인 10.8.0.0/24, 클라이언트 PC 는 10.8.0.2 다.
1. 도메인으로 들어오는 웹 요청을 넘길 때 (nginx)
서버의 nginx 가 80/443 으로 요청을 받고, VPN 안쪽 PC 로 넘긴다.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
upstream user1_pc { server 10.8.0.2:2691; # VPN 클라이언트 PC 의 포트 } server { listen 80; server_name pc.example.com; location / { proxy_pass http://user1_pc; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } } |
2. 특정 포트로 바로 들어오는 요청을 넘길 때 (iptables DNAT)
웹이 아닌 서비스(게임 서버, RDP 등)는 iptables 로 포트를 그대로 넘긴다. wg-easy 의 docker-compose.yml 환경 변수에 넣어 두면 VPN 이 올라오고 내려갈 때 규칙이 같이 붙고 빠진다.
|
1 2 |
WG_POST_UP: "iptables -t nat -A PREROUTING -i ens5 -p tcp --dport 52170 -j DNAT --to-destination 10.8.0.14; iptables -A FORWARD -p tcp -d 10.8.0.14 --dport 52170 -j ACCEPT" WG_POST_DOWN: "iptables -t nat -D PREROUTING -i ens5 -p tcp --dport 52170 -j DNAT --to-destination 10.8.0.14; iptables -D FORWARD -p tcp -d 10.8.0.14 --dport 52170 -j ACCEPT" |
ens5는 서버의 외부 네트워크 인터페이스 이름이다.ip -br addr로 확인해서 바꾼다. (AWS 는 보통 ens5, 다른 곳은 eth0 등)- PREROUTING 에서 처리되므로 서버 자체 방화벽(ufw)은 열지 않아도 되지만, 그 앞단의 클라우드 방화벽(AWS 보안 그룹 등)에서는 해당 포트를 열어야 한다.
- 클라이언트 PC 의 방화벽에서도 그 포트를 허용해야 한다.
3. wg-easy 관리자 비밀번호 바꾸기
wg-easy 14 버전은 비밀번호를 평문 대신 bcrypt 해시(PASSWORD_HASH)로 넣는다.
|
1 2 3 |
cd ~/wg-easy docker run --rm -it ghcr.io/wg-easy/wg-easy wgpw '새_비밀번호' # PASSWORD_HASH='$2a$12$....' 형태로 출력됨 |
docker-compose.yml 의 PASSWORD_HASH 를 바꾸고 다시 띄운다. compose 파일 안에서는 $ 를 $$ 로 두 번 써야 변수로 해석되지 않는다.
|
1 2 3 |
docker compose down vi docker-compose.yml # PASSWORD_HASH 수정 docker compose up -d |
※ 참고 wg-easy 15 부터는 처음 접속할 때 웹 화면에서 관리자 계정을 만들고, 비밀번호도 웹 화면에서 바꾸는 방식으로 바뀌었다.

Leave a Reply