7 min read

편한 wireguard vpn 관리, wg-easy

편한 wireguard vpn 관리, wg-easy

저는 지금 서울에서 기숙사 생활을 하고 있는데, 기숙사 생활 와중에도 본가에서 열심히 작동중인 서버에 접근하기 위해서는 필연적으로 vpn을 사용해야 했습니다.

pptp 등의 일반적인 VPN 프로토콜과 비교했을때 wireguard는 속도나 안전성 면에서 장점을 보이기 때문에, 개인서버를 구축하시는 분들이 많이들 선택하고는 하시는데 wireguard는 터미널 기반의 vpn 프로그램이라 클라이언트 기기들을 추가하기가 조금 귀찮다는 단점이 있습니다.

도커 이미지 wg-easy를 통해서, wireguard를 보다 쉽게 관리할 수 있도록 해보겠습니다.

wg-easy vs wireguard-ui

공식 깃허브에서 주장하고있는 wg-easy의 기능들은 아래와 같습니다

  • 웹 UI 제공
  • 간편한 설치
  • 클라이언트 관리가 편함(QR코드, 설정파일 다운로드 등)
  • 기기별 다운로드/업로드 통계 지원
  • Gravatar 지원(해외의 프로필 관리 서비스)
  • 다크모드

잡다하게 지원하는거같긴한데 솔직히 말하자면 그냥 이뻐서 사용한다고 생각해주시면 될거같습니다. 다른 대안으로 사용되는 wireguard-ui 의 사진은 아래와 같습니다.

부트스트랩을 사용한 티가 확 나는;;

이에 비해서 wg-easy에서의 화면은 아래와 같습니다.

UI가 조금더 이쁜 맛에 사용하는거 같습니다. 사실 셀프호스팅이 또 이런거 찾아다니는 맛이 있는거 같아요. 다양한 대안들 중에 본인 눈으로 보기에 이쁘다 싶은거 사용하시면 됩니다 후후

Docker를 통한 설치

공식 레포지토리 상에서 wg-easy를 설치하기 위한 명령어를 제공하고 있습니다

도커 이미지 파일을 제공하는 레포지토리 출처가 ghcr io인데, 해당 레포지토리는 portainer 무료 플랜에서 제공하고 있지 않기 때문에 명령어를 사용해서 컨테이너를 올려주면 됩니다.

$ docker run -d \
  --name=wg-easy \
  -e LANG=de \
  -e WG_HOST=🚨YOUR_SERVER_IP \
  -e PASSWORD=🚨YOUR_ADMIN_PASSWORD \
  -v ~/.wg-easy:/etc/wireguard \
  -p 51820:51820/udp \
  -p 51821:51821/tcp \
  --cap-add=NET_ADMIN \
  --cap-add=SYS_MODULE \
  --sysctl="net.ipv4.conf.all.src_valid_mark=1" \
  --sysctl="net.ipv4.ip_forward=1" \
  --restart unless-stopped \
  ghcr.io/wg-easy/wg-easy

여기서 중요한건 포트의 51820/udp 입니다.

저 포트를 통해서 wireguard가 클라이언트 기기들과의 통신을 구축하므로, 저 포트는 반드시 퍼블릭하게 공유되어야 합니다. 포트포워딩을 사용한 포트의 공유는 이 글에서는 따로 다루지 않겠습니다.

포트 51821은 관리자 페이지 포트이기 때문에, 정 반대로 일반적인 상황에서는 바깥으로 공유해서는 안됩니다. 저의 경우에는 nginx proxy manager를 통해서 로컬 ip 대역에서 접근했을 때에만 접속을 허용하고 있습니다.

WG_HOST 는 wg-easy가 노출되는 ip나 도메인을 적어주면 됩니다. 저는 nginx proxy manager를 통해서 도메인 주소를 하나 할당해주었으므로 그걸 그대로 적었습니다.

PASSWORD는 wg-easy 접속시 사용하는 관리자 비밀번호입니다. 편한대로 넣어주세요.

설정을 마친 모습입니다.

wg-easy는 깔끔담백하게 vpn을 연결하기 위한 최소한의 기능만을 제공하고 있는데, 서버 관리라는 저의 목적에는 그냥 모든 ip대역을 vpn을 타게 해주면 되기 때문에 큰 부담 없이 사용하기에 좋습니다.

클라이언트 기기를 연결

연결 기기는 아이패드입니다.

wireguard를 쓰는 큰 이유 중의 하나는 qr코드를 사용해 모바일 기기를 쉽게 연결할 수 있다는 점에 있습니다.

New 버튼을 누르고, 연결할 기기의 이름을 입력해 줍니다.

  • 토글 버튼은 vpn에 접속 차단/허용을,
  • QR코드 버튼은 연결용 QR코드 생성을,
  • 다운로드 버튼은 연결용 file 생성을,
  • 삭제 버튼은 vpn프로파일을 삭제합니다.

ipad상에서 wireguard를 설치하고, Add a tunnel > Create from QR code 를 선택, 생성한 QR코드를 읽어냅니다.

vpn 프로파일의 이름을 설정하고, VPN 구성을 허용하면 등록 완료됩니다.

첨언

만약 vpn에 걸리는 부담을 조금 줄이고 싶으시다면 컨테이너의 환경변수 설정 부분에서 WG_ALLOWED_IPS 에 내부망 ip만 vpn을 타게끔 작성해주면 됩니다.

저는 서버 환경의 내부 ip를 일반적인 기기랑 별도로 192.168.10.0/24 선에서 끊어서 분배하고 있으므로 환경변수도 똑같이 192.168.10.0/24 을 설정해주면, 내부 서버로 접속하고자 할 때에만 vpn을 타고 가게 될 것입니다.

클라이언트 측의 로컬 네트워크에 접근이 필요한 경우 설정이 조금 까다로워지는 것으로 알고 있는데, 저처럼 내부 서버에 대한 ip 대역을 미리 쪼개주면 크게 부담 없이 사용할 수 있을 듯 싶습니다. 적용은 안해봐서 확답은 못드립니다만...

결론

성능좋고 이쁘기까지 한 vpn 환경을 구축해 봤습니다. 저처럼 원격으로 서버에 붙어야 하는 분들에게는 꽤나 추천할 수 있는 솔루션이고, 최근 바꾼 널찍한 화면의 스마트폰을 통한 원격제어에 적극적으로 활용하지 않을까 싶습니다.