Сегодня я составлю себе подробный гайд, как подключить свой смартфон Honor 9X к сети VPN на базе Wireguard туннеля, т.е. смогу выходить в интернет под WAN-IP своей арендованной VDS системы которой посредством записи A назначено доменное имя mail.ekzorchik.com. Уже опираясь на эту заметку и ранее опубликованные можно будет где-нибудь зарубежом купить VDS систему и выходить в интернет как-бы от туда.

Итак, что понадобится для реализации задуманного

  • Купленный виртуальная машина по ссылке за каких-то 190р в месяц с характеристиками (2vCPU, RAM=1Gb, HDD=30Gb) и ось на ней Ubuntu 20.04 Server
  • Установлена серверная часть Wireguard см заметку "Поднимем WireGuard VPN туннель на Ubuntu 20.04"
  • Смартфон Honor 9X

Шаг №1: Устанавливаем на смартфон приложение через Google Play именуемое как: Wireguard (у меня версия: 1.0.20220516) от WireGuard Development Team:

Шаг №2: Устанавливаю на VDS систему пакет qrencode, посредством него из сформированного конфигурационного файла для клиента создадим QR-код картинки считав которую приложением Wireguard на смартфоне импортируем настройки подключения к VPN туннелю:

sudo apt-get install -y qrencode

Шаг №3: Подключаюсь на VDS систему по SSH:

ekzorchik@ekzhome:~$ ssh -l root mail.ekzorchik.com -p 20321

Шаг №4: Узнаю публичный ключ серверной части Wireguard на системе Ubuntu 20.04 Server:

root@ekzorchik:~# cat /etc/wireguard/pubkey 
poBHB2BuLmHI617tWKS0Wur3MTMpxBYbO3dE3Jn6-V0=
root@ekzorchik:~#

Шаг №5: Создаю публичный ключ для своего смартфона Honor 9X:

root@ekzorchik:~# wg genkey | sudo tee /etc/wireguard/honor9xprivatekey
zOsrRtuJq+ZN4v1VbLM2KZ1jc5ZG+lW4t1JfC4zxxk0= 
root@ekzorchik:~# sudo bash -c "wg pubkey < /etc/wireguard/honor9xprivatekey > /etc/wireguard/honor9xpubkey" 
root@ekzorchik:~# sudo bash -c "cat /etc/wireguard/honor9xpubkey"
FaCKKRrC1rxzfw6zVfEKXCvFXoFWpx9oZ3TOv3xt4h4=
root@ekzorchik:~#

Шаг №6: Прописываю на сервере еще одного клиента, а именно клиента на базе смартфона Honor 9X:

root@ekzorchik:~# sudo nano /etc/wireguard/wg0.conf 
[Interface]
#указываю имя приватного ключа сервера, sudo bash -c "cat /etc/wireguard/privatekey"
PrivateKey = KDWC-brrCgI21oV6Z0qLuN8OusDHd2VGMSSbJ154Zkg= 
#Внутренний адрес сервера
Address = 10.0.0.1/24
#Порт на котором мой сервер будет принимать подключения 
ListenPort = 31200
#в качестве брандмауэера я буду использовать надстройку над правилами iptables => firewalld
#ip r | awk ‘{print $5}’ | head -n1 #eth0
PostUp = firewall-cmd --zone=external --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -I wg0 -o eth0 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE; firewall-cmd --add-port=31200/udp
PostDown = firewall-cmd --zone=external --remove-masquerade; firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -I wg0 -o eth0 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o eth0 -j MASQUERADE; firewall-cmd --remove-port=31200/udp

#Секция настройки клиента
#Client
[Peer]
# Подставьте сюда публичный ключ клиента 
#sudo bash -c "cat /etc/wireguard/publickey"
PublicKey = 1IL/tdn/l72JELiLLD8syIP71WQ7L6er9gI/hAxcjlk= 
# внутренний ip адрес клиента (client1) # и здесь же указывается подсеть за клиентом чтобы можно было настроить и заработал проброс порта AllowedIPs = 10.0.0.2/32, 172.33.2.0/24

