SCROLL
Среднее время на прочтение: 4 мин.

Как установить и настроить Wireguard на Debian 12

WireGuard — это современный, высокопроизводительный и простой в использовании протокол для создания защищённых сетевых туннелей (VPN). Он используется в профессиональных целях для создания защищённых корпоративных VPN-сетей, обеспечивая безопасный и высокопроизводительный доступ сотрудников к ресурсам компании из любой точки мира.

Ниже описанные действия носят исключительно профессиональный характер, для построения туннелей в рамках корпоративных потребностей соединения удаленных офисов.

Настройка системы

Чтобы входящие пакеты направлялись правильно, нужно включить пересылку сетевых пакетов на уровне ядра. Добавьте следующие строки в конец файла /etc/sysctl.conf:

/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= на фактический открытый ключ клиента, который мы сгенерировали ранее.

/etc/wireguard/wg0.conf
[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, которые вы сгенерировали ранее.

/etc/wireguard/client1.conf
[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

Настройка правил брандмауэра

Рассмотрим настройку брандмауэра на примере UFW1. Сперва укажем стандартные правила для брандмауэра, а затем разрешающее правило для 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:

/etc/default/ufw
DEFAULT_FORWARD_POLICY="ACCEPT"

Далее добавляем NAT в конфигурацию /etc/ufw/before.rules непосредственно перед правилами фильтрации:

/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 с уникальными портами и подключить несколько клиентов, используя действительные пары ключей на сервере.

  1. Более подробное описание брандмауэра UFW — https://jakondo.ru/nastrojka-brandmauera-s-pomoshhyu-ufw/ ↩︎
 

ПОНРАВИЛАСЬ ИЛИ ОКАЗАЛАСЬ ПОЛЕЗНОЙ СТАТЬЯ, ПОДДЕРЖИ АВТОРА ДОНАТОМ

Обсуждение

0 комментариев

Нет комментариев.