웹사이트 검색

Ubuntu 16.04에서 WireGuard로 지점 간 VPN을 만드는 방법


소개

WireGuard는 강력한 보안을 제공하면서 사용하기 쉽게 설계된 최신 고성능 VPN입니다. WireGuard는 공개 키 인증으로 암호화된 네트워크 인터페이스를 통해 당사자 간에 보안 연결을 제공하는 데에만 중점을 둡니다. 즉, 대부분의 VPN과 달리 토폴로지가 적용되지 않으므로 주변 네트워킹 구성을 조작하여 다른 구성을 얻을 수 있습니다. 이 모델은 개인의 필요에 따라 적용할 수 있는 뛰어난 성능과 유연성을 제공합니다.

WireGuard가 사용할 수 있는 가장 간단한 토폴로지 중 하나는 지점 간 연결입니다. 이렇게 하면 중앙 서버의 중재 없이 두 시스템 간에 보안 링크가 설정됩니다. 이러한 유형의 연결은 각 개별 서버가 피어와 직접 통신할 수 있는 메시 VPN 토폴로지를 설정하기 위해 두 명 이상의 구성원 간에도 사용할 수 있습니다. 각 호스트가 동등하기 때문에 이 두 토폴로지는 단일 서버를 게이트웨이로 사용하여 트래픽을 라우팅하는 것과는 반대로 서버 간에 보안 메시징을 설정하는 데 가장 적합합니다.

이 가이드에서는 두 개의 Ubuntu 16.04 서버를 사용하여 WireGuard와 지점 간 VPN 연결을 설정하는 방법을 보여줍니다. 먼저 소프트웨어를 설치한 다음 각 호스트에 대한 암호화 키 쌍을 생성합니다. 그런 다음 피어의 연결 정보를 정의하는 간단한 구성 파일을 만듭니다. 인터페이스를 시작하면 WireGuard 인터페이스를 통해 서버 간에 보안 메시지를 보낼 수 있습니다.

전제 조건

이 가이드를 따르려면 두 개의 Ubuntu 16.04 서버에 액세스해야 합니다. 각 서버에서 관리 작업을 수행하려면 sudo 권한이 있는 루트가 아닌 사용자를 생성해야 합니다. 또한 각 시스템에 구성된 기본 방화벽이 필요합니다. 다음 자습서를 완료하여 이러한 요구 사항을 충족할 수 있습니다.

  • Ubuntu 16.04로 초기 서버 설정

계속할 준비가 되면 sudo 사용자로 각 서버에 로그인하십시오.

소프트웨어 설치

WireGuard 프로젝트는 PPA에 Ubuntu 시스템용 최신 패키지를 제공합니다. 계속하려면 두 서버 모두에 WireGuard를 설치해야 합니다. 각 서버에서 다음 작업을 수행합니다.

먼저 WireGuard PPA를 시스템에 추가하여 프로젝트 패키지에 대한 액세스를 구성합니다.

  1. sudo add-apt-repository ppa:wireguard/wireguard

새 패키지 소스를 apt 구성에 추가하라는 메시지가 표시되면 Enter 키를 누릅니다. PPA가 추가되면 로컬 패키지 인덱스를 업데이트하여 새로 사용 가능한 패키지에 대한 정보를 가져온 다음 WireGuard 커널 모듈 및 사용자 영역 구성 요소를 설치합니다.

  1. sudo apt-get update
  2. sudo apt-get install wireguard-dkms wireguard-tools

다음으로 각 서버에서 WireGuard 구성을 시작할 수 있습니다.

개인 키 생성

WireGuard VPN의 각 참가자는 공개 키 암호화를 사용하여 피어를 인증합니다. 공개 키를 교환하고 최소한의 구성을 수행하여 새 피어 간의 연결을 설정할 수 있습니다.

