Skip to content

WireGuard

Работает по UDP.
Дефолтный порт - 51820/udp

Установка на сервер

Bash
sudo apt update && sudo  apt upgrade -y && sudo apt install -y wireguard

Настройка на сервере

Создаем private, public ключи в /etc/wireguard/:

Bash
wg genkey | tee /etc/wireguard/privatekey | wg pubkey | tee /etc/wireguard/publickey

Даем разрешение только под root:

Bash
chmod 600 /etc/wireguard/privatekey

Проверяем название сетевого интерфейса:

Bash
ip a

Создаем конфиг wireguard-а

Bash
vim /etc/wireguard/wg0.conf

C таким содержимым:

Text Only
[Interface]
PrivateKey = <privatekey>
Address = 10.2.4.1/24
ListenPort = 51820
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE  
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Info

Вместо \<privatekey> нужно вставить приватный ключ из файла /etc/wireguard/privatekey.
Вместо eth0 надо указать свой сетевой интерфейс.
Address = 10.2.4.1/24 - это локальный адрес сервера в VPN сети

Разрешаем ip forwarding, чтобы могли потом прокидывать трафик через сервер в интернет:

Bash
echo "net.ipv4.ip_forward=1" >> /etc/sysctl.conf
sysctl -p  # чтобы убедиться, что всё правильно сохранилось

Info

Если sysctl не будет срабатывать (sysctl not found), надо добавить в .bashrc или в .zshrc путь к /usr/sbin:

Bash
export PATH=$PATH:/sbin

Запуск wireguard

Bash
systemctl enable wg-quick@wg0.service  
systemctl start wg-quick@wg0.service  
systemctl status wg-quick@wg0.service

Настройка доступа клиентов

Для каждого клиента надо будет генерить keys, поэтому ключи лучше именовать подходящим образом (именами друзей, например, у которых будет доступ).

Bash
wg genkey | tee /etc/wireguard/client_privatekey | wg pubkey | tee /etc/wireguard/client_publickey

И добавляем в wg0.conf:

Text Only
[Peer]  
PublicKey = <client_publickey>  
AllowedIPs = 10.0.0.2/32

Info

Вместо \<client_publickey> нужно вставить публичный ключ из файла /etc/wireguard/client_publickey.
И ниже можно задать локальный IP клиенту. С помощью этих IP клиенты внутри VPN сети смогут взаимодействовать друг с другом.

И перезагружаем wireguard service:

Bash
systemctl restart wg-quick@wg0  
systemctl status wg-quick@wg0


Настройка на клиенте

Установка wireguard:

Bash
sudo apt update && sudo apt upgrade && sudo apt install wireguard

Создание (вручную) клиентского конфига:

Bash
vim client_wg.conf

С таким содержимым:

Text Only
[Interface]
PrivateKey = <CLIENT-PRIVATE-KEY>
Address = 10.2.4.2/32
DNS = 8.8.8.8

[Peer]
PublicKey = <SERVER-PUBKEY>
Endpoint = <SERVER-IP>:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 20

Info

Вместо \<CLIENT-PRIVATE-KEY> нужно вставить клиентский приватный ключ с сервера из файла /etc/wireguard/client_privatekey.
Вместо \<SERVER-PUBKEY> - публичный wireguard ключ сервера.
Вместо \<SERVER-IP> - IP адрес wireguard сервера.

Address = 10.2.4.2/32 - это адрес, который мы указывали для клиента на сервере
PersistentKeepalive = 20 означает, что каждые 20 секунд будут пинговаться сервер-клиент, чтобы проверить, что соединение активно и работает.

Как пользоваться wireguard клиентами?

Просто нужно сделать для клиента свой client_wg.conf, который мы, к примеру, делали выше для client и передать этот файл им.
Они смогут в приложениях выбрать его и всё будет работать.


Troubleshoot

Warning: /etc/wireguard/wg0.conf is world accessible

Solution:

Bash
chmod 600 /etc/wireguard/wg0.conf

Sauce: https://geefire.eu.org/2020/11/01/wireguard-warning-conf-is-world-accessible.html

troubleshoot


wireguard #tool #VPN