Моя задумка: Выделить в отдельную заметку, как можно поднять VPN туннель с использованием технологии WireGuard. WireGuard позволяет создать защищенный туннель через который передаются Ваши данные и посторонние не могут прочитать передаваемую информацию.

WireGuard используют для таких задач, как:

1) VPN для интернета — направлять интернет-трафик через удаленный сервер.

2) Защита данных — шифровать соединение в публичных Wi-Fi сетях.

3) Удаленный доступ — Подключаться к домашней или корпоративной сети из любой точки мира.

4) Объединение сетей — соединять несколько офисов или серверов в одну виртуальную сеть.

5) Обход сетевых ограничений

Если для 1 и 5 и использую в боевом режиме, то хочу разобрать стенд, как собрать туннель между двумя узлами дабы в последствии проработать последующую наработку по созданию каскадирования.

Проработку задуманного буду производить под тестовым стендом Proxmox 8.2.2

Шаг №1: Разворачиваю OS: Ubuntu 22.04 LTS Server это будет в моем разборе серверная станция, т.е. у нее протокол WireGuard будет использовать серверный конфигурационный файл:

  • OS: Ubuntu 22.04 LTS Server
  • Hostname: srv-server
  • IP: 172.33.33.18
  • Network Device: vbmr0

Шаг №2: Опираясь на свои наработки после разворачивания операционной системы произвожу преднастройку с использованием собственного скрипта, у Вас это свои настройки или вообще ничего:

ekzorchik@srv-server:~$ sudo ./tips_ubuntu_22_04_preconfigure_v1.sh
ekzorchik@srv-server:~$ sudo reboot
ekzorchik@srv-server:~$ uname -a && lsb_release -a
Linux srv-server 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.5 LTS
Release:        22.04
Codename:       jammy
ekzorchik@srv-server:~$

Шаг №3: Чтобы на системе, которая выступает, как WireGuard—сервер работал NAT, нужно включить IP—пересылку:

ekzorchik@srv-server:~$ echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.conf
ekzorchik@srv-server:~$ echo 'net.ipv4.conf.all.src_valid_mark=1' | sudo tee -a /etc/sysctl.d/99-ip-forward.conf
ekzorchik@srv-server:~$ sudo sysctl --system

Шаг №4: Поднимаем на системе srv-server - WireGuard сервер:

ekzorchik@srv-server:~$ sudo apt-get install -y wireguard-dkms wireguard-tools resolvconf
ekzorchik@srv-server:~$ sudo nano /etc/modules-load.d/wireguard.conf
wireguard
ekzorchik@srv-server:~$ sudo reboot
ekzorchik@srv-server:~$ lsmod | grep wireguard
wireguard              94208  0
curve25519_x86_64      36864  1 wireguard
libchacha20poly1305    16384  1 wireguard
libcurve25519_generic    49152  2 curve25519_x86_64,wireguard
ip6_udp_tunnel         20480  1 wireguard
udp_tunnel             28672  1 wireguard
ekzorchik@srv-server:~$

Шаг №5: Устанавливаю в систему надстройку над правилами iptables в лице firewalld:

ekzorchik@srv-server:~$ apt-cache show firewalld | grep Version
Version: 1.1.1-1ubuntu1
ekzorchik@srv-server:~$ nano tips_ubuntu_22_04_firewalld_v1.sh
#!/bin/bash
#Install Firewalld + SSH port (22/tcp)
sudo ufw disable
sudo apt-get install -y firewalld
sudo systemctl enable firewalld
sudo systemctl start firewalld
sudo firewall-cmd --state
#ip r | awk '{print $5}' | head -n1
#eth0
sudo firewall-cmd --zone public --change-interface=$(ip r | awk '{print $5}' | head -n1) --permanent
sudo firewall-cmd --remove-service=ssh --permanent
sudo firewall-cmd --zone public --add-port=22/tcp --permanent
sudo firewall-cmd --reload
echo "Current RULES for Zone PUBLIC"
sudo firewall-cmd --zone=public --list-all
ekzorchik@srv-server:~$ chmod +x tips_ubuntu_22_04_firewalld_v1.sh
ekzorchik@srv-server:~$ sudo ./tips_ubuntu_22_04_firewalld_v1.sh

