# Установка и настройка 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 на сервере нужно **обязательно перезапустить**.