Инструменты пользователя

Инструменты сайта


linux:wireguard

Это старая версия документа!


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

/var/www/html/dokuwiki/data/attic/linux/wireguard.1658522768.txt.gz · Последнее изменение: (внешнее изменение)