Skip to content

Instantly share code, notes, and snippets.

@owlscatcher
Last active February 9, 2025 12:13
Show Gist options
  • Save owlscatcher/ff9f4b8140796ffacf637b8caf55a9a7 to your computer and use it in GitHub Desktop.
Save owlscatcher/ff9f4b8140796ffacf637b8caf55a9a7 to your computer and use it in GitHub Desktop.
Инструкция по нрастройке своего VPN сервера на облаке DigitalOcean

Настройка VPN на базе Wireguard в облаке DigitalOcean за $5/мес.

Оглавление

1. Что такое VPN и Wireguard, почему не OpenVPN

VPN ( англ. Virtual Private Network «виртуальная частная сеть») — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений поверх другой сети, например Интернет. Часто используется для объединения в локальную сеть нескольких устройств, которые физически не располагаются в одной сети.

Wireguard это чрезвычайно простая, но быстрая и современная VPN, использующая современную криптографию. Первоначально выпущенный для ядра Linux, теперь он является кроссплатформенным (Windows, macOS, BSD, iOS, Android) и широко развертываемым. В настоящее время он находится в стадии интенсивной разработки, но уже может считаться самым безопасным, простым в использовании и простейшим VPN-решением в отрасли. Важно уточнить, что wireguard не является VPN в чистом виде. У него нет обфускации трафика. Wireguard следует unix-way идеологии: он выполняет ровно одну задачу и выполняет её хорошо.

Разговор не идет про OpenVPN, потому что это устаревшее, громоздское и менее производительное решение, которое, к тому же, сильно сложнее настроить.

2. Настройка сервера на DigitalOcean

Для начала нам понадобится сервер, где расположится wireguard. Как вариант я использую DigitalOcean.

2.1 Регистрация по реферальной ссылке

DigitalOcean предлагает реферальную программу, сделка будет честной, вам $100 на 2 месяца, мне $25. За это время вы успеете попрактиковаться с облачными тулами, может быть решите разместить там свой проект. При регистрации вас попросят внести $5 на свой депозит, чтобы подтвердить, что вы реальный пользователь. Это цена дроплета на месяц.

Реферальная ссылка: https://m.do.co/c/321ec44407f8

Регистрироваться по моей ссылке вовсе не обязательно. Этот текст не реклама и не промо. Как вариант вы можете использовать любой другой хостинг, который удобен или выгоден вам, но если у вас есть потребность отблагодарить меня за этот текст, то вы можете сделать это так, ну и получите себе бонус на 2 месяца.

2.2 Настройка безопасности

После регистрации вам станет доступна панель управления. Настроим безопасный доступ до наших серверов посредством добавления SSH-ключа. Проходим в Settings ⇨ Security ⇨ Add SSH key

image

После клика по Add SSH key следуем инструкции:

ssh-keygen
cat ~/.ssh/id_rsa.pub

В моём примере я указываю абсолютный путь до ключа и называю его test, потому что у меня уже были сгенерированы id_rsa ключи (так они называются по умолчанию).

image

Копируем весь ключ и вставляем в нужное поле.

image

Ключ добавлен. Теперь мы можем подключаться к серверу по ssh.

image

2.3 Создание дроплета

Переходим к созданию непосредственно нашего сервера. В DigitalOcean эти серверы принято называть дроплет (droplet, англ.: капля). Следуем в Droplets ⇨ Create ⇨ Droplets.

image

Теперь просто следуем моим скриншотам. Нам требуется:

  • Choose an image: Ubuntu 20.04
  • Choose a plan: Basic (за $5)
  • Choose a datacenter region: Frankfurt (или ближайший к вам)
  • Authentication: SSH keys (установлено по умолчанию, если нет - выбираем руками сами)
  • Choose a hostname: wireguard (можно любое, это ни на что не влияет)
  • Кликаем Create Droplet

image image image

Создастся ваш новый дроплет (может пару секунд придется подождать), копируем его IP-адрес, и идем в терминал (можно использовать терминал прям там, указано зеленой стрелочкой)

image

Я же в моём случае подключусь через терминал по ssh. Это не принципиально, как удобнее, так и делайте. Если вы будете подключаться через ssh из терминала, то это будет выглядить вот так:

ssh root@<SERVER_IP_ADDRESS>

Где вместо <SERVER_IP_ADDRESS> надо подставить IP-адрес вашего дроплета. Его можно скопировать у дроплета в, кхм... списке дроплетов.

