Как установить и настроить Wireguard на Debian 12
WireGuard — это современный, высокопроизводительный и простой в использовании протокол для создания защищённых сетевых туннелей (VPN). Он используется в профессиональных целях для создания защищённых корпоративных VPN-сетей, обеспечивая безопасный и высокопроизводительный доступ сотрудников к ресурсам компании из любой точки мира.
Настройка системы
Чтобы входящие пакеты направлялись правильно, нужно включить пересылку сетевых пакетов на уровне ядра. Добавьте следующие строки в конец файла /etc/sysctl.conf
:
# WireGuard #
net.ipv4.ip_forward = 1
net.ipv4.conf.all.forwarding = 1
Для применения изменений, выполняем ниже команду, чтобы система перечитала конфигурацию:
sudo sysctl -p
Установка WireGuard
Устанавливаем WireGuard:
sudo apt-get install wireguard -y
Посмотреть установленную версию WireGuard:
wg --version
Настройка
WireGuard использует пары ключей для создания безопасных и зашифрованных соединений между одноранговыми узлами. Каждый клиент или сервер WireGuard использует уникальный закрытый ключ для создания публичного ключа. Закрытый ключ подписывает исходящий трафик и расшифровывает входящий трафик, а открытый ключ шифрует трафик от других одноранговых узлов при отправке трафика на сервер.
Серверная часть
Сгенерируем закрытый ключ для сервера WireGuard и сохраним его в каталоге /etc/wireguard/
.
wg genkey | sudo tee /etc/wireguard/private.key
Вывод:
+E0z2nYOezr5oHWASuMJJEGXTouBrdyhK7DKxyE8iEQ=
Используем полученный закрытый ключ для генерации открытого ключа.
sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key
Вывод:
O1fiUPB73tNIJGPgsjuA613N3VBuA/KuQp8xPjwJwnU=
Создаем файл конфигурации интерфейса WireGuard — /etc/wireguard/wg0.conf
и добавляем в него следующие параметры. Замените +E0z2nYOezr5oHWASuMJJEGXTouBrdyhK7DKxyE8iEQ=
на закрытый ключ сервера, который сгенерировали ранее.
[Interface]
PrivateKey = +E0z2nYOezr5oHWASuMJJEGXTouBrdyhK7DKxyE8iEQ=
Address = 10.0.0.1/24
ListenPort = 51820
Приведённая выше конфигурация создаёт новый интерфейс wg0
и 10.0.0.1
в качестве адреса туннеля. Пояснения по конфигурации:
[Interface]
: Серверный интерфейс WireGuard.PrivateKey
: Серверный закрытый ключ WireGuard.Address
: IP-адрес интерфейса WireGuard.ListenPort
: UDP-порт, который интерфейс WireGuard для прослушивания входящих VPN-соединений. Значение51820
— это номер порта по умолчанию для интерфейсов WireGuard .
ListenPort
, в случае если интерфейс WireGuard смотрит в интернет.Клиентская часть
Сгенерируем закрытый ключ клиента WireGuard.
wg genkey | tee client1_private.key
Вывод:
gHVZgu6TsxQj+SRQl9OK8gIJ8w71h4v7mdUUIxb/7nw=
Используем полученный закрытый ключ для генерации нового открытого ключа.
cat client1_private.key | wg pubkey | tee client1_public.key
Вывод:
n2nSd/oOVlukX4wx2y4p5IPF3XETA/3gOjI8zSUpFlg=
В файл конфигурации интерфейса WireGuard — /etc/wireguard/wg0.conf
, добавляем следующие параметры клиента WireGuard в конец файла. Замените n2nSd/oOVlukX4wx2y4p5IPF3XETA/3gOjI8zSUpFlg=
на фактический открытый ключ клиента, который мы сгенерировали ранее.
[Peer]
PublicKey = n2nSd/oOVlukX4wx2y4p5IPF3XETA/3gOjI8zSUpFlg=
AllowedIPs = 10.0.0.2/32
Приведённые выше директивы конфигурации WireGuard позволяют новому клиенту WireGuard подключиться к интерфейсу с IP-адресом туннеля 10.0.0.2
.
Создаем файл конфигурации клиента WireGuard — /etc/wireguard/client1.conf
и добавляем в него следующие параметры. Замените gHVZgu6TsxQj+SRQl9OK8gIJ8w71h4v7mdUUIxb/7nw=
на фактический закрытый ключ вашего клиента, а O1fiUPB73tNIJGPgsjuA613N3VBuA/KuQp8xPjwJwnU=
на значения открытого ключа вашего сервера WireGuard, которые вы сгенерировали ранее.
[Interface]
PrivateKey = gHVZgu6TsxQj+SRQl9OK8gIJ8w71h4v7mdUUIxb/7nw=
Address = 10.0.0.2/32
[Peer]
PublicKey = O1fiUPB73tNIJGPgsjuA613N3VBuA/KuQp8xPjwJwnU=
Endpoint = 192.0.2.4:51820
AllowedIPs = 10.0.0.0/24
Приведённая выше конфигурация клиента создаёт новое туннельное соединение, используя 192.0.2.4
в качестве общедоступного IP-адреса сервера WireGuard. Пояснения по конфигурации:
[Interface]
: Клиентский интерфейс WireGuard.PrivateKey
: Клиентский закрытый ключ WireGuard при шифровании трафика.Address
: IP-адрес клиента WireGuard при подключении к VPN-туннелю.
[Peer]
: Настройка удаленного однорангового сервера WireGuard.PublicKey
: Открытый ключ сервера WireGuard.Endpoint
: Общедоступный IP-адрес и порт целевого сервера WireGuard.AllowedIPs
: IP-адрес клиента, подключения к которому разрешены через VPN-туннель. Если установлено значение0.0.0.0/0
, клиент WireGuard перенаправляет весь сетевой трафик в VPN-туннель.
Дополнительная безопасность
Кроме публичных и приватных ключей, есть еще опция PresharedKey
, которая обеспечивает дополнительное шифрование симметричным шифром. Ключ можно сгенерировать, например, командой wg genpsk
и добавить в опцию PresharedKey
в секциях Peer
в серверной и клиентской конфигурации.
Управление системными процессами WireGuard
WireGuard использует утилиту wg-quick
для управления всеми туннельными интерфейсами на сервере.
Включение автоматического запуска интерфейса WireGuard — wg0
при загрузке системы.
sudo systemctl enable wg-quick@wg0
Запустить интерфейс WireGuard — wg0
.
sudo systemctl start wg-quick@wg0
Посмотреть состояние интерфейса WireGuard — wg0
.
sudo systemctl status wg-quick@wg0
Вывод:
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; preset: enabled)
Active: active (exited) since Sun 2024-07-28 20:08:52 UTC; 12s ago
Docs: man:wg-quick(8)
man:wg(8)
https://www.wireguard.com/
https://www.wireguard.com/quickstart/
https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8
https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8
Process: 1318 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS)
Main PID: 1318 (code=exited, status=0/SUCCESS)
CPU: 18ms
Jul 28 20:08:52 vultr systemd[1]: Starting wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0...
Jul 28 20:08:52 vultr wg-quick[1318]: [#] ip link add wg0 type wireguard
Jul 28 20:08:52 vultr wg-quick[1318]: [#] wg setconf wg0 /dev/fd/63
Jul 28 20:08:52 vultr wg-quick[1318]: [#] ip -4 address add 10.0.0.1/24 dev wg0
Jul 28 20:08:52 vultr wg-quick[1318]: [#] ip link set mtu 1420 up dev wg0
Jul 28 20:08:52 vultr systemd[1]: Finished wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0.
Остановить интерфейс WireGuard — wg0
.
sudo systemctl stop wg-quick@wg0
Перезапустить интерфейс WireGuard — wg0
.
sudo systemctl restart wg-quick@wg0
Так же для применения новых настроек или перезагрузки конфигурации можно остановить и затем снова запустить интерфейс WireGuard — wg0
.
sudo wg-quick down wg0 && sudo wg-quick up wg0
Настройка правил брандмауэра
Рассмотрим настройку брандмауэра на примере UFW
1. Сперва укажем стандартные правила для брандмауэра, а затем разрешающее правило для UDP порта, указанного в конфигурации вашего интерфейса WireGuard и входящего трафика на интерфейсе WireGuard — wg0
.
ufw reset
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 51820/udp
ufw allow in on wg0
Перезагружаем UFW, чтобы применить изменения.
sudo ufw reload
Првоерим статус UFW, чтобы убедится, что все указанные нами правила применились.
ufw status
Ваш вывод должен быть похож на приведенный ниже:
Status: active
To Action From
-- ------ ----
22/tcp ALLOW Anywhere
51820/udp ALLOW Anywhere
Anywhere on wg0 ALLOW Anywhere
NAT
Если вам нужно, чтобы ufw перенаправлял подключения с внешнего интерфейса на внутренний, решение довольно простое. В файле /etc/default/ufw
измените параметр DEFAULT_FORWARD_POLICY
:
DEFAULT_FORWARD_POLICY="ACCEPT"
Далее добавляем NAT в конфигурацию /etc/ufw/before.rules
непосредственно перед правилами фильтрации:
# NAT for WireGuard
*nat
:POSTROUTING ACCEPT [0:0]
# Forward traffic through eth0 - Change to match you out-interface
-A POSTROUTING -s 10.0.0.1/24 -o ens3 -j MASQUERADE
# don't delete the 'COMMIT' line or these nat table rules won't<br># be processed<br>COMMIT
Для применения изменений перезапустим UFW.
ufw disable && ufw enable
Подключение клиентских устройств к VPN-серверу WireGuard
Устанавливаем WireGuard:
sudo apt-get install wireguard -y
Копируем с сервера WireGiard файл конфигурации /etc/wireguard/client1.conf
на клиентскую машину. Запускаем интерфейс WireGuard — wg0
, используя файл конфигурации клиента.
sudo wg-quick up /etc/wireguard/client1.conf
После поднятия интерфейса WireGuard, выполните проверку подключения к туннельному адресу сервера WireGuard 10.0.0.1
пингом.
ping -c 4 10.0.0.1
PING 10.0.0.1 (10.0.0.1) 56(84) bytes of data.
64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=0.651 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.626 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.575 ms
64 bytes from 10.0.0.1: icmp_seq=4 ttl=64 time=0.587 ms
--- 10.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3080ms
rtt min/avg/max/mdev = 0.575/0.609/0.651/0.030 ms
Дополнение
В случае если в качестве клиента выступает мобильное устройство, то проще всегда добавить клиентскую конфигурацию на него, это через QR-код. Устанавливаем пакет:
apt-get install qrencode -y
Для генерации QR-кода клиентской конфигурации /etc/wireguard/client1.conf
, используйте следующую команду:
qrencode -t ansiutf8 < /etc/wireguard/client1.conf
Заключение
Мы разобрали установку WireGuard на Debian 12 и создали туннельные интерфейсы для подключения к сети между одноранговыми узлами. В дальнейшем можно создать несколько интерфейсов WireGuard с уникальными портами и подключить несколько клиентов, используя действительные пары ключей на сервере.
- Более подробное описание брандмауэра UFW — https://jakondo.ru/nastrojka-brandmauera-s-pomoshhyu-ufw/ ↩︎
ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ
Обсуждение
Нет комментариев.