$ sudo apt install wireguard
установка данного пакета производится как на сервере, так и на linux-клиенте
Включаем переадресацию 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
Как для сервера, так и для каждого клиента нужно создать приватный и публичный ключи. Генерация ключей производится на сервере, генерировать ключи можно в какой угодно папке, например в домашней.
Содержимое файлов-ключей позже будет помещено в соответствующие конфиг-файлы сервера и клиентов. После чего файлы эти будут больше не нужны и подлежат удалению.
Для сервера:
$ 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 заменяем на нужную.
Открываем конфиг-файл 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
Файл разделен на две секции:
Далее здесь:
server_private.keyclient-1_public.key.(!) Узнать как называется сетевой интерфейс который у вас смотрит в сеть можно с помощью:
$ ip route get 8.8.8.8
Т.е. это мы здесь смотрим маршрут от нас до гугловского ДНС-сервера (8.8.8.8).
Результат будет выглядеть примерно так:
> 8.8.8.8 via IP_ШЛЮЗА dev НАЗВАНИЕ_ВАШЕГО_СЕТЕВОГО_ИНТЕРФЕЙСА src IP_ВАШЕГО_СЕТЕВОГО_ИНТЕРФЕЙСА uid 1000
Конфигурационный файл для каждого клиента формируется на сервере, а затем передается клиенту. (Как передается - вообще неважно, по 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
здесь:
client-1_private.key;
Данный конфиг-файл нужно скопировать на компьютер-клиент под именем /etc/wireguard/wg0.conf .
Сервер запускаем командой:
$ 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 на клиенте уже должен быть установлен, а конфигурационный файл клиента уже должен лежать там, где положено - по адресу: /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 на сервере нужно обязательно перезапустить.