[Peer]
PublicKey = Nm1cJ6cPSbVIlDZtny0wXKd9A6yoKzdAuFC0T+LQGE8=
AllowedIPs = 10.0.0.3/32, 172.33.2.0/24

[Peer]
#root@ekzorchik:~# cat /etc/wireguard/honor9xpubkey
PublicKey = FaCKKRrC1rxzfw6zVfEKXCvFXoFWpx9oZ3TOv3xt4h4= 
#сеть 172.33.2.0/24 не прописываю, т.к. за смартфоном нет такой сети.
AllowedIPs = 10.0.0.4/32
root@ekzorchik:~#

Шаг №7: Перезапускаю интерфейс Wireguard для принятия настроек добавления нового Peer:

root@ekzorchik:~# sudo wg-quick down wg0 && sudo wg-quick up wg0

Шаг №8: Создаю конфигурацию для смартфона Honor 9X:

root@ekzorchik:~# nano honor9x.conf 
[Interface]
#PrivateKey = CLIENT_PRIVATE_KEY 
# root@ekzorchik:~# cat /etc/wireguard/honor9xprivatekey 
zOsrRtuJq+ZN4v1VbLM2KZ1jc5ZG+lW4t1JfC4zxxk0= 
# Адрес и маска
#[Peer] должны быть одинаковыми и на клиенте, и на сервере
# не обязательно
Address = 10.0.0.4/32
DNS = 8.8.8.8
 
[Peer]
#PublicKey = SERVER_PUBLIC_KEY 
#cat /etc/wireguard/pubkey
PublicKey = poBHB2BuLmHI617tWKS0Wur3MTMpxBYbO3dE3Jn6-V0= 
#Endpoint = SERVER_IP_ADDRESS:PORT
Endpoint = mail.ekzorchik.com:31200 AllowedIPs = 0.0.0.0/0
#Key connection alive ##
PersistentKeepalive = 15

Шаг №9: Теперь можно создать QR код на основе нашего конфига:

root@ekzorchik:~# qrencode -t png -o honor9x.png -r honor9x.conf
root@ekzorchik:~# file honor9x.png honor9x.png: PNG image data, 243 x 243, 1-bit colormap, non-interlaced 
root@ekzorchik:~#

Шаг №10: Копирую любым способом сформированное изображение на компьютер

Подключаюсь к Ubuntu 20.04 через клиент WinSCP скачиваю картинку

открываю картинку

смартфоном считываю qr код

Именую импортируемое соединение, как vpnguard подключаюсь

На смартфоне Honor 9x активирую импортированную конфигурацию

На заметку: После следует удалить самым тщательным образом qr-код картинку или переместить в соответствующую папку если такая предусмотрена Вами.

Шаг №11: Проверяю на сервере что соединение установлено, смотрим часть посвященную IP: 10.0.0.4 где указывается даже WAN-IP смартфона который на момент выхода в интернет через SIM-карту или Wi-Fi присвоился провайдером:

root@ekzorchik:~# wg show wg0
interface: wg0
  public key: poBHB2BuLmHI617tWKS0Wur3MTMpxBYbO3dE3Jn6-V0=
  private key: (hidden)
  listening port: 31200

peer: FaCKKRrC1rxzfw6zkfEKXCvFXoFWpx9oZ3TOv3xt4h4=
  endpoint: 133.59.172.123:38231
  allowed ips: 10.0.0.4/32
  latest handshake: 4 days, 4 hours, 57 minutes, 54 seconds ago
  transfer: 11.53 MiB received, 97.56 MiB sent

peer: Nm1cJ6cPSbVIlDZtny1wXKd9A6yoKzdAuFC0T+LQGE8=
  endpoint: 176.192.156.221:39984
  allowed ips: 10.0.0.3/32, 172.33.2.0/24
  latest handshake: 4 days, 23 hours, 2 minutes, 41 seconds ago
  transfer: 1.53 MiB received, 4.41 MiB sent

