Настройка VPN сервера WireGuard

Thank you for reading this post, don't forget to subscribe!

WireGuard — это новый VPN про­то­кол с откры­тым исход­ным кодом, осно­ван­ный на послед­них кон­цеп­ци­ях крип­то­гра­фии. Его осо­бен­ность – про­сто­та реа­ли­за­ция и высо­кая ско­рость рабо­ты. WireGuard рабо­тать быст­рее и каче­ствен­нее, чем VPN-про­то­ко­лы OpenVPN и IKEv2. WireGuard реа­ли­зу­ет мето­ды вир­ту­аль­ной част­ной сети для созда­ния защи­щен­ных соеди­не­ний в марш­ру­ти­зи­ру­е­мых или мосто­вых кон­фи­гу­ра­ци­ях, Вклю­чен в состав ядра Linux, начи­ная с вер­сии 5.6.

Пре­иму­ще­ства WireGuard:

  • Про­стой в уста­нов­ке, настрой­ке и использовании;
  • Исполь­зу­ет совре­мен­ные крип­то­гра­фи­че­ские алго­рит­мы: Noise protocol framework, Curve25519, ChaCha20, Poly1305 и т.д.
  • Высо­кая про­из­во­ди­тель­ность за счет реа­ли­за­ции его в виде моду­ля ядра (мож­но полу­чить ско­рость до 1Гбит/с, что в 4 раза боль­ше чем про­из­во­ди­тель­ность OpenVPN);
  • Ком­пакт­ный и чита­е­мый код (основ­ная логи­ка WireGuard зани­ма­ет поряд­ка 4 тыс. строк кода, тогда как в OpenVPN дохо­дит до несколь­ких сотен тысяч), про­ще иссле­до­вать на уязвимости..

Из мину­сов мож­но при­ве­сти несколь­ко примеров:

  • WireGuard VPN рабо­та­ет толь­ко по UDP, то есть если у вас закрыт UDP тра­фик, под­клю­че­ния рабо­тать не будут;
  • Раз­ра­бот­чи­ки пока еще назы­ва­ют свой про­дукт экспериментом.

В дан­ной ста­тье, мы рас­смот­рим настрой­ку WireGuard на сер­ве­ре с CentOS 7 и 8, но дан­ный VPN-сер­вер, под­дер­жи­ва­ет­ся прак­ти­че­ски на всех Linux дис­три­бу­ти­вах и не только.

Установка WireGuard в Linux

Перед уста­нов­кой необ­хо­ди­мо­го ПО на сер­вер, выпол­ни­те обнов­ле­ние паке­тов на сер­ве­ре с помо­щью пакет­но­го менеджера:

# yum update -y

Или для CentOS 8:

# dnf update -y

Теперь нуж­но под­клю­чить репо­зи­то­рий EPEL и wireguard, затем уста­но­вить необ­хо­ди­мые паке­ты. Для CentOS 7:

# curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
# yum install epel-release -y && yum install wireguard-tools wireguard-dkms qrencode -y

Для CentOS 8:

# dnf install epel-release && dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm && dnf install akmod-wireguard wireguard

В даль­ней­шем настрой­ка WireGuadr не отли­ча­ет­ся на этих дис­три­бу­ти­вах CentOS. Что­бы про­ве­рить, что модуль wireguard был уста­нов­лен и загру­жен, выпол­ни­те команду:

# modprobe wireguard && lsmod | grep wireguard

Базовая настройка VPN сервера WireGuard

Создай­те дирек­то­рию для WireGuard:

# mkdir /etc/wireguard && cd /etc/wireguard

Теперь мож­но при­сту­пить к гене­ра­ции клю­чей для кли­ен­та и сервера:

# wg genkey | tee server-private.key | wg pubkey > server-public.key
# wg genkey | tee client-private.key | wg pubkey > client-public.key
# chmod 600 ./*-private.key

В резуль­та­те выпол­не­ния преды­ду­щих команд, появит­ся 4 фай­ла с клю­ча­ми: при­ват­ный и пуб­лич­ный клю­чи для сер­ве­ра, а так­же ана­ло­гич­ные клю­чи для кли­ен­та (мы будем исполь­зо­вать их при настрой­ке кли­ен­та WireGuard).

Далее нуж­но создать кон­фи­гу­ра­ци­он­ный файл для сервера:

# nano /etc/wireguard/wg0-server.conf

И доба­вить в него сле­ду­ю­щее содержимое:

  • В поле PrivateKey нуж­но доба­вить содер­жи­мое фай­ла server-private.key
  • В поле PublicKey вы добав­ля­е­те содер­жи­мое с фай­ла client-public.key
  • Address — IP адрес сер­ве­ра wireguard
  • ListenPort — порт на кото­ром будет рабо­тать wireguard
  • AllowedIPs — IP адре­са, кото­рые назна­ча­ют­ся VPN клиенту

