Contents

Public IP 활용하기 - 2

Wireguard를 이용한 개인 VPN Server 구축

Public IP가 없는 PC에 띄워놓은 서비스에 접근하기 위한 방법으로 VPNReverse Proxy를 활용할 수 있습니다. VPN 서버를 구축하고 활용하면 물리적으로 떨어져 있는 컴퓨터를 같은 Local Network에 있는 것처럼 사용할 수 있고, Reverse Proxy를 같이 활용하면 Public IP가 없는 컴퓨터에 VPN 연결 없이 접근 가능합니다. 이 글에서는 WireGuard, Subspace, CoreDNS를 소개합니다.

준비

이전 글에서 수행 했던 것처럼 WireGuard VPN을 위한 51820번 udp 포트를 열어줍니다.

Subspace

VPN 프로토콜 중 하나인 WireGuard는 매우 빠른 성능과 비교적 간편한 설치때문에 인기가 많습니다. WireGuard VPN Server 공식문서를 통하여 설치하는 경우에는 Client를 등록, 관리하는 과정이 까다롭습니다. 조금더 쉽게 Client를 등록, 관리 해주는 도구는 PiVPN이 있습니다. 하지만 CLI가 익숙하지 않은 경우에는 사용하기 어렵습니다. Subspace는 WireGuard VPN Server를 쉽게 구축할 수 있을 뿐만아니라 GUI를 통해서 Client를 관리할 수 있게 해줍니다. 아래의 내용은 이곳에서도 확인할 수 있습니다.

clear iptable

Oracle machine에는 iptable에 설정된 기본적인 규칙이 있습니다. 이 규칙을 삭제하지 않으면, WireGuard VPN Server가 정상동작하지 않을 수 있습니다.

1
2
3
4
sudo iptables -F
sudo iptables -X
sudo netfilter-persistent save
sudo netfilter-persistent reload

docker, docker-compose 설치

아래의 명령은 Install Docker Engine on UbuntuInstall Docker Compose를 참고하였습니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Install docker
sudo apt update
sudo apt install -y curl apt-transport-https ca-certificates gnupg-agent software-properties-common
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# Install docker-compose
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.0/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

sudo 권한 없이 docker를 사용하기 위해서 아래의 명령을 수행합니다.

1
sudo usermod -aG docker $USER

WireGuard, Resolvconf 설치 및 설정

아래의 명령을 수행하여 WireGuard, Resolvconf를 설치 및 설정을 진행합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# Install wireguard, resolvconf
sudo add-apt-repository -y ppa:wireguard/wireguard
sudo apt update
sudo apt install -y wireguard resolvconf

# Disable systemd-resolved listener if it blocks port 53.
sudo sh -c "'DNSStubListener=no' >> /etc/systemd/resolved.conf"
sudo systemctl restart systemd-resolved

# Load modules.
sudo modprobe wireguard
sudo modprobe iptable_nat
sudo modprobe ip6table_nat

# Enable modules when rebooting.
sudo sh -c  "'wireguard' > /etc/modules-load.d/wireguard.conf"
sudo sh -c "'iptable_nat' > /etc/modules-load.d/iptable_nat.conf"
sudo sh -c "'ip6table_nat' > /etc/modules-load.d/ip6table_nat.conf"

# Check if systemd-modules-load service is active.
sudo systemctl status systemd-modules-load.service

# Enable IP forwarding.
sudo sysctl -w net.ipv4.ip_forward=1
sudo sysctl -w net.ipv6.conf.all.forwarding=1

# Enable self-forwarding
sudo iptables -I FORWARD -i wg0 -o wg0 -j ACCEPT
sudo netfilter-persistent save
sudo netfilter-persistent reload

# Set DNS server.
sudo sh -c "nameserver 8.8.8.8 >> /etc/resolvconf/resolv.conf.d/head"
sudo sh -c "nameserver 1.1.1.1 >> /etc/resolvconf/resolv.conf.d/head"

sudo systemctl start resolvconf.service
sudo systemctl enable resolvconf.service

sudo resolvconf -u

다른 docker-compose.yml과 겹치지않게 directory를 만들어 줍니다.

1
mkdir ~/subspace; cd ~/subspace