3. Настройка Wireguard

Мы на сервере. Первым делом нам нужно обновить всё, чтобы иметь актуальную версию операционной системы, затем установить сам wireguard и qrencode (последний нам нужен для генерирования QR-кода, чтобы быстро подключать телефон без возни с конфигом).

Итак, обновляемся и устанавливаем всё нужное (просто по очереди копируем команды в терминал и выполняем):

apt update && apt upgrade -y
apt install wireguard qrencode -y
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf

Когда все установится можно дополнительно проверить, что 3-й шаг у нас точно выполнился:

sysctl -p

Мы должны увидеть следующее:

net.ipv4.ip_forward = 1

Переходим к настройке самого сервера wireguard.

3.1 Настройка сервера

Первым делом нам нужно сгенерировать ключи, так как наш wireguard-сервер использует симметричное шифрование:

wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

Ключи будут сгенерированы по пути /etc/wireguard, на данный момент в этой папке будут лежать privatekey и publickey. Их содержимое нам понадобится дальше. Сразу скопируйте куда-нибудь содержимое privatekey, получаем его таким образом:

cat /etc/wireguard/privatekey

Следом нужно создать файл конфигурации wireguard-сервера:

vim /etc/wireguard/wg0.conf

У вас откроется редактор vim, нажимаем i и вставляем туда эту настройку (ctrl + shift + v):

[Interface]
Address = 10.0.0.1/24
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
ListenPort = 51820
PrivateKey = <PRIVATEKEY>

