- Что такое VPN и Wireguard, почему не OpenVPN
- Настройка сервера на DigitalOcean
- Настройка Wireguard
- Настройка подключения к Wireguard
- Полезные ссылки
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
После клика по Add SSH key следуем инструкции:
ssh-keygen
cat ~/.ssh/id_rsa.pub
В моём примере я указываю абсолютный путь до ключа и называю его test, потому что у меня уже были сгенерированы id_rsa ключи (так они называются по умолчанию).
Копируем весь ключ и вставляем в нужное поле.
Ключ добавлен. Теперь мы можем подключаться к серверу по ssh.
2.3 Создание дроплета ⇧
Переходим к созданию непосредственно нашего сервера. В DigitalOcean эти серверы принято называть дроплет (droplet, англ.: капля). Следуем в Droplets ⇨ Create ⇨ Droplets.
Теперь просто следуем моим скриншотам. Нам требуется:
- 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
Создастся ваш новый дроплет (может пару секунд придется подождать), копируем его IP-адрес, и идем в терминал (можно использовать терминал прям там, указано зеленой стрелочкой)
Я же в моём случае подключусь через терминал по 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
Если все хорошо, переходим к добавлению клиентов (пиры)
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
Всё, на вашем устройстве теперь можно использовать ваш личный 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. И даже, если вы установите его, все равно не появится.
Для того, чтобы исправить эту несправедливость, нужно немножко твикнуть наш 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. Создаем подключение:
И заполняем необходимые поля:
Где красным горит, я указал, что туда надо вписать. Это аналогично сonf-файлу. Копируем туда нужные ключи, IP-адрес сервера. Сохраняем, проверяем. В таскбаре должен появиться тумблер VPN.
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.
удалось подключиться на айфоне. WireGuard показывает активным, но трафик идет через Москву и никакая инста не работает