Шаг №6: Создадим пару закрытого и открытого ключа на системе VPS которая выступает, как сервер Wireguard — это система srv-server:

ekzorchik@srv-server:~$ wg genkey | sudo tee /etc/wireguard/serverprivatekey
0F2QTZVjTzJg/DFgJgJb9jSLR99VoTSD0/uZppVTG0s=
ekzorchik@srv-server:~$
ekzorchik@srv-server:~$ sudo bash -c "wg pubkey < /etc/wireguard/serverprivatekey > /etc/wireguard/serverpubkey"
ekzorchik@srv-server:~$ sudo bash -c "cat /etc/wireguard/serverpubkey"
092h1RZWaj58Ebx8s5vsE5OOPuDDIHud2qXlwSQzlW0=
ekzorchik@srv-server:~$

Подведем итог:

  • <PRIVATE_KEY_SERVER>: 0F2QTZVjTzJg/DFgJgJb9jSLR99VoTSD0/uZppVTG0s=
  • <PUBLIC_KEY_SERVER: 092h1RZWaj58Ebx8s5vsE5OOPuDDIHud2qXlwSQzlW0=

Шаг №7: Файл privatekey не должен быть доступен для чтения для обычных пользователей на системе (Hostname: srv-server):

ekzorchik@srv-server:~$ sudo chmod 600 /etc/wireguard/serverprivatekey

Шаг №8: Создаю публичный ключ для srv-client:

ekzorchik@srv-server:~$ wg genkey | sudo tee /etc/wireguard/srv-clientprivatekey
yLGwFvqexOs2IVBo4ha6qmkbRz9Y0BM9CS1S96+zn38=

Шаг №9: Создаю приватный ключ для srv-client:

ekzorchik@srv-server:~$ sudo bash -c "wg pubkey < /etc/wireguard/srv-clientprivatekey > /etc/wireguard/srv-clientpublickey"
ekzorchik@srv-server:~$ sudo bash -c "cat /etc/wireguard/srv-clientpublickey"
RzswVSMgWZLr/vsHU1t3/1+QOoUTkJdgN+ed6JG/7FA=
ekzorchik@srv-server:~$

Подведем итог:

  • <PRIVATE_KEY_Client>: yLGwFvqexOs2IVBo4ha6qmkbRz9Y0BM9CS1S96+zn38=
  • <PUBLIC_KEY_Client>: RzswVSMgWZLr/vsHU1t3/1+QOoUTkJdgN+ed6JG/7FA=

после перенесу эти ключи на клиентскую систему

Шаг №10: Настраиваю wg0.conf на хосте srv-server которую я предопределил как сервер:

ekzorchik@srv-server:~$ sudo nano /etc/wireguard/wg0.conf
[Interface]
#cat /etc/wireguard/serverprivatekey
PrivateKey = 0F2QTZVjTzJg/DFgJgJb9jSLR99VoTSD0/uZppVTG0s=
#Внутренний адрес сервера
Address = 50.50.50.1/24
#MTU = 1420
#Порт на котором мой сервер будет принимать подключения
ListenPort = 53114
#Table =

#в качестве брандмауэера я буду использовать надстройку над правилами iptables => firewalld
#ip r | awk ‘{print $5}’ | head -n1 #eth0
PreUp = sysctl -w net.ipv4.ip_forward=1
PreUp = sysctl -w net.ipv4.conf.all.src_valid_mark=1
PostUp = firewall-cmd --zone=external --add-masquerade --permanent
PostUp = firewall-cmd --zone=external --add-port=53114/udp --permanent
PreDown = sysctl -w net.ipv4.ip_forward=0
PreDown = sysctl -w net.ipv4.conf.all.src_valid_mark=0
PostDown = firewall-cmd --zone=external --remove-masquerade --permanent
PostDown = firewall-cmd --zone=external --remove-port=53114/udp --permanent
#Секция настройки клиента
#Client
[Peer]
#cat /etc/wireguard/srv-clientpublickey
PublicKey = RzswVSMgWZLr/vsHU1t3/1+QOoUTkJdgN+ed6JG/7FA=
AllowedIPs = 50.50.50.4/32

