WireGuar — мое окно в Европу за $4-$6 в месяц
Table of Contents
Разберемся, как поднять свой VPN и почему это нужно было сделать еще вчера.
Что такое VPN и WireGuard #
VPN ( англ. Virtual Private Network «виртуальная частная сеть») — обобщённое название технологий, позволяющих обеспечить одно или несколько сетевых соединений поверх другой сети, например Интернет. Часто используется для объединения в локальную сеть нескольких устройств, которые физически не располагаются в одной сети.
Wireguard это чрезвычайно простая, но быстрая и современная VPN, использующая современную криптографию. Первоначально выпущенный для ядра Linux, теперь он является кроссплатформенным (Windows, macOS, BSD, iOS, Android) и широко развертываемым. В настоящее время он находится в стадии интенсивной разработки, но уже может считаться самым безопасным, простым в использовании и простейшим VPN-решением в отрасли. Важно уточнить, что wireguard не является VPN в чистом виде. У него нет обфускации трафика (для этого можно дополнить наш сервер прокси-сервером Shadowsocks). Wireguard следует unix-way идеологии: он выполняет ровно одну задачу и выполняет её хорошо. Очень хорошая статья, поясняющая unix-way тут.
Разговор не идет про OpenVPN, потому что это устаревшее, громоздское и менее производительное решение, которое, к тому же, сильно сложнее настроить.
Настройка сервера на DigitalOcean #
Для начала нам понадобится сервер, где расположится wireguard. Как вариант я использую DigitalOcean. Помимо DigitalOcean есть куча сервисов, которые предложат вам аналогичные услуги, к примеру, тот же Selectel, у которого есть датацентры за границей. Что именно выбирать определитесь сами, главный критерий — сервер не на территории страны, откуда вы выходите в сеть.
Как оплатить сервер DigitalOcean я рассказываю в статье о крипте, в которой затрагивают тему как прямой оплаты криптой (bitlaunch), так и visa-картой, пополненной через крипту.
Регистрация по реферальной ссылке #
DigitalOcean предлагает реферальную программу, сделка будет честной, вам $100-$200 на 2 месяца, мне $25. За это время вы успеете попрактиковаться с облачными тулами, может быть решите разместить там свой проект. При регистрации вас попросят внести $6 на свой депозит, чтобы подтвердить, что вы реальный пользователь. Это цена дроплета на месяц.
Регистрироваться по моей ссылке вовсе не обязательно. Этот текст не реклама и не промо. Как вариант вы можете использовать любой другой хостинг, который удобен или выгоден вам, но если у вас есть потребность отблагодарить меня за этот текст, то вы можете сделать это так, ну и получите себе бонус на 2 месяца.
Настройка безопасности #
После регистрации вам станет доступна панель управления. Настроим безопасный доступ до наших серверов посредством добавления SSH-ключа. Проходим в Settings ⇨ Security ⇨ Add SSH key
После клика по Add SSH key следуем инструкции:
ssh-keygen
cat ~/.ssh/id_rsa.pub
В моём примере я указываю абсолютный путь до ключа и
называю его test, потому что у меня уже были сгенерированы id_rsa
ключи
(так они называются по умолчанию).
Копируем весь ключ и вставляем в нужное поле.
Ключ добавлен. Теперь мы можем подключаться к серверу по ssh.
Создание дроплета #
Переходим к созданию непосредственно нашего сервера. В DigitalOcean эти серверы принято называть дроплет (droplet, англ.: капля). Следуем в Droplets ⇨ Create ⇨ Droplets.
Теперь просто следуем моим скриншотам. Нам требуется:
- Choose an image: Ubuntu 20.04 (или новее, но LTS)
- Choose a plan: Basic (за $5-$6)
- 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-адрес вашего дроплета. Его можно скопировать у
дроплета в, кхм… списке дроплетов.
Настраиваем 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.
Настраиваем сервер #
Первым делом нам нужно сгенерировать ключи, так как наш 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
Если все хорошо, переходим к добавлению клиентов (peer)
Добавляем первый peer #
Сервер крутится, 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
Всё, на вашем устройстве теперь можно использовать ваш личный VPN. Таким образом вы можете собрать все устройства в 1 локальную сеть и иметь к ним доступ, причем физически они не будут располагаться в одной сети.
Настроим на наших устройствах подключение к WireGuard #
С настройкой на некоторых устройствах есть нюансы. На Mac, iOS, Android подключение происходит просто через конфиг (телефоны и вовсе через QR-код, а на mac просто нужно указать на файл конфигурации), но на Linux не все так просто, там придется немного потанцевать, чтобы добавить в network-manager wireguard и тумблер для быстрого переключения. Опишу процесс настройки для всех устройств.
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!
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!
Linux #
Здесь все не так быстро и прытко, придеться немного писать руками, но, в целом, нет никаких сложностей.
У нас есть 2 пути:
- Включать-Выключать vpn через терминальный шорткат, который мы пропишем в настройках .bashrc или .zshrc (на мой взгляд самый верный способ);
- Включать-Выключать vpn тумблером через GUI (на случай, если вы настраиваете это всё родственникам, а не себе)
Управление через терминал #
Для начала сделаем всё что нужно на самом сервере, а потом переходим к нашей linux-машине. На сервере:
- генерируем ключи;
- добавляем новый пир.
На linux:
- устанавливаем WireGuard Tools;
- прокидываем шорткат для нашего шелла.
Теперь развернуто. Генерируем ключи:
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-машины:
Установим WireGuard Tools:
Debian / Ubuntu
sudo apt install wireguard-tools
Fedora
sudo dnf install wireguard-tools
Arch / Manjaro
sudo pacman -S wireguard-tools
Вставляем конфиг нашего клиента сюда:
/etc/wireguard/wg0.conf
Сам конфиг будет аналогичный всем предыдущим:
[Interface]
PrivateKey = <LINUX_PRIVATE_KEY>
Address = 10.0.0.7/32
DNS = 8.8.8.8
[Peer]
PublicKey = <SERVER-PUBLICKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20
Теперь подключаться или отключаться можно будет простой командой:
wg-quick up wg0 # connect
wg-quick down wg0 # disconnect
Это не очень удобно. Cделаем чтобы команды имели вид vpn-on
и vpn-off
.
Открываем файл конфигурации вашего шелла (у меня .zshrc, т.к. я использую oh-my-zsh, у вас будет .bashrc или что-то еще)
vim ~/.zshrc
В самый конец файла дописываем строки:
alias vpn-on="wg-quick up wg0"
alias vpn-off="wg-quick down wg0"
Сохраняем и перечитываем файл, что бы изменения вступили в силу:
source ~/.zshrc
Управление через GUI #
Разбирем на примере Ubuntu.
Если мы зайдем в 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.
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.
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 или OpenVPN? Любимый VPN Линуса Торвальдса
- Точечный обход блокировок PKH на роутере с OpenWrt с помощью WireGuard и DNSCrypt
- Объяснение VPN обфускации
- Документация по WireGuard для роутеров Microtik
- WireGuard on MikroTik RouterOS
- Why is Free VPN Bad Idea?
- Worst VPN Warning List: Free VPN Scams in 2022
Благодарности серому волшебнику #
Если текст был полезен и ты не можешь усмирить желание быть благодарным, то можешь купить мне чашечку кофе:
Воспользоваться моей реферальной ссылкой на DigitalOcean:
Или же закинуть монету в мой кошелёк (USDT и TRX кошельки одинаковые, да, это не ошибка):
Tether (TRC-20, USDT):
TYvFYUV3h5HwqfyTxskGQK7nDbUHTcwPn2
Tron (TRX):
TYvFYUV3h5HwqfyTxskGQK7nDbUHTcwPn2
Monero (XMR):
4AbxbT9vrNQTUDCQEPwVLYZq2zTEYzNr9ZzTLaq9YcwVfdxwkWjZ6FsewuXVDXPk7x2rE6FZACmLePPgJEcY4rm1GSHkwTZ