Ключ вставлять надо без < >, просто после "равно" вставляете ваш скопированный приватный ключ и всё. Здесь и далее справедливо это правило. Теперь, чтобы сохранить настройку и выйти из vim нажимаем ESC или ctrl + [, далее вводим :wq. Редактор сохранит файл и закроется, вернув вас обратно в терминал.

Запускаем интерфейс и сам сервис:

wg-quick up wg0
systemctl enable wg-quick@wg0

Проверяем, работает ли сама служба:

systemctl status wg-quick@wg0

Скорее всего будет гореть серым, это значит что не стартовало. Прибьём интерфейс и перезапустим службу:

wg-quick down wg0
systemctl start wg-quick@wg0

Убеждаемся, что служба поднялась и все работает:

systemctl status wg-quick@wg0

image

Если все хорошо, переходим к добавлению клиентов (пиры)

3.2 Добавление пиров

Сервер крутится, VPN мутится. Осталось добавить наших клиентов, которые смогут подключаться. Добавление клиентов производится просто правкой конфига с добавлением секции [Peer].

Генерируем новые ключи, например, для ios пользователя (тут отличий никаких, процесс для любого пира одинаковый)

wg genkey | tee /etc/wireguard/ios_privatekey | wg pubkey | tee /etc/wireguard/ios_publickey

Сразу же куда-нибудь скопируем публичный ключ:

cat /etc/wireguard/ios_publickey

Открываем снова наш конфиг:

vim /etc/wireguard/wg0.conf

Как мы уже знаем, нажимаем i для перехода в режим ввода, делаем отступ в одну строку от основной настройки и добавляем такую секцию

[Peer]
PublicKey = <IOS-СLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.2/32

Вместо <IOS-СLIENT-PUBLIC-KEY> вставляем ваш ios_publickey. AllowedIPs здесь выбирается таким, чтобы не пересекался с другими пирами и адресом интерфейса, который у нас 10.0.0.1/24, следующий пир будет, например, с адресом 10.0.0.3/32, следующий 10.0.0.4/32 и тд. Теперь сохраняемся и выходим из vim (напомню чтобы сохранить настройку и выйти из vim нажимаем ESC или ctrl + [, далее вводим :wq. Редактор сохранит файл и закроется, вернув вас обратно в терминал).

После каждого изменения конфига нам нужно перезапускать сервис, сделаем это:

systemctl restart wg-quick@wg0

Так как в примере мы делаем настройку для iOS, то у нас есть удобный способ загрузить настройку через сканирование QR-кода. Этот файл настройки надо написать (по его примеру вы поймете, как настраивать руками конфигурации, какие ключи куда вставлять)

Для начала скопируем сразу некоторые ключи, которые нам понадобятся:

  • IP-адрес вашего сервера (это тот, по которому вы подключились по ssh, его же можно скопировать из Droplets, вашего дроплета)
  • содержимое ios_privatekey cat /etc/wireguard/ios_privatekey
  • содержимое server_publickey cat /etc/wireguard/publickey

Создаем файл vim /etc/wireguard/ios.conf конфигурации с таким содержимым:

[Interface]
PrivateKey = <IOS_PRIVATE_KEY>
Address = 10.0.0.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBLICKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Адрес интерфейса должен быть такой же, как и адрес, указанный в peer AllowedIPs, потому у нас Address = 10.0.0.2/32

Вместо <IOS_PRIVATE_KEY>, <SERVER-PUBLICKEY> и <SERVER-IP> вставляем соответствующие ключи и IP-адрес. Сохраняем файл и теперь устанавливаем на ваш iOS приложение wireguard, аналогично будет и для Android, но я все это продублирую ниже, так что не запутаетесь. Когда приложение установили, заходим в него, нажимаем + и выбираем Create from QR code, у вас откроется камера. На сервере теперь генерируем QR-код:

qrencode -t ansiutf8 < /etc/wireguard/ios.conf

Сканируете сгенерированный QR-код и настройка сама добавится. Разрешаем управление вашими VPN.

Можем проверить на сервере, добавился ли наш пир:

wg show wg0

image

Всё, на вашем устройстве теперь можно использовать ваш личный VPN. Таким образом вы можете собрать все устройства в 1 локальную сеть и иметь к ним доступ, причем физически они не будут располагаться в одной сети.

4. Настройка подключения к Wireguard

С настройкой на некоторых устройствах есть нюансы. На Mac, iOS, Android подключение происходит просто через конфиг (телефоны и вовсе через QR-код, а на mac просто нужно указать на файл конфигурации), но на Linux не все так просто, там придется немного потанцевать, чтобы добавить в network-manager wireguard и тумблер для быстрого переключения. Опишу процесс настройки для всех устройств.

4.1 iOS

На сервере:

  • генерируем ключи
  • добавляем новый пир
  • пишем файл конфигурации
  • генерируем QR-код

На телефоне:

  • Устанавливаем приложение wireguard

Теперь развернуто. Генерируем ключи:

wg genkey | tee /etc/wireguard/ios_privatekey | wg pubkey | tee /etc/wireguard/ios_publickey

Добавляем пир в файл конфигурации wireguard vim /etc/wireguard/wg0.conf:

[Peer]
PublicKey = <ANDROID-СLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.3/32

Про AllowedIPs помним, что можем использовать любой из указанной подсети, главное чтобы не пересекался с другими пирами.

Создаем файл vim /etc/wireguard/ios.conf конфигурации с таким содержимым:

[Interface]
PrivateKey = <ANDROID_PRIVATE_KEY>
Address = 10.0.0.3/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBLICKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Генерируем QR-код:

qrencode -t ansiutf8 < /etc/wireguard/ios.conf

Сканируем код приложением на телефоне. Done!

4.2 Android

На сервере:

  • генерируем ключи
  • добавляем новый пир
  • пишем файл конфигурации
  • генерируем QR-код

На телефоне:

  • Устанавливаем приложение wireguard

Теперь развернуто. Генерируем ключи:

wg genkey | tee /etc/wireguard/android_privatekey | wg pubkey | tee /etc/wireguard/android_publickey

Добавляем пир в файл конфигурации wireguard vim /etc/wireguard/wg0.conf:

[Peer]
PublicKey = <ANDROID-СLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.4/32

Про AllowedIPs помним, что можем использовать любой из указанной подсети, главное чтобы не пересекался с другими пирами.

Создаем файл vim /etc/wireguard/android.conf конфигурации с таким содержимым:

[Interface]
PrivateKey = <IOS_PRIVATE_KEY>
Address = 10.0.0.4/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBLICKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Генерируем QR-код:

qrencode -t ansiutf8 < /etc/wireguard/android.conf

Сканируем код приложением на телефоне. Done!

4.3 Linux

Здесь все не так быстро и прытко, придеться немного писать руками, но, в целом, нет никаких сложностей.

Для начала сделаем всё что нужно на самом сервере, а потом переходим к нашей linux-машине. На сервере:

  • генерируем ключи
  • добавляем новый пир

На linux:

  • прикручиваем в network-manager wireguard
  • прописываем настройки новому соединению.

Теперь развернуто. Генерируем ключи:

wg genkey | tee /etc/wireguard/linux_privatekey | wg pubkey | tee /etc/wireguard/linux_publickey

Добавляем пир в файл конфигурации wireguard vim /etc/wireguard/wg0.conf:

[Peer]
PublicKey = <LINUX-СLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.7/32

Про AllowedIPs помним, что можем использовать любой из указанной подсети, главное чтобы не пересекался с другими пирами.

Теперь переходим к настройке linux-машины:

Если мы зайдем в network-manager, то обнаружим, что там нет wireguard. И даже, если вы установите его, все равно не появится.

image

Для того, чтобы исправить эту несправедливость, нужно немножко твикнуть наш GUI.

Устанавливаем необходимое:

sudo apt install wireguard git dh-autoreconf libglib2.0-dev intltool build-essential libgtk-3-dev libnma-dev libsecret-1-dev network-manager-dev resolvconf

Теперь скачиваем и собираем из исходников нужный апплет:

git clone https://github.com/max-moser/network-manager-wireguard
cd network-manager-wireguard
./autogen.sh --without-libnm-glib

./configure --without-libnm-glib --prefix=/usr --sysconfdir=/etc --libdir=/usr/lib/x86_64-linux-gnu --libexecdir=/usr/lib/NetworkManager --localstatedir=/var

make   
sudo make install

Теперь переходим в network-manager и видим, что у нас появился wireguard. Создаем подключение:

image

И заполняем необходимые поля:

image

Где красным горит, я указал, что туда надо вписать. Это аналогично сonf-файлу. Копируем туда нужные ключи, IP-адрес сервера. Сохраняем, проверяем. В таскбаре должен появиться тумблер VPN.

image

4.4 MacOS

Для Mac все почти так же, как для телефонов, только файл конфигурации создается на пользовательской машине и скармливается приложению. Порядок такой:

На сервере:

  • генерируем ключи
  • добавляем новый пир

На mac:

  • пишем файл конфигурации
  • устанавливаем приложение wireguard
  • скармливаем его приложению wireguard

Теперь развернуто. Генерируем ключи:

wg genkey | tee /etc/wireguard/mac_privatekey | wg pubkey | tee /etc/wireguard/mac_publickey

Добавляем пир в файл конфигурации wireguard vim /etc/wireguard/wg0.conf:

[Peer]
PublicKey = <MAC-СLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.5/32

Про AllowedIPs помним, что можем использовать любой из указанной подсети, главное чтобы не пересекался с другими пирами.

На mac cоздаем файл mac.conf (где вам удобно) конфигурации с таким содержимым:

[Interface]
PrivateKey = <MAC_PRIVATE_KEY>
Address = 10.0.0.5/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBLICKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Переходим в wireguard и скармливаем ему конфигурацию. Всё, тумблер VPN появится у вас в network-manager.

4.5 Windows

Для Windows все аналогично mac. Порядок такой:

На сервере:

  • генерируем ключи
  • добавляем новый пир

На windows:

  • пишем файл конфигурации
  • устанавливаем приложение wireguard
  • скармливаем его приложению wireguard

Теперь развернуто. Генерируем ключи:

wg genkey | tee /etc/wireguard/win_privatekey | wg pubkey | tee /etc/wireguard/win_publickey

Добавляем пир в файл конфигурации wireguard vim /etc/wireguard/wg0.conf:

[Peer]
PublicKey = <win-СLIENT-PUBLIC-KEY>
AllowedIPs = 10.0.0.6/32

Про AllowedIPs помним, что можем использовать любой из указанной подсети, главное чтобы не пересекался с другими пирами.

На windows cоздаем файл win.conf (где вам удобно) конфигурации с таким содержимым:

[Interface]
PrivateKey = <WIN_PRIVATE_KEY>
Address = 10.0.0.6/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBLICKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Переходим в wireguard и скармливаем ему конфигурацию. Всё, тумблер VPN появится у вас в network-manager.

Полезные ссылки

@karcevgo
Copy link

"Теперь, чтобы сохранить настройку и выйти из vim нажимаем ESC или ctrl + [, далее ctrl + : и вводим wq. Редактор сохранит файл и закроется, вернув вас обратно в терминал."
ничего не происходит

@owlscatcher
Copy link
Author

"Теперь, чтобы сохранить настройку и выйти из vim нажимаем ESC или ctrl + [, далее ctrl + : и вводим wq. Редактор сохранит файл и закроется, вернув вас обратно в терминал." ничего не происходит

https://habr.com/ru/articles/772914/

@karcevgo
Copy link

спасибо за ответ. у меня macOS 15. не пойму, что надо нажать чтобы сохранить и выйти из терминала VIM?

@owlscatcher
Copy link
Author

owlscatcher commented Sep 22, 2024

что надо нажать чтобы сохранить и выйти из терминала VIM?

Чтобы что-то сохранить в vim, нужно выйти из режима ввода, если вы находитесь в нем, нажать двоеточие и w, должно получиться :w.

Чтобы выйти из vim, нужно ввести :q.

@karcevgo
Copy link

спасибо большое. ctrl не надо нажимать было

@owlscatcher
Copy link
Author

спасибо большое. ctrl не надо нажимать было

Гайд старый, ввел в заблуждение.

Исправлю, спасибо!

@karcevgo
Copy link

удалось подключиться на айфоне. WireGuard показывает активным, но трафик идет через Москву и никакая инста не работает

@owlscatcher
Copy link
Author

WireGuard показывает активным, но трафик идет через Москву

Если вы подлючены к WG, то трафик пойдет через сервер, где установлен WG. Т.е. при активном подключении на ifconfig.me будет показываться ip-адрес вашего сервера, а не ваш.

А все ресурсы, которые под баном РКН, они и не будут доступны, потому что VPN не используется для обхода DPI, он несколько для другого предназначен, я об этом писал в статье.

@karcevgo
Copy link

Как можно тогда обойти все эти заборы?

@owlscatcher
Copy link
Author

Как можно тогда обойти все эти заборы?

С 1 марта 2024 года запрещено (или вот тут можно ознакомитьтся) популяризировать такие средства, так что могу только посоветовать погуглить самостоятельно или на хабре глянуть по соответствующим тегам.

@karcevgo
Copy link

спасибо большое

@myakawa
Copy link

myakawa commented Oct 10, 2024

Уже поднимал VPN по этому гайду на одном VPS сервере, сейчас решил сменить сервер и страну, потому что старый в некоторых местах все же как российский определялся, потому что хостер был российским. И после настройки получил, что на новом сервере траффик не идёт. Тунели поднимаются, но:
endpoint: xxx.xxx.xxx.xxx:1088
allowed ips: 10.10.0.4/32
latest handshake: 17 seconds ago
transfer: 26.25 KiB received, 124 B sent

Пробовал на телефоне и на компе с уникальными конфигами на каждом. Единственное изменение что я сделал, сменил IP адрес VPN, поскольку на VPS сервере 10.0.0.1 был уже прописан в качестве гейтвея, и когда я первый раз запустил WG с адресом 10.0.0.1 у меня соединение оборвалось и больше не поднималось. Поэтому изменил в VPN на 10.10.0.ХХ. Что может быть не так? Дело точно не в моём провайдере, первый VPN до сих пор активен и работает, в нем тот же порт используется.

@owlscatcher
Copy link
Author

Дело точно не в моём провайдере

Дело точно в вашем провайдере. Провайдер не блокирует пакеты WG, если траффик ходит внутри страны, потому что на нем организованы многие корпоративные доступы и прч штуки, которые не используются для обхода чего-либо. А если wg-траффик идет на сервер, расположенный за границей, то провайдер будет его блокировать.

@Amonjkee
Copy link

Подскажите пожалуйста что делать если
Handshake for peer 1 did not complete after 5 seconds, retrying (try 2)
данные отправляются но не присылаются

@owlscatcher
Copy link
Author

данные отправляются но не присылаются

Привет! Как я уже писал выше, если сервер, на котором хостится WG стоит за границей, то WG не будет работать, почти все провайдеры на сегодня банят соединение, у вас уйдут первые пакеты, а обратно вы ничего не получите.

@Amonjkee
Copy link

данные отправляются но не присылаются

Привет! Как я уже писал выше, если сервер, на котором хостится WG стоит за границей, то WG не будет работать, почти все провайдеры на сегодня банят соединение, у вас уйдут первые пакеты, а обратно вы ничего не получите.

Но при этом у меня есть .conf файл соединения который я использую как впн сейчас и который работает
как это возможно?

@Amonjkee
Copy link

  • сейчас попробовал сделать на ру сервере такая же проблема handshake не проходит

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment