웹사이트 검색

Ubuntu 22.04에서 WireGuard VPN을 설정하는 방법


이 튜토리얼은 다음 OS 버전에 대해 존재합니다.

  • Ubuntu 22.04(Jammy Jellyfish)
  • Ubuntu 20.04(Focal Fossa)

이 페이지에서

  1. 전제 조건
  2. 1단계 - Wireguard 설치 및 키 쌍 생성
  3. 2단계 - IPv4 및 IPv6 주소 선택
    1. IPv4 범위 선택
    2. IPv6 범위 선택

    1. Wireguard 피어 키 쌍 만들기\n
    2. 피어 구성 파일 만들기\n
    3. 터널을 통해 모든 트래픽을 라우팅하도록 피어 구성\n
    4. 피어 DNS 확인자 구성\n

    Wireguard는 최신 암호화를 사용하는 오픈 소스 교차 플랫폼 가상 사설망(VPN) 구현입니다. IPv4 및 IPv6 연결을 지원합니다. IPSec 및 OpenVPN 프로토콜보다 빠르고 간단하며 기능이 뛰어납니다. 임베디드 인터페이스 및 슈퍼 컴퓨터에서 실행되는 범용 VPN으로 설계되었으며 Linux, Windows, macOS, iOS, Android 및 기타 다양한 플랫폼에서 실행됩니다.

    Wireguards 암호화는 피어가 서로 간에 암호화된 터널을 설정하도록 개인 및 공개 키를 사용하여 작동합니다.

    이 튜토리얼에서는 Ubuntu 22.04 서버에 Wireguard VPN을 설치하고 Ubuntu 클라이언트를 사용하여 연결하는 방법을 다룹니다.

    전제 조건

    • A server running Ubuntu 22.04 supports both IPv4 and IPv6 connections.

    • A client running Ubuntu 22.04 to connect to the Wireguard server. For our tutorial, we will be using our local machine as our client but you can use a remote server for it.

    • A non-root user with sudo privileges.

    • The uncomplicated Firewall(UFW) is enabled and running.

    • Everything is updated.

      $ sudo apt update && sudo apt upgrade
      

    1단계 - Wireguard 설치 및 키 쌍 생성

    Ubuntu 22.04는 최신 버전의 Wireguard와 함께 제공됩니다. 와이어가드를 설치합니다.

    $ sudo apt install wireguard
    

    다음 단계는 서버의 개인 및 공개 키 쌍을 생성하는 것입니다. wg genkey 명령을 사용하여 서버용 개인 키를 만듭니다.

    $ wg genkey | sudo tee /etc/wireguard/private.key
    

    개인 키를 보호하기 위해 권한을 변경하십시오. chmod go= 명령은 다른 사용자 및 그룹이 파일에 액세스하지 못하도록 차단합니다. 터미널에서 인코딩된 키를 받게 됩니다. 나중에 필요하므로 키를 기록해 둡니다.

    $ sudo chmod go= /etc/wireguard/private.key
    

    다음으로 개인 키에서 파생된 해당 공개 키를 생성합니다. wg pubkey를 사용하여 공개 키를 생성합니다. 다음 명령은 세 부분으로 구성되어 있습니다. 첫 번째 부분은 wg pubkey 명령에서 사용하는 개인 키를 출력하여 공개 키를 생성한 다음 각 파일에 저장합니다.

    $ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
    

    터미널에서 공개 키를 다시 받게 됩니다. 기록해 두십시오.

    2단계 - IPv4 및 IPv6 주소 선택

    Wireguard 서버 및 피어와 함께 사용할 개인 IPv4 및 IPv6 주소를 정의해야 합니다.

    IPv4 범위 선택

    Wireguard를 IPv4 피어와 함께 사용하려면 서버에 터널 인터페이스에 대한 개인 IPv4 주소 범위가 필요합니다. 다음 예약된 주소 블록에서 임의의 범위의 IP 주소를 선택할 수 있습니다.

    • 10.0.0.0에서 10.255.255.255(10/8 접두어)
    • 172.16.0.0에서 172.31.255.255로(172.16/12 접두사)
    • 192.168.0.0에서 192.168.255.255로(192.168/16 접두사)

    자습서에서는 예약된 IP의 첫 번째 범위에서 IP 주소 블록으로 10.8.0.0/24를 사용합니다. 이 범위는 최대 255개의 피어 연결을 허용합니다. 호스팅 회사에서 제공하는 사설 IP 범위를 사용할 수도 있습니다.

    IPv6 범위 선택

    RFC 알고리즘에 따르면 고유한 IPv6 접두사를 얻기 위해 권장되는 방법은 시간을 컴퓨터 ID와 같은 고유한 값과 결합하는 것입니다. 그런 다음 해당 값은 예약된 프라이빗 fd00::/8 IP 블록 내에서 고유한 주소로 사용하기 위해 해시되고 잘립니다.

    첫 번째 단계는 date 유틸리티를 사용하여 64비트 타임스탬프를 수집하는 것입니다.

    $ date +%s%N
    

    Unix Epoch 시간(1970년 1월 1일 00:00 UTC) 이후 경과된 초 수인 다음과 유사한 출력을 생성합니다.

    1659342559092041940
    

    나중에 사용할 수 있도록 값을 기록해 둡니다. 다음으로 서버의 machine-id 값을 복사합니다. 이 값은 모든 시스템에 고유합니다.

    $ cat /var/lib/dbus/machine-id
    

    비슷한 출력을 얻을 수 있습니다.

    d97e195db6584d63aeedfdc35dc83c7f
    

    다음으로 타임스탬프를 machine-id와 결합하고 SHA-1 알고리즘을 사용하여 문자열을 해시합니다.

    printf <timestamp><machine-id> | sha1sum
    

    이전의 위 명령에서 값을 교체합니다. 다른 해시 값을 받게 됩니다.

    $ printf 1659342559092041940d97e195db6584d63aeedfdc35dc83c7f | sha1sum
    d789c02d9d8faef806d40ec15b307d4d9c8ec4bc  -
    

    다음 명령을 실행하여 RFC 알고리즘에 따라 printf 출력을 트리밍합니다.

    $ printf d789c02d9d8faef806d40ec15b307d4d9c8ec4bc | cut -c 31-
    

    다음 출력을 얻어야 합니다.

    4d9c8ec4bc
    

    위 출력에서 바이트 집합은 4d 9c 8e c4 bc입니다. 다음과 같이 fd 접두사를 사용하여 위의 5바이트를 추가하여 IPv6 주소를 생성합니다.

    이전에 /64 서브넷 크기로 생성된 바이트를 사용하여 결과 접두사는 다음과 같습니다.

    Unique Local IPv6 Address Prefix
    fd4d:9c8e:c4bc::/64
    

    서버에 IP를 할당하려면 마지막 :: 문자 뒤에 1을 추가합니다. 결과 주소는 fd4d:9c8e:c4bc::1/64입니다. 피어는 fd4d:9c8e:c4bc::2/64와 같은 다른 증분을 추가하여 IP 주소를 사용합니다.

    3단계 - Wireguard 구성

    구성 파일을 생성하고 편집을 위해 엽니다.

    $ sudo nano /etc/wireguard/wg0.conf
    

    다음 코드를 붙여넣습니다. server_private_key를 1단계에서 생성된 개인 키로 교체합니다. 수신 포트를 원하는 대로 변경할 수 있습니다.

    [Interface]
    PrivateKey = server_private_key
    Address = 10.8.0.1/24, fd4d:9c8e:c4bc::/64
    ListenPort = 51820
    SaveConfig = true
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    4단계 - Wireguard 네트워크 구성

    Wireguard 서버를 통해 피어 트래픽을 라우팅하려면 IP 전달을 구성해야 합니다. 편집을 위해 /etc/sysctl.conf 파일을 엽니다.

    $ sudo nano /etc/sysctl.conf
    

    앞의 해시 기호를 제거하여 다음 행의 주석 처리를 제거하십시오.

    # Uncomment the next line to enable packet forwarding for IPv4
    net.ipv4.ip_forward=1
    
    # Uncomment the next line to enable packet forwarding for IPv6
    #  Enabling this option disables Stateless Address Autoconfiguration
    #  based on Router Advertisements for this host
    net.ipv6.conf.all.forwarding=1
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다. 다음 명령을 사용하여 새 값을 확인합니다.

    $ sudo sysctl -p
    net.ipv4.ip_forward = 1
    net.ipv6.conf.all.forwarding = 1
    vm.swappiness = 0
    

    이제 Wireguard 서버는 VPN 이더넷 장치에서 들어오는 모든 트래픽을 서버의 다른 장치로 전달하고 여기에서 공용 인터넷으로 전달합니다. 이를 통해 서버는 서버 IP 주소를 통해 피어의 모든 웹 트래픽을 라우팅할 수 있으며 클라이언트 IP 주소를 숨길 수 있습니다.

    다음 단계는 전달이 제대로 작동하도록 방화벽 규칙을 구성하는 것입니다.

    5단계 - Wireguard 서버 방화벽 구성

    서버 방화벽을 통한 VPN 트래픽을 허용하려면 클라이언트 연결을 라우팅하기 위해 실시간 NAT(동적 네트워크 주소 변환)를 제공하는 가장을 활성화해야 합니다.

    Wireguard 서버의 공용 네트워크 인터페이스를 찾으십시오.

    $ ip route list default
    default via 209.23.8.1 dev eth0 proto static
    

    위의 명령에 따르면 eth0는 공용 인터페이스입니다.

    Wireguard 구성 파일을 열어 방화벽 규칙을 Wireguard 서버에 추가합니다.

    $ sudo nano /etc/wireguard/wg0.conf
    

    SaveConfig=true 줄 뒤의 파일 맨 아래에 다음 줄을 붙여넣습니다.

    . . .
    PostUp = ufw route allow in on wg0 out on eth0
    PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    PreDown = ufw route delete allow in on wg0 out on eth0
    PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    PostUp 라인은 Wireguard 서버가 VPN 터널을 시작할 때 실행됩니다. 첫 번째 규칙은 IPv4 및 IPv6 트래픽 전달을 허용합니다. 두 번째 및 세 번째 규칙은 IPv4 및 IPv6 트래픽에 대한 위장을 구성합니다. PreDown 라인은 Wireguard 서버가 VPN 터널을 중지할 때 실행됩니다.

    방화벽 구성의 마지막 단계는 Wireguard UDP 포트에서 들어오고 나가는 트래픽을 허용하는 것입니다. 복잡하지 않은 방화벽(UFW)을 사용하여 Wireguard 포트를 엽니다.

    방화벽의 상태를 확인하십시오.

    $ sudo ufw status
    

    다음과 같은 내용이 표시되어야 합니다.

    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    

    1단계에서 구성한 51820 포트를 엽니다. Wireguard에 다른 포트를 사용하는 경우 해당 포트를 엽니다.

    $ sudo ufw allow 51820/udp
    

    UFW 방화벽을 비활성화했다가 다시 활성화하여 이 단계에서 수정된 모든 파일의 변경 사항을 로드합니다.

    $ sudo ufw disable
    $ sudo ufw enable
    

    상태를 다시 확인하여 확인하십시오.

    Status: active
    
    To                         Action      From
    --                         ------      ----
    OpenSSH                    ALLOW       Anywhere
    51820/udp                  ALLOW       Anywhere
    OpenSSH (v6)               ALLOW       Anywhere (v6)
    51820/udp (v6)             ALLOW       Anywhere (v6)
    

    Wireguard 서버는 피어에 대한 전달 및 위장을 포함하여 VPN 트래픽을 처리하도록 구성됩니다.

    6단계 - WireGuard 서버 시작

    Wireguard는 wg-quick 스크립트를 사용하여 서비스로 실행되도록 구성할 수 있습니다. Wireguard 서비스를 활성화합니다.

    $ sudo systemctl enable 
    

    서비스 이름의 wg0 부분은 /etc/wireguard/wg0.conf 파일에 해당합니다. 즉, 다른 구성 파일과 서비스를 사용하여 원하는 만큼 VPN 터널을 만들 수 있습니다.

    Wireguard 서비스를 시작합니다.

    $ sudo systemctl start 
    

    서비스 상태를 확인합니다.

    $ sudo systemctl status 
    

    비슷한 출력을 얻을 수 있습니다.

    ?  - WireGuard via wg-quick(8) for wg0
         Loaded: loaded (/lib/systemd/system/; enabled; vendor preset: enabled)
         Active: active (exited) since Mon 2022-08-01 11:35:59 UTC; 6s ago
           Docs: man:wg-quick(8)
                 man:wg(8)
                 https://www.wireguard.com/
                 https://www.wireguard.com/quickstart/
                 https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
                 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
        Process: 3935 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
       Main PID: 3935 (code=exited, status=0/SUCCESS)
            CPU: 216ms
    
    Aug 01 11:35:58 wireguard wg-quick[3935]: [#] wg setconf wg0 /dev/fd/63
    Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -4 address add 10.8.0.1/24 dev wg0
    Aug 01 11:35:58 wireguard wg-quick[3935]: [#] ip -6 address add fd4d:9c8e:c4bc::/64 dev wg0
    Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip link set mtu 1420 up dev wg0
    Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ufw route allow in on wg0 out on eth0
    Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added
    Aug 01 11:35:59 wireguard wg-quick[3978]: Rule added (v6)
    Aug 01 11:35:59 wireguard wg-quick[3935]: [#] iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    Aug 01 11:35:59 wireguard wg-quick[3935]: [#] ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
    Aug 01 11:35:59 wireguard systemd[1]: Finished WireGuard via wg-quick(8) for wg0.
    

    7단계 - Wireguard 피어 설치 및 구성

    Ubuntu 22.04 기반 피어에 Wireguard 클라이언트를 설치합니다.

    $ sudo apt update
    $ sudo apt install wireguard
    

    로컬 Ubuntu 데스크탑에 설치하는 경우 Wireguard가 사전 설치되어 있을 수 있습니다.

    Wireguard 피어 키 쌍 생성

    1단계와 동일한 방식으로 피어에서 키 쌍을 생성합니다. 또한 개인 키에 권한을 부여합니다.

    $ wg genkey | sudo tee /etc/wireguard/private.key
    $ sudo chmod go= /etc/wireguard/private.key
    

    공개 키를 만듭니다.

    $ sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
    

    피어 구성 파일 만들기

    피어 구성 파일을 만들려면 다음이 필요합니다.

    • 피어에서 생성된 base64 인코딩 개인 키입니다.\n
    • Wireguard 서버에 정의된 IPv4 및 IPv6 주소 범위입니다.
    • Wireguard 서버의 base64 인코딩 공개 키입니다.
    • Wireguard 서버의 공용 IP 주소 및 포트 번호입니다. 서버와 클라이언트에 IPv6 연결이 있는 경우 IPv6 주소를 사용해야 합니다.\n

    편집을 위해 피어 구성 파일을 만들고 엽니다.

    $ sudo nano /etc/wireguard/wg0.conf
    

    다음 코드를 붙여넣습니다.

    [Interface]
    PrivateKey = peer_private_key
    Address = 10.8.0.2/24
    Address = fd4d:9c8e:c4bc::2/64
    
    [Peer]
    PublicKey = JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8=
    AllowedIPs = 10.8.0.0/24, fd4d:9c8e:c4bc::/64
    Endpoint = 209.23.10.202:51820
    PersistentKeepalive = 15
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    첫 번째 키는 피어에서 생성된 개인 키입니다. 첫 번째 주소 줄은 이전에 선택한 서브넷의 IPv4 주소를 사용합니다. 두 번째 주소 줄은 이전에 선택한 서브넷의 IPv6 주소를 사용합니다.

    두 번째 키는 서버에서 생성된 공개 키입니다. AllowedIPs는 이전에 선택한 IPv4 및 IPv6 범위를 사용하여 대상 시스템에 두 범위 중 하나의 IP 주소가 있는 경우 VPN을 통해서만 트래픽을 전송하도록 피어에 지시합니다. IPv4 연결만 사용하는 경우 IPv6 주소를 생략할 수 있습니다.

    터널을 통해 모든 트래픽을 라우팅하도록 피어 구성

    시스템이 기본 게이트웨이로 사용하는 IP 주소를 찾습니다. 다음 ip route 명령을 실행합니다.

    $ ip route list table main default
    

    비슷한 출력을 얻을 수 있습니다.

    default via 69.28.84.1 dev eth0 proto static
    

    게이트웨이 IP 주소와 장치 이름을 기록해 둡니다. 피어의 공개 IP를 찾습니다.

    $ ip -brief address show eth0
    

    비슷한 출력을 받게 됩니다.

    eth0             UP             69.28.84.160/23 2607:f170:14:13::910/64 fe80::200:45ff:fe1c:54a0/64
    

    편집을 위해 피어 구성 파일을 엽니다.

    $ sudo nano /etc/wireguard/wg0.conf
    

    [Peer] 섹션 앞에 다음 줄을 붙여넣습니다.

    PostUp = ip rule add table 200 from 69.28.84.160
    PostUp = ip route add table 200 default via 69.28.84.1
    PreDown = ip rule delete table 200 from 69.28.84.160
    PreDown = ip route delete table 200 default via 69.28.84.1
    
    [Peer]
    . . .
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    PostUp 명령은 IP가 시스템 공용 IP와 일치할 때 테이블 200의 라우팅 항목을 확인하는 규칙을 만듭니다. PreDown 명령은 테이블 200에서 처리하는 트래픽이 Wireguard 인터페이스 대신 라우팅에 203.0.113.1 게이트웨이를 사용하도록 합니다.

    피어 DNS 확인자 구성

    eth0이 다른 경우 이더넷 장치 이름으로 대체하여 서버에서 다음 명령을 실행하십시오.

    $ resolvectl dns eth0
    

    비슷한 출력을 받게 됩니다.

    Link 2 (eth0): 209.208.127.65 209.208.25.18 2001:4860:4860::8888 2001:4860:4860::8844
    

    피어 구성 파일을 엽니다.

    $ sudo nano /etc/wireguard/wg0.conf
    

    [Peer] 줄 앞에 다음 코드를 추가합니다.

    DNS = 209.208.127.65 2001:4860:4860::8888
    
    [Peer]
    . . .
    

    Ctrl + X를 누르고 메시지가 표시되면 Y를 입력하여 파일을 저장합니다.

    8단계 - Wireguard 서버에 피어 공개 키 추가

    Wireguard 피어에서 공개 키를 확인하십시오.

    $ sudo cat /etc/wireguard/public.key
    PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
    

    Wireguard 서버에서 다음 명령을 실행합니다.

    $ sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2
    

    기존 피어에 대한 allowed-ips를 업데이트하려면 IP 주소를 변경하여 위 명령을 다시 실행하십시오.

    서버에서 터널의 상태를 확인하십시오.

    $ sudo wg
    interface: wg0
     public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE=
     private key: (hidden)
     listening port: 51820
    
    peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
     allowed ips: 10.8.0.2/32, fd24:609a:6c18::2/128
    

    9단계 - 피어를 터널에 연결

    VPN을 통해 모든 트래픽을 라우팅하는 경우 resolvconf 패키지를 설치하십시오.

    $ sudo apt install resolvconf
    

    피어에서 터널을 시작합니다.

    $ sudo wg-quick up wg0
    

    비슷한 출력을 받게 됩니다.

    [#] ip link add wg0 type wireguard
    [#] wg setconf wg0 /dev/fd/63
    [#] ip -4 address add 10.8.0.2/24 dev wg0
    [#] ip -6 address add fd4d:9c8e:c4bc::2/64 dev wg0
    [#] ip link set mtu 1420 up dev wg0
    [#] resolvconf -a tun.wg0 -m 0 -x
    [#] ip rule add table 200 from 69.28.84.160
    [#] ip route add table 200 default via 69.28.84.1
    

    피어에서 터널의 상태를 확인하십시오.

    $ sudo wg
    interface: wg0
     public key: nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw=
     private key: (hidden)
     listening port: 45392
    
    peer: JySX9hMJFyAqZA+mNvJsArKW7yY8I7ROsQKTZZR/RH8=
     endpoint: 209.23.10.202:51820
     allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64
     latest handshake: 23 seconds ago
     transfer: 92 B received, 212 B sent
     persistent keepalive: every 15 seconds
    

    이것은 피어와 VPN 간의 연결을 확인합니다.

    피어가 VPN을 사용하고 있는지 확인합니다.

    $ ip route get 10.0.8.1
    10.0.8.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
       cache
    

    IPv6을 사용하는 경우 다음 명령을 대신 사용하십시오.

    $ ip -6 route get fd24:609a:6c18::1
    fd24:609a:6c18::1 from :: dev wg0 proto kernel src fd24:609a:6c18::2 metric 256 pref medium
    

    다음 명령을 사용하여 피어 연결을 끊습니다.

    $ sudo wg-quick down wg0
    [#] ip link delete dev wg0
    [#] resolvconf -d tun.wg0 -f
    

    다음 명령을 사용하여 서버에서 피어 구성을 제거합니다.

    $ sudo wg set wg0 peer nbkscqPcItMsFtv3R/ylrcC9knA+3F0Z/UVCkGx/DFw= remove
    

    결론

    이것으로 Ubuntu 22.04 서버에서 Wireguard VPN을 설정 및 구성하고 클라이언트와 연결하는 방법에 대한 자습서가 완료되었습니다. 질문이 있으시면 아래 의견에 게시하십시오.