Wireguard - отличное решение, если нужно быстро организовать доступ к закрытому скоупу. Вот и ко мне прилетела задача, организовать доступ к exsi через vpn. Сам хост стоит в дата центре и имеет прямой доступ. После реализации vpn-сети, вырубим доступ.

wireguard-sch.png (Схема vpn-сети)

Я поднял небольшую виртуалку, на которой поднимем wireguard-сервер, далее на микроте (который используется как фаервол/роутер) прокинем порт к vpn серверу.

Установка WireGuard

Подключаемся к серверу и ставим репозитории epel и eprepo:

$ yum install -y epel-release elrepo-release

Теперь ставим пакеты wireguard:

$ yum install -y kmod-wireguard wireguard-tools

Перезапускаем сервер, что бы ядро подгрузило модули для работы wireguard. Пакеты установлены, теперь можем начать конфигурить сервер. Wireguard - устанавливает vpn соединение путем обмена ключами, по аналогии с SSH. На каждой стороне подымается интерфейс wireguard c использованием закрытого ключа и публичными ключами наших клиентов. И через этот интерфейс отправляются пакеты поверх UDP.

Настройка сервера wireguard достаточно элементарная, для этого нам нужно сгенерить пару ключей, далее написать конфиг для поднятия интерфейса с указанием пиров (peer’s). После остаеться только открыть порты на фаерволе и запустить сервис.

Настройка WireGuard

Настройка сервера

Для создания последующего конфига потребуется предварительно сгенерить пару публичного/приватного ключа. Генерим ключи:

[root@vpn ~]# wg genkey | tee /etc/wireguard/server_private.key | wg pubkey | tee /etc/wireguard/server_public.key

По итогу будем иметь ключи:

[root@vpn ~]# ls -lah /etc/wireguard/*.key
-rw-r--r--. 1 root root 45 Feb 14 22:36 /etc/wireguard/server_private.key
-rw-r--r--. 1 root root 45 Feb 14 22:36 /etc/wireguard/server_public.key

Создадим файл конфигурации vpn-сервера. Стоит обратить внимание, что имя конфига будет одноименно сетевого интерфейсу wireguard.

[root@vpn ~]# vim /etc/wireguard/wg0.conf
---
[Interface]
Address = 10.8.11.1/24
ListenPort = 51820
PostUp = firewall-cmd --zone=public --add-masquerade; firewall-cmd --direct --add-rule ipv4 filter FORWARD 0 -i wg0 -o ens33 -j ACCEPT; firewall-cmd --direct --add-rule ipv4 nat POSTROUTING 0 -o ens33 -j MASQUERADE; firewall-cmd --add-port=51820/udp
PostDown = firewall-cmd --zone=public --remove-masquerade; firewall-cmd --direct --remove-rule ipv4 filter FORWARD 0 -i wg0 -o ens33 -j ACCEPT; firewall-cmd --direct --remove-rule ipv4 nat POSTROUTING 0 -o ens33 -j MASQUERADE; firewall-cmd --remove-port=51820/udp
PrivateKey = +McbNICmAbSn7l4....

В файле конфигурации описывается блок - interface:

  • Address - адрес сети vpn, адрес vpn-сервера;
  • ListenPort - порт, который слушает сервер;
  • PostUp/PostDown - Добавяют и удаляют правила маскарадинга в firewalld.
  • PrivateKey - приватный ключ сервера, который мы генерили ранее /etc/wireguard/server_private.key.

Подключение клиентов

Конфига сервера готова, можно перейти к настойки клиента. Основной десктоп у меня на арче, ноут на убунте поэтому будет 2 клиента.

Ставим wireguard на арч.:

tony@i3Arch:~ » sudo pacman -S wireguard-tools      

Теперь также генерим пару ключей:

tony@i3Arch:~ » mkdir .wireguard  
tony@i3Arch:~ » wg genkey | tee .wireguard/private.key | wg pubkey > .wireguard/public.key

Настраиваем конфигурацию wireguard на клиенте:

tony@i3Arch:~ » sudo vim /etc/wireguard/client.conf
---
[Interface]
PrivateKey = YiKBQnjkclVT.........
Address = 10.8.11.2/24
 
[Peer]
PublicKey = nLoGLFsim4NPtNe.......
Endpoint = 17.16.17.25:51820
AllowedIPs = 10.8.10.0/24, 10.8.11.0/24
PersistentKeepalive = 15

В конфигурации клиента описываем два поля - Interface, Peer. Первое поле - Interface, настройки интерфейса клиента:

  • PrivateKey - приватный ключ, который мы сгенерили ранее - .wireguard/private.key
  • Address - локальный адрес интерфейса, который будет поднят на клиенте.

Второе поле - Peer, указывает на настройки vpn сервера:

  • PublicKey - Публичный ключ сервера, который генерили при настройки сервера.
  • Endpoint - точка подключения к нашему серверу, адрес и порт. В моем случаи vpn сервер спрятан за микротиком, у которого на внешнем интерфейсе назначан адрес пира (17.12.137.25). А порт проброшен, внутрь до vpn-сервера. Как настроить микрот поделюсь в конце.
  • PersistentKeepalive - интервал, между проверками доступности коннекшена.

Отлично теперь возвращаемся на сервер wireguard, редактируем конфиг сервера, добавляем нашего клиента:

