시작하며

WireGuard는 간단하고 빠르며 보안이 강한 최신 VPN 프로토콜이다. 최소한의 코드로 높은 성능과 쉽게 설정 가능한 VPN 연결을 제공한다. 이번 포스팅에서는 WireGuard를 통해 간편하게 홈 네트워크에 접속하는 VPN 환경을 구성하도록 하겠다.

Info

VPN이란? VPN이란 가상 사설 네트워크를 의미하는 Virtual Private Network의 약자로 인터넷 연결과 개인 정보를 보호한다. VPN은 데이터가 지나가는 암호화된 터널을 만들고 사용자의 IP 주소를 숨겨 온라인 익명성을 보장한다.

WireGuard 소개 및 설치 과정

VPN을 왜 구축하게 되었을까?

VPN이 보안에 유용하다는 것은 알았지만 왜 별다른 프로그램이 돌아가지도 않는 홈 서버에 VPN을 도입하게 되었을까? 사실 VPN은 보안적인 측면 이외에도 굉장히 편리한 점들이 많다. 그 중 하나가 바로 해당 가상 네트워크망 안에서 클라이언트가 접속한 것처럼 사용할 수 있다는 점이다.

홈 서버에 띄워놓은 여러 가지 장난감들에 접속하려고 하면 이전에는 일일이 포트포워딩 해줘야 하는 불편함이 있었는데, 내부 홈 서버와 MacBook 간에 VPN망을 구성해놓으면 이런 귀찮은 작업들은 싹 날아가게 된다.

WireGuard란 무엇인가?

시중에는 이 VPN을 구현해놓은 다양한 구현체들이 존재한다. OPEN-VPN, WireGuard 등이 여기에 해당한다. devsisters의 기술블로그에서 WireGuard를 도입한 글을 보게 되었는데, 쉬운 연결방법과 빠른 속도, 그리고 경량성에 매력을 느껴 WireGuard를 사용하게 되었다.

Info

devtech 블로그 중 WireGuard로 멋진 VPN 서버 구축하기 - 1에 나온 다른 장점들

  1. 속도와 레이턴시가 우수하다.
  2. 첨단 암호화 기법을 사용하여 안전하며, 성능도 우수하다.
  3. Peer 배포가 쉽다.
  4. 연결이 안정적이다.
  5. 리눅스에 내장되어 있어 사용하기 편하다.

WireGuard 설치 과정

홈 서버에 WireGuard를 설치하는 과정은 다음과 같다.

  1. 서버에 WireGuard 설치 및 공개키 생성 먼저 홈 서버에 WireGuard를 설치한다. Ubuntu라 apt를 사용했는데, 다른 OS도 WireGuard 홈페이지를 참조하면 패키지로 간단하게 설치가 가능하다. 그 다음 바로 이어서 VPN 연결에 사용할 공개키개인키를 생성한다.

    sudo apt update
    sudo apt install wireguard
     
    umask 077
    sudo wg genkey | tee privatekey | wg pubkey > publickey
  2. WireGuard config 설정 다음은 WireGuard의 config를 설정한다. PostUp, PostDown 부분은 선택사항으로, 이더넷 명은 서버의 외부 네트워크 인터페이스를 검색하신 후 넣어주시면 된다. VPN 활성화 이후에도 Google 등 외부망 접속이 가능하게끔 하기 위해 NAT 규칙을 활성화해 주었다. Peer를 추가하고 싶다면 아래에 동일 양식으로 추가 작성하면 된다.

    [Interface]
    Address = {server 내부망 VPN IP}/24
    SaveConfig = true
    PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -A FORWARD -o wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp2s0 -j MASQUERADE
    PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -D FORWARD -o wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp2s0 -j MASQUERADE
    ListenPort = {사용할 vpn 포트}
    PrivateKey = {server의 private key}
     
    [Peer]
    PublicKey = {client의 public key}
    AllowedIPs = {client 내부망 VPN IP}/32
  3. IP 포워딩 활성화 및 방화벽 오픈 다음으로는 VPN 트래픽을 전달할 수 있도록 IP 포워딩을 활성화한다. ipv4, ipv6를 모두 열어주었다.

    # IP 포워딩 활성화
    sudo nano /etc/sysctl.conf
     
    net.ipv4.ip_forward=1 
    net.ipv6.conf.all.forwarding=1
     
    sudo sysctl -p
     
    # 방화벽 오픈
    sudo ufw allow 51820/udp
    sudo ufw allow in on wg0 to any
  4. WireGuard 재시작 마지막으로 WireGuard를 재시작한다. 이것으로 server 쪽의 작업은 모두 끝났다.

    #sudo wg-quick down wg0 
    sudo wg-quick up wg0
  5. WireGuard client 설치 후 config 작성 client 부분은 더 간단하다. 먼저 사용하는 PC에서 WireGuard client 프로그램을 설치한다. 설치하면 ‘add empty tunnel’을 클릭하고 다음과 같이 config를 작성한다. (server 쪽에서 필요한 client단의 public key는 화면에 바로 표시된다.)

    [Interface]
    PrivateKey = {client의 private key}
    Address = 10.0.0.2/24
    DNS = 8.8.8.8
     
    [Peer]
    PublicKey = {server의 public key}
    AllowedIPs = 0.0.0.0/0, ::/0
    Endpoint = {server public ip}:{사용할 vpn 포트}
    PersistentKeepalive = 25
  6. VPN을 activate 시키고 server url로 접속 Peer들을 여러 개 추가하여 묶어서 사용하고 있다. 이제 편하게 즐기면 된다.

정리하며

이렇게 간단하게 VPN 설정이 끝났다. VPN으로 설정하니 포트포워딩 부분에서도 기존에 세팅해두었던 RDP, VNC 포트번호를 제외하곤 전부 말끔하게 정리할 수 있었다. 개인 홈 IP 구조가 DHCP 방식으로 할당받는 방식이라면 DDNS 설정을 사용하는 것도 편하게 사용 가능한 방법이다. DDNS 설정이 필요하면 Endpoint 부분의 IP를 DDNS 주소로 매핑하면 된다.

참고문헌