PostUp и PostDown пра­ви­ла iptables при под­клю­че­нии wireguard.

В бло­ке [Peer] ука­зы­ва­ют­ся дан­ные для VPN кли­ен­тов. Если их будет несколь­ко, то нуж­но доба­вить бло­ки для новых кли­ен­тов, с новым IP адре­сом и новым ключом.

Если у вас на сер­ве­ре исполь­зу­ет­ся не iptables, а firewalld, заме­ни­те стро­ки в кон­фи­гу­ра­ци­он­ном фай­ле, кото­рые отно­сят­ся к настрой­кам меж­се­те­во­го экрана:

Вы заме­ня­е­те на:

Что­бы доба­вить ново­го кли­ен­та на сер­вер, вам нуж­но сге­не­ри­ро­вать для него клю­чи, выпол­ня­ет­ся это так же, как и для пер­во­го клиента:

# wg genkey | tee client2-private.key | wg pubkey > client-public.key
# chmod 600 ./*-private.key

Теперь добаь­те блок для ново­го кли­ен­та в кон­фи­гу­ра­ци­он­ный файл /etc/wireguard/wg0-server.conf:

И так далее.

Вклю­чи­те фор­вар­динг пакетов:

# cat /etc/sysctl.conf

# sysctl -p

Добавь­те сер­вис WireGuard в авто­за­груз­ку и запу­сти­те его:

# systemctl enable wg-quick@wg0-server
# systemctl start wg-quick@wg0-server

Про­верь­те, что появил­ся отдель­ный сете­вой интерфейс:

#ip a show wg0

Теперь вы може­те под­клю­чить­ся к ваше­му VPN сер­ве­ру с раз­лич­ных кли­ен­тов. Рас­смот­рим, как их настроить.

Подключение к WireGuard с мобильного устройства Android

Для под­клю­че­ния с мобиль­но­го устрой­ства Android, луч­ше все­го исполь­зо­вать при­ло­же­ние WireGuard, кото­рое доступ­но в Play Мар­кет (Google Play):

Уста­но­ви­те при­ло­же­ние, открой­те и нажми­те кноп­ку для добав­ле­ния ново­го подключения:

Что­бы мак­си­маль­но про­сто создать новое VPN под­клю­че­ние, нуж­но на WireGuard сер­ве­ре и создать файл для гене­ра­ции qr-кода:

# nano /etc/wireguard/client.conf

И доба­вим в него сле­ду­ю­щее содержимое:

  • В поле PrivateKey нуж­но ука­зать содер­жи­мое фай­ла client-private.key
  • В поле PublicKey – дан­ные из фай­ла server-public.key
  • Зна­че­ние SERVER_IP заме­ни­те белым (реаль­ным) IP-адре­сом ваше­го сервера
  • DNS може­те запол­нить на ваш выбор.

Выпол­ни­те коман­ду для гене­ра­ции QR кода:

# qrencode -t ansiutf8 < /etc/wireguard/client.conf

После выпол­не­ния коман­ды, вы долж­ны полу­чить qr-код кото­рый нуж­но отска­ни­ро­вать в при­ло­же­нии на Android:

Оста­лось ука­зать имя под­клю­че­ния и оно будет авто­ма­ти­че­ски созда­но на вашем мобиль­ном (со све­ми клю­ча­ми и настрой­ка­ми). После под­клю­че­ния к VPN сер­ве­ру вы вый­ти в интер­нет с адре­сом WireGuard (как при под­клю­че­нии к любо­му VPN сервису):

Для устройств с IOS так же есть кли­ент WireGuard. Настрой­ка выпол­ня­ет­ся ана­ло­гич­но Android. Все ваши шаги для под­клю­че­ния будут идентичными.

Настройка клиента WireGuard в Windows

Для под­клю­че­ния к WireGuard VPN с ком­пью­те­ра Windows, ска­чай­те дис­три­бу­тив с офи­ци­аль­но­го сай­та https://www.wireguard.com/install/#windows-7-8-81-10-2012-2016-2019

Уста­но­ви­те кли­ент WireGuard и запу­сти­те его.

Создай­те файл client.conf ( гене­ри­ру­ет­ся по спо­со­бу, опи­сан­но­му выше при гене­ра­ции qr-кода), нажми­те кноп­ку Import и ука­жи­те дан­ный файл:

Нажми­те кноп­ку ‘Activate’ и соеди­не­ние будет уста­нов­ле­но. В настрой­ках под­клю­че­ния будет содер­жать­ся пуб­лич­ный ключ, порт под­клю­че­ния, назна­чен­ный IP адрес.

Что­бы отклю­чить­ся от WireGuard, нажми­те кноп­ку Deactivate.

Таким обра­зом, мы настро­и­ли VPN-сер­вер WireGuard, кото­рый не усту­па­ет OpenVPN или IpSec, а настра­и­ва­ет­ся гораз­до быст­рее и проще.