Это старая версия документа!
# Установка и настройка VPN-сервера WireGuard на Linux Ubuntu 20.04
## 1.Собственно установка WireGuard
``` $ sudo apt install wireguard ```
установка данного пакета производится как на сервере, так и на linux-клиенте
## 2.Предварительная настройка сервера
Включаем переадресацию IP , чтобы сервер WireGuard мог ретранслировать трафик между подключенными одноранговыми узлами, а также маршрутизировать трафик в качестве шлюза по умолчанию. Открываем файл:
``` $ sudo vim /etc/sysctl.conf ``` и в конце добавляем строки
``` net.ipv4.ip_forward = 1 net.ipv6.conf.default.forwarding = 1 net.ipv6.conf.all.forwarding = 1 net.ipv4.conf.all.rp_filter = 1 net.ipv4.conf.default.proxy_arp = 0 net.ipv4.conf.default.send_redirects = 1 net.ipv4.conf.all.send_redirects = 0 ``` (в некоторых указаниях сказано что достаточно первых двух строк)
После этого система должна перечитать конфигурацию:
``` $ sudo sysctl -p ```
## 3.Генерация ключей
Как для сервера, так и для каждого клиента нужно создать приватный и публичный ключи. Генерация ключей производится на сервере, генерировать ключи можно в какой угодно папке, например в домашней. Содержимое файлов-ключей позже будет помещено в соответствующие конфиг-файлы сервера и клиентов. После чего файлы эти будут больше не нужны и подлежат удалению.
Для сервера:
``` $ wg genkey | sudo tee server_private.key | wg pubkey | sudo tee server_public.key ``` Для клиента №1:
``` $ wg genkey | sudo tee client-1_private.key | wg pubkey | sudo tee client-1_public.key ``` соответственно если клиентов больше чем один цифру 1 заменяем на нужную. ## 4.Конфигурационный файл WireGuard на сервере
Открываем конфиг-файл wireguard на сервере: ``` $ sudo vi /etc/wireguard/wg0.conf ```
вносим в него следующие записи:
``` [Interface] Address = 10.0.0.1/24,fd42:42:42::1/64 ListenPort = 51820 PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_СЕРВЕРА> PostUp = iptables -A FORWARD -i wg0 -j ACCEPT; iptables -t nat -A POSTROUTING -o enp0s2 -j MASQUERADE; ip6tables -A FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -A POSTROUTING -o enp0s2 -j MASQUERADE PostDown = iptables -D FORWARD -i wg0 -j ACCEPT; iptables -t nat -D POSTROUTING -o enp0s2 -j MASQUERADE; ip6tables -D FORWARD -i wg0 -j ACCEPT; ip6tables -t nat -D POSTROUTING -o enp0s2 -j MASQUERADE
[Peer] PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_КЛИЕНТА> AllowedIPs = 10.0.0.2/32,fd42:42:42::2/128 ``` Файл разделен на две секции:
1. Interface - настройка сервера; 2. Peer - настройка клиентов, которые могут подключаться к серверу, _секций Peer может быть несколько, по числу клиентов соответственно_.
Далее здесь:
- PrivateKey: приватный ключ сервера, он лежит в ранее сгенерированном файле `server_private.key`
- Address: адрес сервера в сети VPN, разрешены адреса используемые в частных локальных сетях;
- ListenPort: Это порт прослушивания UDP для входящих подключений от других партнеров. Стандартный порт WireGuard — UDP/51820.
- PostUp - команда, которая выполняется после запуска сервера. В данном случае включается поддержка MASQUERADE для интерфейса enp0s2 (_это сетевой интерфейс сервера, который смотрит в интернет_), а также разрешается прием пакетов на интерфейсе wg0 (интерфейс wireguard по-умолчанию). Сетевые интерфейсы нужно заменить на свои
- PostDown - выполняется после завершения работы WireGuard, в данном случае удаляет все правила, добавленные в PostUp
- PublicKey - публичный ключ клиента, он лежит в ранее сгенерированном файле `client-1_public.key`.
- AllowedIPs - IP адрес, который может взять клиент (маска для IPv4 должна быть 32).
(!) Узнать как называется сетевой интерфейс который у вас смотрит в сеть можно с помощью:
``` $ ip route get 8.8.8.8 ``` Т.е. это мы здесь смотрим маршрут от нас до гугловского ДНС-сервера (8.8.8.8). Результат будет выглядеть примерно так:
```
8.8.8.8 via IP_ШЛЮЗА dev НАЗВАНИЕ_ВАШЕГО_СЕТЕВОГО_ИНТЕРФЕЙСА src IP_ВАШЕГО_СЕТЕВОГО_ИНТЕРФЕЙСА uid 1000
```
## 5.Конфигурационный файл WireGuard на клиенте
Конфигурационный файл для каждого клиента формируется на сервере, а затем передается клиенту. (Как передается - вообще неважно, по ssh, по email, на флэшке, да хоть в распечатанном на листке виде посредством посыльного.)
Создаем конфиг-файл для клиента:
``` $ vi client-1.conf ```
со следующим содержанием:
``` [Interface] PrivateKey = <ПРИВАТНЫЙ_КЛЮЧ_КЛИЕНТА> Address = 10.0.0.2/24,fd42:42:42::2/64 DNS = 8.8.8.8,8.8.4.4
[Peer] PublicKey = <ПУБЛИЧНЫЙ_КЛЮЧ_СЕРВЕРА> Endpoint = XXX.XXX.XXX.XXX:51820 AllowedIPs = 0.0.0.0/0,::/0 ```
здесь:
- PrivateKey - приватный ключ клиента, лежит в ранее сформированном файле `client-1_private.key`; - Address - IP адрес интерфейса wg0 клиента; - DNS - серверы DNS, которые будут использоваться для разрешения доменных имён (здесь днс гугла, может быть и другой); - PublicKey - публичный ключ сервера, к которому надо подключится, лежит в ранее сформированном файле *server_public.key*. - Endpoint - здесь надо указать IP адрес сервера, на котором установлен WireGuard и порт к которому подключаемся; - AllowedIPs - IP адреса, трафик с которых будет перенаправляться в сеть VPN, в данном примере выбраны все адреса.
Данный конфиг-файл нужно скопировать на компьютер-клиент под именем `/etc/wireguard/wg0.conf` .
## Запуск WireGuard на сервере
Сервер запускаем командой:
``` $ sudo wg-quick up wg0 ``` останавливаем:
``` $ sudo wg-quick down wg0 ``` Также можно использовать systemd:
``` $ sudo systemctl start wg-quick@wg0 … $ sudo systemctl stop wg-quick@wg0 ``` С помощью systemd можно настроить автозапуск: ``` sudo systemctl enable wg-quick@wg0 ```
## Настройка брандмауэра
В Ubuntu для управления брандмауэром используется оболочка под названием UFW (Uncomplicated FireWall). В рассматриваемом примере VPN поднят на порту UDP 51820, поэтому нужно разрешить подключение к этому порту. Для этого:
``` $ sudo ufw allow 63665/udp ``` Если файрволл в системе отключен вообще, то на всякий случай проверяем его состояние:
``` $ sudo ufw status ```
## Запуск WireGuard на клиенте
На данном этапе WireGuard на клиенте уже должен быть установлен, а конфигурационный файл клиента уже должен лежать там, где положено - по адресу: `/etc/wireguard/wg0.conf`.
Подключение выполняется аналогично запуску сервера:
``` $ sudo wg-quick up wg0 ```
После установления соединения с сервером статистику по подключению можно посмотреть так:
``` $ sudo wg show ``` Так же для проверки соединения можно выполнить ping до сервера WireGuard:
``` $ ping 10.0.0.1 ``` если всё в порядке, пакеты должны проходить.
## Ещё проверки
Если пакеты идут, значит всё хорошо. Если же нет, надо внимательно проверять соответствие выполненных действий и инструкции, и смотреть что сделано не так.
Частые причины ошибок:
- несоответствующие ключи, - закрытый порт - неверный адрес сервера.
Доступность порта на сервере можно проверить с помощью утилиты nc. Её надо запускать на клиентской машине:
``` $ nc -z -v -u XXX.XXX.XXX.XXX 51820 ``` здесь XXX.XXX.XXX.XXX - адрес VPN-сервера с которым соединяемся.
Также убедится, что пакеты WireGuard доходят к серверу, можно на стороне сервера. Для этого используйте tcpdump на сервере: ``` $ sudo tcpdump -n -i enp0s2 port 51820 ``` здесь enp0s2 - имя сетевого интерфейса, который на сервере смотрит в интернет.
## Важно!
_Действительно_ важно (просто потому что про это забываешь):
Если в конфиг сервера был добавлен новый клиент, или по какой-либо причине у клиента поменялся ключ и соответственный публичный ключ клиента был изменён в конфиге сервера, то сервис wireguard на сервере нужно обязательно перезапустить.