Шаг №11: Активирую работу сервиса WireGuard после перезагрузки сервера (srv-server), чтобы он включался автоматически:

ekzorchik@srv-server:~$ sudo systemctl enable wg-quick@wg0.service
ekzorchik@srv-server:~$ sudo systemctl restart wg-quick@wg0.service
ekzorchik@srv-server:~$ sudo wg show wg0
interface: wg0
  public key: 092h1RZWaj58Ebx8s5vsE5OOPuDDIHud2qXlwSQzlW0=
  private key: (hidden)
  listening port: 53114

peer: RzswVSMgWZLr/vsHU1t3/1+QOoUTkJdgN+ed6JG/7FA=
  allowed ips: 50.50.50.4/32
ekzorchik@srv-server:~$

Шаг №12: Сейчас в системе srv-server значатся интерфейсы:

ekzorchik@srv-server:~$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000
    link/ether bc:24:11:a6:93:75 brd ff:ff:ff:ff:ff:ff
    altname enp0s18
    inet 172.33.33.18/24 metric 100 brd 172.33.33.255 scope global dynamic ens18
       valid_lft 1650sec preferred_lft 1650sec
    inet6 fe80::be24:11ff:fea6:9375/64 scope link
       valid_lft forever preferred_lft forever
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none
    inet 50.50.50.1/24 scope global wg0
       valid_lft forever preferred_lft forever
ekzorchik@srv-server:~$

Шаг №13: Создаю зоны работы firewalld, чтобы была внешняя зона (external - ens18) и зона VPN туннеля (internal -wg0):

ekzorchik@srv-server:~$ sudo firewall-cmd --zone=public --remove-interface=$(ip r | awk '{print $5}' | head -n1) --permanent
success
ekzorchik@srv-server:~$ sudo firewall-cmd --zone=external --add-interface=$(ip r | awk '{print $5}' | head -n1) --permanent
success
ekzorchik@srv-server:~$ sudo firewall-cmd --zone=external --add-port=22/tcp --permanent
success
ekzorchik@srv-server:~$ sudo firewall-cmd --zone=internal --add-interface=$(ip r | awk '{print $3}' | grep '^wg0$') --permanent
success
ekzorchik@srv-server:~$ sudo firewall-cmd --reload

Шаг №14: Разрешаем транзитный трафик между зонами firewalld:

ekzorchik@srv-server:~$ sudo firewall-cmd --permanent --new-policy client-to-inet
ekzorchik@srv-server:~$ sudo firewall-cmd --permanent --policy client-to-inet --set-target ACCEPT
ekzorchik@srv-server:~$ sudo firewall-cmd --permanent --policy client-to-inet --add-ingress-zone internal
ekzorchik@srv-server:~$ sudo firewall-cmd --permanent --policy client-to-inet --add-egress-zone external
ekzorchik@srv-server:~$ sudo firewall-cmd --reload

На заметку:

—add-ingress-zone internal — указать зону, из которой приходит трафик.

—add-egress-zone external — указать зону, в которую направляется трафик.

Шаг №15: Применяю изменения wg0.conf & firewalld:

ekzorchik@srv-server:~$ sudo systemctl restart wg-quick@wg0.service
ekzorchik@srv-server:~$ sudo firewall-cmd --reload

Шаг №16: Разворачиваю OS: Ubuntu 22.04 LTS Server это будет в моем разборе клиентская станция, т.е. у нее протокол WireGuard будет использовать клиентский конфигурационный файл:

  • OS: Ubuntu 22.04 LTS Server
  • Hostname: srv-client
  • IP: 172.33.33.11
  • Network Device: vbmr0

Шаг №17: Опираясь на свои наработки после разворачивания операционной системы произвожу преднастройку с использованием собственного скрипта, у Вас это свои настройки или вообще ничего:

ekzorchik@srv-client:~$ sudo ./tips_ubuntu_22_04_preconfigure_v1.sh
ekzorchik@srv-client:~$ sudo reboot
ekzorchik@srv-client:~$ uname -a && lsb_release -a
Linux srv-client 5.15.0-187-generic #197-Ubuntu SMP Fri Jul 17 19:17:01 UTC 2026 x86_64 x86_64 x86_64 GNU/Linux
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 22.04.5 LTS
Release:        22.04
Codename:       jammy
ekzorchik@srv-client:~$