개인 키를 생성하고 WireGuard 구성 파일에 직접 쓰려면 각 서버에서 다음을 입력하십시오.

  1. (umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
  2. wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/publickey

첫 번째 명령은 구성 파일의 초기 내용을 /etc/wireguard/wg0.conf에 기록합니다. 일반 환경에 영향을 주지 않고 제한된 권한으로 파일을 생성하기 위한 하위 셸의 umask 값.

두 번째 명령은 WireGuard의 wg 명령을 사용하여 개인 키를 생성하고 제한된 구성 파일에 직접 씁니다. 또한 키를 다시 wg pubkey 명령으로 파이프하여 관련 공개 키를 파생하고 쉽게 참조할 수 있도록 /etc/wireguard/publickey라는 파일에 기록합니다. 구성을 정의할 때 이 파일의 키를 두 번째 서버와 교환해야 합니다.

초기 구성 파일 만들기

다음으로 편집기에서 구성 파일을 열어 몇 가지 다른 세부 정보를 설정합니다.

  1. sudo nano /etc/wireguard/wg0.conf

내부에서 [Interface]라는 섹션에 정의된 생성된 개인 키를 볼 수 있습니다. 이 섹션에는 연결의 로컬 측에 대한 구성이 포함되어 있습니다.

인터페이스 섹션 구성

이 노드가 사용할 VPN IP 주소와 피어의 연결을 수신할 포트를 정의해야 합니다. 파일이 다음과 같이 보이도록 ListenPortSaveConfig 줄을 추가하여 시작합니다.

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true

이것은 WireGuard가 청취할 포트를 설정합니다. 바인딩 가능한 무료 포트가 될 수 있지만 이 가이드에서는 두 서버 모두에 대해 포트 5555에서 VPN을 설정합니다. 각 호스트의 ListenPort를 선택한 포트로 설정합니다.

또한 SaveConfigtrue로 설정했습니다. 이렇게 하면 wg-quick 서비스가 종료 시 활성 구성을 이 파일에 자동으로 저장하도록 지시합니다.

참고: SaveConfig가 활성화되면 wg-quick 서비스는 /etc/wireguard/wg0.conf 파일의 내용을 덮어씁니다. 서비스가 종료됩니다. WireGuard 구성을 수정해야 하는 경우 /etc/wireguard/wg0.conf 파일을 편집하기 전에 wg-quick 서비스를 종료하거나 wg 명령을 사용하여 서비스를 실행합니다(서비스가 종료될 때 파일에 저장됨). 서비스가 실행되는 동안 구성 파일에 대한 모든 변경 사항은 wg-quick이 활성 구성을 저장할 때 덮어씁니다.

다음으로 각 서버에 고유한 주소 정의를 추가하여 wg-quick 서비스가 WireGuard 인터페이스를 불러올 때 네트워크 정보를 설정할 수 있도록 합니다. VPN의 주소 공간으로 10.0.0.0/24 서브넷을 사용합니다. 각 컴퓨터에 대해 이 범위(10.0.0.1 ~ 10.0.0.254) 내에서 고유한 주소를 선택하고 CIDR 표기법을 사용하여 주소와 서브넷을 지정해야 합니다.

첫 번째 서버에 CIDR 표기법으로 10.0.0.1/24로 표시되는 10.0.0.1의 주소를 지정합니다.

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24

두 번째 서버에서 주소를 10.0.0.2로 정의하여 10.0.0.2/24의 CIDR 표현을 제공합니다.

[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.2/24

[Interface] 섹션의 끝입니다.

구성 파일 내에서 또는 나중에 wg 명령을 사용하여 수동으로 서버 피어에 대한 정보를 입력할 수 있습니다. 위에서 언급했듯이 SaveConfig 옵션이 true로 설정된 wg-quick 서비스는 피어 정보가 결국 파일에 기록됨을 의미합니다. 두 가지 방법 중 하나로.

피어 ID를 정의하는 두 가지 방법을 보여주기 위해 첫 번째가 아닌 두 번째 서버의 구성 파일에 [Peer] 섹션을 만듭니다. 이제 첫 번째 서버(10.0.0.1 주소를 정의하는 서버)의 구성 파일을 저장하고 닫을 수 있습니다.

피어 섹션 정의

아직 열려 있는 구성 파일에서 [Interface] 섹션의 항목 아래에 [Peer]라는 섹션을 만듭니다.

PublicKey첫 번째 서버의 공개 키 값으로 설정하여 시작합니다. 상대 서버에서 cat /etc/wireguard/publickey를 입력하면 이 값을 찾을 수 있습니다. 또한 AllowedIPs를 터널 내부에서 유효한 IP 주소로 설정합니다. 첫 번째 서버가 사용하는 특정 IP 주소를 알고 있으므로 단일 IP 값을 포함하는 범위를 나타내기 위해 /32로 끝나는 직접 입력할 수 있습니다.

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32

마지막으로 Endpoint를 첫 번째 서버의 공용 IP 주소와 WireGuard 수신 포트(이 예에서는 포트 5555 사용)로 설정할 수 있습니다. WireGuard는 다른 주소에서 이 피어로부터 합법적인 트래픽을 수신하는 경우 이 값을 업데이트하여 VPN이 로밍 조건에 적응할 수 있도록 합니다. 이 서버가 연결을 시작할 수 있도록 초기 값을 설정합니다.

[Interface]
. . .

[Peer]
PublicKey = public_key_of_first_server
AllowedIPs = 10.0.0.1/32
Endpoint = public_IP_of_first_server:5555

완료되면 파일을 저장하고 닫아 명령 프롬프트로 돌아갑니다.

VPN 시작 및 피어에 연결

이제 각 서버에서 WireGuard를 시작하고 두 피어 간의 연결을 구성할 준비가 되었습니다.

방화벽 열기 및 VPN 시작

먼저 각 서버의 방화벽에서 WireGuard 포트를 엽니다.

  1. sudo ufw allow 5555

이제 정의한 wg0 인터페이스 파일을 사용하여 wg-quick 서비스를 시작합니다.

  1. sudo systemctl start wg-quick@wg0

그러면 컴퓨터의 wg0 네트워크 인터페이스가 시작됩니다. 다음을 입력하여 확인할 수 있습니다.

  1. ip addr show wg0
Output on first server
6: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1 link/none inet 10.0.0.1/24 scope global wg0 valid_lft forever preferred_lft forever

wg 도구를 사용하여 VPN의 활성 구성에 대한 정보를 볼 수 있습니다.

  1. sudo wg

피어 정의가 없는 서버에서 디스플레이는 다음과 같이 표시됩니다.

Output on first server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555

피어 구성이 이미 정의된 서버에서 출력에는 해당 정보도 포함됩니다.

Output on second server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555 peer: public_key_of_first_server endpoint: public_IP_of_first_server:5555 allowed ips: 10.0.0.1/32

연결을 완료하려면 이제 wg 명령을 사용하여 첫 번째 서버에 두 번째 서버의 피어링 정보를 추가해야 합니다.

명령줄에서 누락된 피어 정보 추가

첫 번째 서버(피어 정보가 표시되지 않는 서버)에서 다음 형식을 사용하여 피어링 정보를 수동으로 입력합니다. 두 번째 서버의 공개 키는 두 번째 서버의 sudo wg 출력에서 찾을 수 있습니다.

  1. sudo wg set wg0 peer public_key_of_second_server endpoint public_IP_of_second_server:5555 allowed-ips 10.0.0.2/32

첫 번째 서버에서 sudo wg를 다시 입력하여 정보가 현재 활성 구성에 있는지 확인할 수 있습니다.

  1. sudo wg
Output on first server
interface: wg0 public key: public_key_of_this_server private key: (hidden) listening port: 5555 peer: public_key_of_second_server endpoint: public_IP_of_second_server:5555 allowed ips: 10.0.0.2/32

이제 지점 간 연결을 사용할 수 있습니다. 첫 번째 서버에서 두 번째 서버의 VPN 주소를 ping해 보십시오.

  1. ping -c 3 10.0.0.2
Output on first server
PING 10.0.0.2 (10.0.0.2) 56(84) bytes of data. 64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.635 ms 64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.615 ms 64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.841 ms --- 10.0.0.2 ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 1998ms rtt min/avg/max/mdev = 0.615/0.697/0.841/0.102 ms

모든 것이 올바르게 작동하는 경우 서비스를 다시 시작하여 첫 번째 서버의 구성을 다시 /etc/wireguard/wg0.conf 파일에 저장할 수 있습니다.

  1. sudo systemctl restart wg-quick@wg0

부팅 시 터널을 시작하려면 다음을 입력하여 각 시스템에서 서비스를 활성화할 수 있습니다.

  1. sudo systemctl enable wg-quick@wg0

이제 머신이 부팅될 때마다 VPN 터널이 자동으로 시작됩니다.

결론

WireGuard는 유연성, 경량 구현 및 최신 암호화로 인해 많은 사용 사례에 적합한 옵션입니다. 이 가이드에서는 두 개의 Ubuntu 16.04 서버에 WireGuard를 설치하고 각 호스트를 해당 피어에 대한 지점 간 연결이 있는 서버로 구성했습니다. 이 토폴로지는 각 측이 동일한 참가자이거나 호스트가 다른 서버에 대한 임시 연결을 설정해야 할 수 있는 피어와 서버 간 통신을 설정하는 데 이상적입니다.