아래의 명령을 수행하여 docker-compose.yml을 작성합니다. Community버전과 다른점은 dnsmasq를 disable할 수 있는 option을 추가하였습니다. Subspace container의 dsnmasq가 잘 동작하지 않기 때문에 이 역할은 Pi-hole로 대체합니다. Subspace를 접근할 때 사용할 Domain Name을 SUBSPACE_HTTP_HOST에 적어줍니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
cat > docker-compose.yml << EOF
version: "3.3"
services:
  subspace:
   image: ghcr.io/kbc8894/subspace:latest
   container_name: subspace
   volumes:
    - /opt/docker/subspace:/data
   restart: always
   environment:
    - SUBSPACE_HTTP_HOST=vpn.example.duckdns.org
    - SUBSPACE_LETSENCRYPT=false
    - SUBSPACE_HTTP_INSECURE=true
    - SUBSPACE_HTTP_ADDR=":5000"
    - SUBSPACE_NAMESERVERS=1.1.1.1,8.8.8.8
    - SUBSPACE_LISTENPORT=51820
    - SUBSPACE_IPV4_POOL=10.99.97.0/24
    - SUBSPACE_IPV6_POOL=fd00::10:97:0/64
    # (NOTICE: If you change SUBSPACE_IPV{4/6}_POOL, you don't need to set. just commnet out.)
    - SUBSPACE_IPV4_GW=10.99.97.1
    - SUBSPACE_IPV6_GW=fd00::10:97:1
    - SUBSPACE_IPV6_NAT_ENABLED=1
    - SUBSPACE_DNSMASQ_DISABLED=1
   cap_add:
    - NET_ADMIN
   network_mode: "host"
EOF

subspace를 동작시킵니다.

1
docker-compose up -d

CoreDNS

Go언어로 작성된 DNS 서버이고, Kubernetes에서 CoreDNS를 In-Cluster DNS 서버로 사용합니다. Pi-hole, Adguard-Home과 같은 광고 차단 기능이 있는 DNS 서버도 있습니다.

다른 docker-compose.yml과 겹치지 않게 directory를 만들어 줍니다.

1
mkdir ~/coredns; cd ~/coredns

docker-compose.yaml를 작성합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
cat > docker-compose.yml << EOF
version: '2.1'

services:
  coredns:
    image: coredns/coredns
    restart: always
    command: -conf /root/coredns/config/Corefile
    ports:
      - 53:53/udp
    volumes:
      - ./config:/root/coredns/config/
EOF

CoreDNS가 사용하는 Corefile을 작성합니다.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
mkdir -p config; cat > config/Corefile << EOF
. {
    forward . 8.8.8.8 1.1.1.1 {
      max_concurrent 1000
    }
    log
    cache
    errors
}
EOF

CoreDNS를 동작시킵니다.

1
docker-compose up -d

Reverse Proxy 추가

이전 글을 참고하여 Subdomain vpn(vpn.example.duckdns.org)이 127.0.0.1:5000으로 전달 되도록 설정합니다. Browser에서 vpn.example.duckdns.org으로 접속합니다. Subspace GUI화면이 보이면 성공입니다.

Subspace 사용법

Subspace는 서버에서 발급한 Config를 Client에서 사용합니다.

Config 발급

  • 로그인 한뒤에 오른쪽 상단에서 Device Name을 적고 Platform을 선택한 뒤에 Add Device를 누릅니다.
    /vpn/config-1.png
    Add Device
  • Download your WireGuard config를 눌러서 config파일을 다운받습니다.
    /vpn/config-2.png
    Download config

Client 설정 (OSX)

  • WireGuard App을 다운 받습니다.
  • Import tunnel(s) from file을 누릅니다.
    /vpn/wireguard-client-1.png
    Import config
  • 다운받은 Config를 선택한 뒤 Allow를 누릅니다.
    /vpn/wireguard-client-2.png
    Allow
  • Activate를 누릅니다.
    /vpn/wireguard-client-3.png
    Activate
  • VPN 서버와 연결 되었습니다.
    /vpn/wireguard-client-4.png
    Connected

Client 설정 (Ubuntu)

  • WireGuard, Resolvdconf를 설치합니다.
1
sudo apt install -y resolvconf wireguard
  • Config 파일을 /etc/wireguard/wg0.conf에 옮깁니다.
1
sudo cp wg0.conf /etc/wireguard/wg0.conf
  • 연결을 하기 위해서는 다음의 명령어를 실행합니다.
1
sudo wg-quick up wg0
  • 연결을 끊기 위해서는 다음의 명령어를 실행합니다.
1
sudo wg-quick down wg0
  • (Optional) 재부팅시에도 자동으로 연결하기 위해서는 다음의 명령어를 실행합니다.
1
2
sudo systemctl enable wg-quick@wg0
sudo systemctl start wg-quick@wg0

정리

이번 글에서는 Wireguard를 이용하여 VPN을 구축하는 방법을 알아보았습니다. Public IP는 없지만 Internet이 되는 서버에서 동작하는 서비스에 접근하기 위해서 VPN만을 사용한다면, Client가 VPN이 연결되었을 때만 접근 가능하기 때문에 사내 서비스에 활용할 수 있습니다. 하지만 이전 글에서 소개한 Reverse Proxy까지 활용이 되면, Client가 VPN 연결 없이도 서비스에 접근이 가능합니다.