[번외] wireguard-ui를 활용해 클라이언트 키 생성하기
wireguard 설정을 웹 UI로 관리할 수 있는 wireguard-ui를 사용하면,
브라우저 상에서 손쉽게 피어(클라이언트) 추가 및 키 생성이 가능합니다!
주의사항
wiregurad-ui
를 사용하는 경우,
이전에 사용하던 /etc/wireguard/wg0.conf
파일은 wireguard-ui
에서 설정한 내용으로 새롭게 덧씌워집니다!
사전 준비
- Docker 설치: Docker 및 Docker Compose가 설치되어 있어야 합니다.
- WireGuard 설정 디렉터리: 서버의
/etc/wireguard
디렉터리를 사용합니다. - 필요 권한: 컨테이너에
NET_ADMIN
,SYS_MODULE
권한을 부여해야 합니다.
wireguard-ui 설치하기
- 최신 설치 코드는 다음 링크를 참고하세요!
도커 컴포즈를 사용하는 경우 아래 명령어를 실행하여 도커 컴포즈를 다운로드 받으세요!
wget -O docker-compose.yaml https://raw.githubusercontent.com/ngoduykhanh/wireguard-ui/refs/heads/master/docker-compose.yaml
옵션 설명
-p 5000:5000
: 컨테이너의 5000번 포트를 호스트에 노출합니다./etc/wireguard:/etc/wireguard
: 서버의 WireGuard 설정 파일 디렉터리를 컨테이너와 공유합니다../db:/app/db
: wireguard-ui의 데이터(피어 목록 등)를 저장할 로컬 디렉터리입니다. 실제 경로로 변경하세요.--cap-add=NET_ADMIN
: 네트워크 및 모듈 관리 권한 부여
서버 설정 수정하기
이전에 서버 구성 파일 작성 챕터에서 /etc/wireguard/wg0.conf
파일에 직접 코드를 작성했었죠?
wiregurad-ui
에서는 웹 UI에서 변경해야 합니다!
실제로 wireguard-ui
를 실행하고 /etc/wireguard/wg0.conf
파일 상단을 보면
아래와 같이 파일을 직접 수정하지 말라고 되어있어요!
# This file was generated using wireguard-ui (https://github.com/ngoduykhanh/wireguard-ui)
# Please don't modify it manually, otherwise your change might get replaced.
서버 설정은 웹 UI로 이동한 후에, Wireguard Server 탭으로 이동하여
wg0.conf
에서 작성했던 내용 그대로 작성해주고
우측 상단에 Appliy config
버튼을 눌러주면 됩니다.
키페어 생성
지금까지는 클라이언트 측에서 별도로 개인키, 공개키를 생성 한 후,
그 공개키를 서버의 /etc/wireguard/wg0.conf
파일 내 [Peer]
섹션에다가 그 키 값을 직접 입력했었는데요!
[Peer]
PublicKey = 클라이언트에서_생성한_공개키
AllowedIPs = 10.0.0.2/32
wireguard-ui
는 웹 UI를 통해 피어(클라이언트)를 자동으로 추가할 수 있도록 도와주니까
위처럼 수동으로 작성할 필요는 없어요!
[Peer] 섹션
- 서버의
/etc/wireguard/wg0.conf
파일은 초기 [Interface] 설정만 수동으로 작성해두고, 피어에 관한 부분은 wireguard-ui가 추가하도록 할 수 있습니다.- 즉, wireguard-ui에서 새 피어를 추가하면 해당 피어의 공개키, 내부 IP, 기타 필요한 옵션들이 자동으로 [Peer] 섹션에 기록됩니다.
그럼 이제 키 생성 방법에 대해서 알아볼까요?
웹 인터페이스 접속
브라우저에서 wireguard-ui에 접속합니다.
피어 추가
UI 상단의 Wireguard Clients를 눌러 이동해주세요!
키 생성
New Client
버튼을 눌러 새로운 클라이언트를 생성해봅시다!
IP Allocation
은 VPN에 접속했을 때 할당받을 나의 IP 주소로 입력해주시면 됩니다!
AllowedIPs
그리고 밑에 Allowed IPs
에 기본 값으로 0.0.0.0/0
으로 설정이 되어있을텐데요
AllowedIPs 설정은 Wireguard의 라우팅 및 트래픽 제어에 핵심 역할을 해요!
AllowedIPs의 역할을 확인해볼까요?
라우팅 정보
- AllowedIPs에 지정된 IP 대역은 해당 피어를 통해 전달해야 하는 트래픽의 목적지를 의미합니다.
- 예를 들어, 클라이언트 피어의 AllowedIPs에
10.0.0.0/24
가 있다면, 서버는 이 대역으로 향하는 모든 패킷을 VPN 터널로 보내게 됩니다.
액세스 제어
- 또한, 어떤 피어가 어떤 IP 대역에 접근할 수 있는지를 결정하는 ACL(Access Control List) 역할도 합니다.
참고로 주의사항도 존재합니다!
0.0.0.0/0
을 설정하게 되면 다음과 같은 문제가 발생할 수 있어요! 잘 읽어보세요.
- 만약 서버의 피어 설정(클라이언트에 대한 AllowedIPs)을 0.0.0.0/0으로 지정하면, WireGuard는 해당 피어가 “모든 IP 주소”를 소유하고 있다고 인식합니다.
- 그 결과, 서버는 내부 LAN(예: 10.0.0.0/24)이나 외부 인터넷으로 가는 모든 트래픽을 그 피어로 보내려고 시도합니다.
올바른 트래픽 분배 불가
- 일반적으로 서버에서는 피어마다 고유의 VPN IP (예: 10.0.0.3/32)를 할당합니다.
- 0.0.0.0/0로 설정하면, 서버는 “어떤 목적지든” 해당 피어에게 전달하게 되어, 다른 네트워크(내부 LAN 또는 인터넷)로의 올바른 라우팅이 이루어지지 않습니다.
결과
- VPN 클라이언트가 내부망이나 외부망에 접근하려 할 때, 서버는 모든 트래픽을 그 클라이언트로 보내므로, 다른 경로(내부 LAN의 다른 장비나 인터넷 게이트웨이)로 전달되지 않아 통신이 이루어지지 않게 됩니다.
이제 생성하면 다음과 같이 클라이언트 키 파일 목록이 뜰거에요!
wg0 인터페이스 재시작!
wireguard-ui
웹 UI에서 서버 설정을 완료하고, 클라이언트 생성까지 마쳤다면 /etc/wireguard/wg0.conf
에
새로운 설정이 저장되었을텐데요!
이를 wg0
인터페이스에 반영하기 위해서 아래 명령어를 실행해줍시다.
wg-quick down wg0
wg-quick up wg0
접속 테스트
이제 모든 설정이 끝났다면,
내부망에 정상적으로 접근할 수 있는지 테스트를 해봐야겠죠?
wireguard-ui
웹 UI에서 클라이언트 키 파일을 다운로드 받고
wireguard client 프로그램을 다운로드 받은 후에 해당 키 파일을 넣어 내부망에 접속해보도록 합시다!
저는 Iphone에서 wireguard 클라이언트 프로그램을 다운로드 받고 접속한 상태에서
VPN 서버의 터미널로 이동하여 wg
명령을 사용해봤습니다. (Peer 상태 확인 가능해요)
그리고 Peer 접속 현황은 웹 UI의 Status 탭에서도 확인 가능해요!