peer: 1IL/tdn/l72JELiLLD3syIP71WQ7L6er9gI/hAxcjlk=
  allowed ips: 10.0.0.2/32
root@ekzorchik:~# 
root@ekzorchik:~# ping 10.0.0.4 
PING 10.0.0.4 (10.0.0.4) 56(84) bytes of data.
64 bytes from 10.0.0.4: icmp_seq=1 ttl=64 time=62.2 ms ^C
--- 10.0.0.4 ping statistics --- 
2 packets transmitted, 1 received, 50% packet loss, time 1001ms rtt min/avg/max/mdev = 62.235/62.235/62.235/0.000 ms 
root@ekzorchik:~#

Шаг №12: Проверяю на смартфоне какой Wan-IP у меня на Honor 9X

Запускаю браузер и открываю URL https://myip.ru и вижу WAN-IP моего сервера с Ubuntu 20.04 Server

Ваш IP-адрес: 2.57.186.62

Имя вашего хоста: mail.ekzorchik.com

Смартфон Honor 9X выходит в интернет с адреса mail.ekzorchik.com

Шаг №13: Советую на сервере где серверная часть wireguard в каталоге /etc/wireguard создать каталог clients и уже в нем создавать клиентские конфигурационные файлы для смартфонов, планшетов:

root@ekzorchik:~# sudo mkdir /etc/wireguard/clients

чтобы потом если конфигурационных файлов много посредством скрипта сформировать QR-коды на распространение подключения:

root@ekzorchik:~# sudo mkdir /etc/wireguard/scripts
root@ekzorchik:~# sudo nano /etc/wireguard/scripts/qr.sh
#!/bin/bash
for w in /etc/wireguard/clients/*.conf
do
echo "Creating ${w}.png QR code file …"
qrencode -t png -o "${w}.png" -r "${w}"
done
root@ekzorchik:~# sudo chmod +x /etc/wireguard/scripts/qr.sh
root@ekzorchik:~# sudo /etc/wireguard/scripts/qr.sh 
Creating /etc/wireguard/clients/honor9x.conf.png QR code file ...
root@ekzorchik:~# ls /etc/wireguard/clients/honor9x.conf.png 
/etc/wireguard/clients/honor9x.conf.png
root@ekzorchik:~#

Круто. Т.е у меня получилось приобщить свой смартфон к VPN на базе Wireguard с целью объединения систем в одну сеть и получив доступ к ресурсам за сетью и единой точки выхода в интернет, будь-то смартфон или система Ubuntu.

На заметку: Важный нюанс по данной заметке, у меня в заметках используется утилита firewalld версии 0.8.2OS: Ubuntu 20.04 где Wireguard работает в качестве сервера — все работает, как и написано в заметках моего блога), а начиная с версии 1.0

root@ekzorchik:~# dpkg -l | grep firewalld | head -n 1
ii firewalld 0.8.2-1 all dynamically managed firewall with support for network zones
root@ekzorchik:~#

по умолчанию блокируется транзитный трафик между зонами хоть и включена настройка net.ipv4.ip_forward=1, это дело не меняет. А в Ubuntu 22.04 уже устанавливается версия firewalld = 1.1.1-1ubuntu1 и все применяя к ней исходя из моих заметок получается что не работает, т.е. если Вы на Ubuntu 22.04 Server поднимаете Wireguard-сервер, в этом случае нужно разрешить прохождение трафика с помощью policy object, к примеру создав правило: client-to-inet

firewall-cmd --permanent --new-policy client-to-inet
firewall-cmd --permanent --policy client-to-inet --set-target ACCEPT
firewall-cmd --permanent --policy client-to-inet --add-ingress-zone internal
firewall-cmd --permanent --policy client-to-inet --add-egress-zone external
firewall-cmd --reload

после интернет при подключении через Wireguard с клиентской системы к Ubuntu 22.04 Server (Wireguard-сервер) начинает работать, а туннель как устанавливался так и устанавливается.

Заметка работоспособна, на этом я прощаюсь, с уважением автор блога Олло Александр aka ekzorchik.