Шаг №18: Чтобы на системе, которая выступает, как WireGuard—клиент работал NAT, нужно включить IP—пересылку:

ekzorchik@srv-client:~$ echo 'net.ipv4.ip_forward=1' | sudo tee /etc/sysctl.d/99-ip-forward.conf

ekzorchik@srv-client:~$ echo 'net.ipv4.conf.all.src_valid_mark=1' | sudo tee -a /etc/sysctl.d/99-ip-forward.conf

ekzorchik@srv-client:~$ sudo sysctl --system

Шаг №19: Поднимаем на системе srv-client - WireGuard клиент:

ekzorchik@srv-client:~$ sudo apt-get install -y wireguard-dkms wireguard-tools resolvconf

ekzorchik@srv-client:~$ sudo nano /etc/modules-load.d/wireguard.conf

wireguard

ekzorchik@srv-client:~$ sudo reboot

ekzorchik@srv-client:~$ lsmod | grep wireguard

wireguard              94208  0

curve25519_x86_64      36864  1 wireguard

libchacha20poly1305    16384  1 wireguard

libcurve25519_generic    49152  2 curve25519_x86_64,wireguard

ip6_udp_tunnel         20480  1 wireguard

udp_tunnel             28672  1 wireguard

Шаг №20: Устанавливаю в систему (Hostname: srv-client) надстройку над правилами iptables в лице firewalld:

ekzorchik@srv-client:~$ apt-cache show firewalld | grep Version

Version: 1.1.1-1ubuntu1

ekzorchik@srv-client:~$ nano tips_ubuntu_22_04_firewalld_v1.sh

#!/bin/bash

#Install Firewalld + SSH port (22/tcp)

sudo ufw disable

sudo apt-get install -y firewalld

sudo systemctl enable firewalld

sudo systemctl start firewalld

sudo firewall-cmd --state

#ip r | awk '{print $5}' | head -n1

#eth0

sudo firewall-cmd --zone public --change-interface=$(ip r | awk '{print $5}' | head -n1) --permanent

sudo firewall-cmd --remove-service=ssh --permanent

sudo firewall-cmd --zone public --add-port=22/tcp --permanent

sudo firewall-cmd --reload

echo "Current RULES for Zone PUBLIC"

sudo firewall-cmd --zone=public --list-all

ekzorchik@srv-client:~$ chmod +x tips_ubuntu_22_04_firewalld_v1.sh

ekzorchik@srv-client:~$ sudo ./tips_ubuntu_22_04_firewalld_v1.sh

Шаг №21: Настраиваю wg0.conf на хосте srv-client которую я предопределил как клиент:

ekzorchik@srv-client:~$ sudo nano /etc/wireguard/wg0.conf

[Interface]

#cat /etc/wireguard/srv-clientprivatekey

PrivateKey = yLGwFvqexOs2IVBo4ha6qmkbRz9Y0BM9CS1S96+zn38=

# Адрес и маска

#[Peer] должны быть одинаковыми и на клиенте, и на сервере

# не обязательно

Address = 50.50.50.4/24

DNS = 8.8.8.8

[Peer]

#wg show wg0

#public key

#cat /etc/wireguard/serverpubkey

PublicKey = 092h1RZWaj58Ebx8s5vsE5OOPuDDIHud2qXlwSQzlW0=

#Endpoint = SERVER_IP_ADDRESS:PORT

Endpoint = 172.33.33.18:53114

#нужно не 0.0.0.0/0 прописывать, а 50.50.50.1/32

AllowedIPs = 50.50.50.1/32

#Key connection alive ##

PersistentKeepalive = 15

ekzorchik@srv-client:~$ sudo systemctl enable wg-quick@wg0.service

ekzorchik@srv-client:~$ sudo systemctl restart wg-quick@wg0.service

Шаг №22: Проверяю, что туннель установился:

ekzorchik@srv-client:~$ sudo wg show wg0

interface: wg0

  public key: RzswVSMgWZLr/vsHU1t3/1+QOoUTkJdgN+ed6JG/7FA=

  private key: (hidden)

  listening port: 60941

 

