Настраиваем свой VPN сервер с помощью WireGuard

Установка WireGuard в CentOS 9

dnf -y install wireguard-tools

Установка WireGuard в CentOS Stream release 8 (на VDS)

yum install elrepo-release epel-release
yum install kmod-wireguard wireguard-tools

Установка WireGuard в Debian

sudo apt update
sudo apt install wireguard

Генерация ключей

cd /home/user/
mkdir wireguard-keys
cd wireguard-keys

Создайте закрытый ключ и открытый ключ для WireGuard и измените его разрешения с помощью следующих команд:

wg genkey | tee server-private.key
chmod go= server-private.key
cat server-private.key | wg pubkey | tee server-public.key

wg genkey | tee client-private.key
chmod go= client-private.key
cat client-private.key | wg pubkey | tee client-public.key

wg genkey | tee android-private.key
chmod go= android-private.key
cat android-private.key | wg pubkey | tee android-public.key

Команды одинаковые, для генерации серверного, клиентского и дополнительного ключа для телефона.

Команда sudo chmod go=... удаляет все разрешения для файла для пользователей и групп, кроме пользователя root, чтобы гарантировать, что только пользователь root может получить доступ к закрытому ключу.

Создание конфигурации сервера WireGuard

Создайте новый файл конфигурации с помощью предпочитаемого вами редактора, выполнив следующую команду:

mcedit /etc/wireguard/wg0.conf

Вы можете изменить ListenPort строку, если хотите, чтобы WireGuard был доступен на другом порту:

[Interface]
PrivateKey = тут серверный приват ключ (содержимое файла server-private.key)
Address = 10.10.80.1/24
ListenPort = 51820
SaveConfig = true

Строка SaveConfig гарантирует, что при отключении интерфейса WireGuard любые изменения будут сохранены в файле конфигурации.

Запускаем службу WireGuard

systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0

systemctl status wg-quick@wg0

В выходных данных показаны ip команды, используемые для создания виртуального wg0 устройства и назначения ему адресов IPv4 и IPv6, которые вы добавили в файл конфигурации. Вы можете использовать эти правила для устранения неполадок в туннеле или с помощью wg самой команды, если хотите попробовать вручную настроить интерфейс VPN.

Посмотреть подключения

wg

Добавление пира на сервере

wg set wg0 peer тут_содержание_клиентского_публичного_ключа allowed-ips 10.10.80.2

#Пример с ключом
wg set wg0 peer HfOwerSdHAoBYkogODhrsvjwOBjxHOVy37XVrsr6wkE= allowed-ips 10.10.80.2

Чтобы пиры появились в конфиге /etc/wireguard/wg0.conf, необходимо сделать

wg-quick down wg0
systemctl restart wg-quick@wg0

Обратите внимание, что allowed-ips часть команды принимает список адресов IPv4 и IPv6, разделенных запятыми.

Вы можете указать отдельные IP-адреса, если хотите ограничить IP-адрес, который одноранговый узел может назначать себе, или диапазон, если ваши одноранговые узлы могут использовать любой IP-адрес в диапазоне VPN.

Также обратите внимание, что никакие два одноранговых узла не могут иметь одинаковые allowed-ips настройки.

Если вы хотите обновить allowed-ips существующий одноранговый узел, вы можете снова запустить ту же команду, но изменить IP-адреса.

Поддерживается несколько IP-адресов. Например, чтобы изменить только что добавленный одноранговый узел WireGuard, чтобы добавить IP-адрес 10.8.0.100 к существующим 10.8.0.2, вы должны выполнить следующее:

sudo wg set wg0 peer PeURxj4Q75RaVhDFkRTpDvBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100

После того, как вы запустили команду для добавления пира, проверьте состояние туннеля на сервере с помощью команды wg

Удаление конфигурации одного узла на сервере

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

sudo wg set wg0 peer PeDFxj4Q75RaVhBKkRTpssBPiPSGb5fQijgJsTa12hg= remove

Как правило, вам потребуется удалить конфигурацию однорангового узла только в том случае, если одноранговый узел больше не существует или если его ключи шифрования скомпрометированы или изменены.

В противном случае лучше оставить конфигурацию на месте, чтобы одноранговый узел мог повторно подключаться к VPN, не требуя, чтобы вы allowed-ipsкаждый раз добавляли его ключ.

Настройка фаервола в CentOS

firewall-cmd --state
firewall-cmd --permanent --add-port=51820/udp
firewall-cmd --permanent --add-masquerade
firewall-cmd --reload
firewall-cmd --list-all

Настройка фаервола в Debian

Чтобы настроить переадресацию

mcedit /etc/ufw/sysctl.conf
#разкомментить или добавить строчку
net/ipv4/ip_forward=1

Добавить порт wireguard

ufw allow 51820/udp
ufw status verbose

Включить маскарадинг и разрешить форвардинг пакетов

Включаем правило MASQUERADE, редактированием файла:

mcedit /etc/ufw/before.rules

Перед filter добваляем:

*nat
-A POSTROUTING -s 10.10.80.0/24 -o ens192 -j MASQUERADE
COMMIT

# Don't delete these required lines, otherwise there will be errors
*filter

Разрешаем переадресацию пакетов.

mcedit /etc/default/ufw
#найти параметр и изменить на ACCEPT
DEFAULT_FORWARD_POLICY="ACCEPT"

После добавления этих правил отключите и снова включите UFW, чтобы перезапустить его и загрузить изменения из всех файлов, которые вы изменили:

sudo ufw disable
sudo ufw enable

Вы можете подтвердить, что правила действуют, выполнив команду ufw status.

Конфиг клиента

Если на этапе установки сервера не создали ключи клиентов, то создаем:

wg genkey | tee client-private.key
chmod go= client-private.key
cat client-private.key | wg pubkey | tee client-public.key

# И точно так же для второго клиента, например мобилки.

wg genkey | tee android-private.key
chmod go= android-private.key
cat android-private.key | wg pubkey | tee android-public.key

Создание конфига клиента

[Interface]
PrivateKey = тут приват ключ (содержание файла client-private.key)
Address = 10.10.80.2/24
DNS = 8.8.8.8,8.8.4.4

[Peer]
PublicKey = тут публичный ключ сервера (содержание файла server-public.key)
AllowedIPs = 0.0.0.0/0
Endpoint = 192.168.10.16:51820

Если в AllowedIPs = указать 10.10.80.0/24 то трафик будет разрешен только для этой сети, а если 0.0.0.0/0 то сервер WireGuard будет в качестве шлюза для всего трафика.

Создание конфига для мобилы, через qr code

Установка в CentOS

dnf install epel-release
dnf install qrencode

Установка в Debian

apt install qrencode

Создаем директорию и файл для конфига:

cd /home/user
mkdir wireguard-config
cd wireguard-config

touch client.conf

Вставляем содержимое в файл:

[Interface]
PrivateKey = APcsFeyFKyHicAd4dTinZVGCbQ04rseNsBk6tDrNZVQ=
Address = 10.10.80.3/24
DNS = 8.8.8.8,8.8.4.4

[Peer]
PublicKey = sZ1EWc3arsDD8BPmjRLu/g9ZTTGASdewv4YpA2mnZ7DU=
AllowedIPs = 0.0.0.0/0
Endpoint = 192.168.10.16:51820

Тут всё то же самое, что и в конфиге для клиента, который был чуть выше.

Генерируем QR код по конфигу:

qrencode -t ansiutf8 < client.conf