Содержание
Установка и настройка 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
Файл разделен на две секции:
- Interface - настройка сервера;
- 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 на сервере нужно обязательно перезапустить.