peer: 092h1RZWaj58Ebx8s5vsE5OOPuDDIHud2qXlwSQzlW0=

  endpoint: 172.33.33.18:53114

  allowed ips: 50.50.50.1/32

  latest handshake: 33 seconds ago

  transfer: 696 B received, 15.91 KiB sent

  persistent keepalive: every 15 seconds

ekzorchik@srv-client:~$

Шаг №23: Сейчас в системе srv-client значатся интерфейсы:

ekzorchik@srv-client:~$ ip a

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000

    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00

    inet 127.0.0.1/8 scope host lo

       valid_lft forever preferred_lft forever

    inet6 ::1/128 scope host

       valid_lft forever preferred_lft forever

2: ens18: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc fq_codel state UP group default qlen 1000

    link/ether bc:24:11:17:5e:a9 brd ff:ff:ff:ff:ff:ff

    altname enp0s18

    inet 172.33.33.11/24 metric 100 brd 172.33.33.255 scope global dynamic ens18

       valid_lft 1188sec preferred_lft 1188sec

    inet6 fe80::be24:11ff:fe17:5ea9/64 scope link

       valid_lft forever preferred_lft forever

4: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000

    link/none

    inet 50.50.50.4/24 scope global wg0

       valid_lft forever preferred_lft forever

ekzorchik@srv-client:~$

Шаг №24: Создаю зоны работы firewalld, чтобы была внешняя зона (external - ens18) и зона VPN туннеля (internal -wg0):

ekzorchik@srv-client:~$ sudo firewall-cmd --zone=public --remove-interface=$(ip r | awk '{print $5}' | head -n1) --permanent

success

ekzorchik@srv-client:~$ sudo firewall-cmd --zone=external --add-interface=$(ip r | awk '{print $5}' | head -n1) --permanent

success

ekzorchik@srv-client:~$ sudo firewall-cmd --zone=external --add-port=22/tcp --permanent

success

ekzorchik@srv-client:~$ sudo firewall-cmd --zone=internal --add-interface=$(ip r | awk '{print $3}' | grep '^wg0$') --permanent

success

ekzorchik@srv-client:~$ sudo firewall-cmd --reload

Шаг №25: Разрешаем транзитный трафик между зонами firewalld на хосте srv-client:

ekzorchik@srv-client:~$ sudo firewall-cmd --permanent --new-policy client-to-inet

ekzorchik@srv-client:~$ sudo firewall-cmd --permanent --policy client-to-inet --set-target ACCEPT

ekzorchik@srv-client:~$ sudo firewall-cmd --permanent --policy client-to-inet --add-ingress-zone internal

ekzorchik@srv-client:~$ sudo firewall-cmd --permanent --policy client-to-inet --add-egress-zone external

ekzorchik@srv-client:~$ sudo firewall-cmd --reload

На заметку:

—add-ingress-zone internal — указать зону, из которой приходит трафик.

—add-egress-zone external — указать зону, в которую направляется трафик.

Шаг №26: Проверяю, что клиент видит сервер через ping-запрос:

ekzorchik@srv-client:~$ ping 50.50.50.1

PING 50.50.50.1 (50.50.50.1) 56(84) bytes of data.

64 bytes from 50.50.50.1: icmp_seq=1 ttl=64 time=0.668 ms

^C

--- 50.50.50.1 ping statistics ---

1 packets transmitted, 1 received, 0% packet loss, time 0ms

rtt min/avg/max/mdev = 0.668/0.668/0.668/0.000 ms

ekzorchik@srv-client:~$

Работает.

Шаг №27: А чтобы трафик с клиента шел через сервер (50.50.50.1), в wg0.conf на клиенте меняем:

sudo nano /etc/wireguard/wg0.conf

#AllowedIPs = 50.50.50.1/32

на

AllowedIPs = 0.0.0.0/0

sudo systemctl restart wg-quick@wg0.service

Работает. По итогу могу сказать для самого себя что вывел в отдельную заметку связку клиент — сервер. Хотя в принципе у меня уже есть такой функционал, т.к. работает мой почтовый домен @ekzorchik.ru & @ekzorchik.com.

На этом пока все, с уважением автор блога ekzorchik.