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

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


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/pages/linux/wireguard.txt · Последнее изменение: — so_v_a