[root@vpn ~]# vi /etc/wireguard/wg0.conf
---
[Peer]
PublicKey = jQ15,0saetrn1ObCOQ.......
AllowedIPs = 10.8.11.2/32

В самом конце добавляем peer клиента. В поле указываем:

  • PublicKey - публичный ключ клиента, который мы создали ранее - .wireguard/public.key.
  • AllowedIPs - разрешенный адрес, для данного клиента.

Запуск vpn-сервера

Перед запуском, нужно открыть порт на вашем сервере:

[root@vpn ~]# firewall-cmd --add-port=51820/udp --permanent
[root@vpn ~]# firewall-cmd --reload

Запускаем сервис:

[root@vpn ~]# systemctl enable --now wg-quick@wg0

Eсли все пошло нормально, у нас отобразится новый интерфейс:

[root@vpn ~]# ip a
....
3: wg0: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.8.11.1/24 scope global wg0
       valid_lft forever preferred_lft forever

Подключения клиента

Итак, мы подняли сервис. Прописали свой клиентский конфиг, можно пробовать подключится. Для поднятия порта достаточно выполнить команду:

tony@i3Arch:~ » sudo systemctl enable --now wg-quick@client 

Проверяем, поднялся ли наш интерфейс:

tony@i3Arch:~ » ip a                                 
...
5: client: <POINTOPOINT,NOARP,UP,LOWER_UP> mtu 1420 qdisc noqueue state UNKNOWN group default qlen 1000
    link/none 
    inet 10.8.11.2/24 scope global client
       valid_lft forever preferred_lft forever

Пингуем удаленный пир, что бы проверить vpn:

tony@i3Arch:~ » ping 10.8.11.1 
PING 10.8.11.1 (10.8.11.1) 56(84) bytes of data.
64 bytes from 10.8.11.1: icmp_seq=1 ttl=64 time=5.44 ms

Настройка второго клиента

На втором рабочем компьютере у меня стоит убунта, давайте на ее примере продемонстрируем настройку wireguard-клиента. Ставим пакеты wireguard:

tony@ThinkPadT470s:~ » sudo apt-get install -y wireguard

Опять же после установки я перезапустил комп, что бы подгрузились модули ядра.

В домашнем каталоге пользователя создаем каталог, куда положим ключи:

tony@ThinkPadT470s:~ » mkdir .wireguard
tony@ThinkPadT470s:~ » wg genkey | tee .wireguard/private.key | wg pubkey > .wireguard/public.key

Пишем конфиг нашего клиента,

[Interface]
PrivateKey = 3ZVk2Wo/iI...........
Address = 10.8.11.3/24
 
[Peer]
PublicKey = ewZdI3o8815bm98..........
Endpoint = 17.16.17.25:51820
AllowedIPs = 10.8.10.0/24, 10.8.11.0/24
PersistentKeepalive = 15

В конфиге мы указываем приватный ключ, и адрес клиента. В настройках пира указываема публичный ключ сервера, и точку подключения.

С клиентом все готово, копируем публичный ключ клиента и идем на сервер что бы добавил клиента. В конфиге сервера wireguard добавляем в конец:

[Peer]
PublicKey = w4vra1HQnlYQ61235153sad1......
AllowedIPs = 10.8.11.3/32

Перезапускаем сервер wireguard, и запускаем сервис на клиенте:

[root@wg ~]# systemctl restart wg-quick@wg0
tony@ThinkPadT470s:~ » systemctl enable --now wg-quick@client                      

Для проверки можно пингануть пир, или же в wireguard есть команда для просмотра состояния vpn: wireguard-ping.png

Сопоставим полученные конфиги можно заметить зависимости: wireguard-schemes.png Приватные ключи, как упоминалось ранее используются только для создания интерфейсов. Публичные ключи фигурируют только указании удаленных пиров. И так что бы подключится к серверу достаточно знать его endpoint и публичный ключ.

Открываем доступ на Mikrotik

Как упоминалось ранее мой сервер спрятан за микротиком. Для того, что бы открыть на него доступ нужно:

  1. Настроить port-forward на vpn-сервер
  2. Создать разрешающее правило на firewall.

Что бы добавить нат-правило в микротик переходим в настройки: ip > firewall. Во вкладке NAT, создаем новое правило.

В новом окне указываем параметры:

  • chain: - dstnat
  • protocol: - udp
  • dst.port - 51820

wireguard-mikrotik-1.png

Во вкладке - Action, указываем:

  • action: - dst-nat
  • to address - 10.8.10.15 (Это внутренний адрес vpn сервера)
  • to ports - 51820

wireguard-mikrotik-2.png

И применяем правило. В итоге добавиться правило: wireguard-mikrotik-3.png

На этой же страницы переходим во вкладку - Filter Rules, и добавляем новое правило. Здесь нам нужно добавить правило - разрешающее пересылку udp трафика из WAN на порт 51280. wireguard-mikrotik-4.png

По параметрам:

  • chain - forward;
  • protocol - udp
  • dst.port - 51820
  • in.interface.list - WAN
  • Action - accept

Есть небольной нюанс, правило создается в конце, и оно перекрывается другим правилом, которое лочит весь трафик. Нужно созданное нам правило перетянуть выше закрывающего рула.

wireguard-mikrotik-5.png

Ну и для проверки пробуем подключится.