Моя задумка: Выделить в отдельную заметку, как можно поднять 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 ServerHostname: srv-serverIP: 172.33.33.18Network 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 ServerHostname: srv-clientIP: 172.33.33.11Network 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.