Skip to content

Instantly share code, notes, and snippets.

@owlscatcher
Last active March 11, 2024 13:14
Show Gist options
  • Star 25 You must be signed in to star a gist
  • Fork 5 You must be signed in to fork a gist
  • 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 + [, далее 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 + [, далее 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.

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

@Lainaaa
Copy link

Lainaaa commented May 30, 2023

После добавления пира на iOS ничего не заработало :(

P.S. После перезагрузки заработало:

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

@Lainaaa
Copy link

Lainaaa commented May 30, 2023

На маке не робит чет...
Ventura 13.3.1

@owlscatcher
Copy link
Author

На маке не робит чет... Ventura 13.3.1

А что в логах пишет?

@Lainaaa
Copy link

Lainaaa commented May 30, 2023

На маке не робит чет... Ventura 13.3.1

А что в логах пишет?

Screenshot 2023-05-30 at 7 59 14 PM

Я уже и не знаю что думать и кому писать :)
В сети пишут что может быть из-за ростелекома, но в то же время с телефона работает, а может быть из-за Ventura - последняя ось Мака. Решений толком никаких не нашел, конфиг миллион раз проверял и переписывал.

@ZlayaAnia
Copy link

Для iOS и mac Ventura 13.3 в конфигурациях на самих устройствах прописывала вместо
AllowedIPs = 0.0.0.0/0
соответствующие значения для каждого из wg0.conf, без этого vpn работал только на одном устройстве (добавление любого нового пира всё ломало)

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