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를 시스템에 추가하여 프로젝트 패키지에 대한 액세스를 구성합니다.
- sudo add-apt-repository ppa:wireguard/wireguard
새 패키지 소스를 apt
구성에 추가하라는 메시지가 표시되면 Enter 키를 누릅니다. PPA가 추가되면 로컬 패키지 인덱스를 업데이트하여 새로 사용 가능한 패키지에 대한 정보를 가져온 다음 WireGuard 커널 모듈 및 사용자 영역 구성 요소를 설치합니다.
- sudo apt-get update
- sudo apt-get install wireguard-dkms wireguard-tools
다음으로 각 서버에서 WireGuard 구성을 시작할 수 있습니다.
개인 키 생성
WireGuard VPN의 각 참가자는 공개 키 암호화를 사용하여 피어를 인증합니다. 공개 키를 교환하고 최소한의 구성을 수행하여 새 피어 간의 연결을 설정할 수 있습니다.
개인 키를 생성하고 WireGuard 구성 파일에 직접 쓰려면 각 서버에서 다음을 입력하십시오.
- (umask 077 && printf "[Interface]\nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
- 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
라는 파일에 기록합니다. 구성을 정의할 때 이 파일의 키를 두 번째 서버와 교환해야 합니다.
초기 구성 파일 만들기
다음으로 편집기에서 구성 파일을 열어 몇 가지 다른 세부 정보를 설정합니다.
- sudo nano /etc/wireguard/wg0.conf
내부에서 [Interface]
라는 섹션에 정의된 생성된 개인 키를 볼 수 있습니다. 이 섹션에는 연결의 로컬 측에 대한 구성이 포함되어 있습니다.
인터페이스 섹션 구성
이 노드가 사용할 VPN IP 주소와 피어의 연결을 수신할 포트를 정의해야 합니다. 파일이 다음과 같이 보이도록 ListenPort
및 SaveConfig
줄을 추가하여 시작합니다.
[Interface]
PrivateKey = generated_private_key
ListenPort = 5555
SaveConfig = true
이것은 WireGuard가 청취할 포트를 설정합니다. 바인딩 가능한 무료 포트가 될 수 있지만 이 가이드에서는 두 서버 모두에 대해 포트 5555에서 VPN을 설정합니다. 각 호스트의 ListenPort
를 선택한 포트로 설정합니다.
또한 SaveConfig
를 true
로 설정했습니다. 이렇게 하면 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 포트를 엽니다.
- sudo ufw allow 5555
이제 정의한 wg0
인터페이스 파일을 사용하여 wg-quick
서비스를 시작합니다.
- sudo systemctl start wg-quick@wg0
그러면 컴퓨터의 wg0
네트워크 인터페이스가 시작됩니다. 다음을 입력하여 확인할 수 있습니다.
- ip addr show wg0
Output on first server6: 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의 활성 구성에 대한 정보를 볼 수 있습니다.
- sudo wg
피어 정의가 없는 서버에서 디스플레이는 다음과 같이 표시됩니다.
Output on first serverinterface: wg0
public key: public_key_of_this_server
private key: (hidden)
listening port: 5555
피어 구성이 이미 정의된 서버에서 출력에는 해당 정보도 포함됩니다.
Output on second serverinterface: 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
출력에서 찾을 수 있습니다.
- 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
를 다시 입력하여 정보가 현재 활성 구성에 있는지 확인할 수 있습니다.
- sudo wg
Output on first serverinterface: 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해 보십시오.
- ping -c 3 10.0.0.2
Output on first serverPING 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
파일에 저장할 수 있습니다.
- sudo systemctl restart wg-quick@wg0
부팅 시 터널을 시작하려면 다음을 입력하여 각 시스템에서 서비스를 활성화할 수 있습니다.
- sudo systemctl enable wg-quick@wg0
이제 머신이 부팅될 때마다 VPN 터널이 자동으로 시작됩니다.
결론
WireGuard는 유연성, 경량 구현 및 최신 암호화로 인해 많은 사용 사례에 적합한 옵션입니다. 이 가이드에서는 두 개의 Ubuntu 16.04 서버에 WireGuard를 설치하고 각 호스트를 해당 피어에 대한 지점 간 연결이 있는 서버로 구성했습니다. 이 토폴로지는 각 측이 동일한 참가자이거나 호스트가 다른 서버에 대한 임시 연결을 설정해야 할 수 있는 피어와 서버 간 통신을 설정하는 데 이상적입니다.