Wireguard - отличное решение, если нужно быстро организовать доступ к закрытому скоупу. Вот и ко мне прилетела задача, организовать доступ к exsi через vpn. Сам хост стоит в дата центре и имеет прямой доступ. После реализации vpn-сети, вырубим доступ.
(Схема 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:
Сопоставим полученные конфиги можно заметить зависимости: Приватные ключи, как упоминалось ранее используются только для создания интерфейсов. Публичные ключи фигурируют только указании удаленных пиров. И так что бы подключится к серверу достаточно знать его endpoint и публичный ключ.
Открываем доступ на Mikrotik
Как упоминалось ранее мой сервер спрятан за микротиком. Для того, что бы открыть на него доступ нужно:
- Настроить port-forward на vpn-сервер
- Создать разрешающее правило на firewall.
Что бы добавить нат-правило в микротик переходим в настройки: ip
> firewall
. Во вкладке NAT
, создаем новое правило.
В новом окне указываем параметры:
chain:
- dstnatprotocol:
- udpdst.port
- 51820
Во вкладке - Action
, указываем:
action:
- dst-natto address
- 10.8.10.15 (Это внутренний адрес vpn сервера)to ports
- 51820
И применяем правило. В итоге добавиться правило:
На этой же страницы переходим во вкладку - Filter Rules
, и добавляем новое правило. Здесь нам нужно добавить правило - разрешающее пересылку udp трафика из WAN на порт 51280.
По параметрам:
chain
- forward;protocol
- udpdst.port
- 51820in.interface.list
- WANAction
- accept
Есть небольной нюанс, правило создается в конце, и оно перекрывается другим правилом, которое лочит весь трафик. Нужно созданное нам правило перетянуть выше закрывающего рула.
Ну и для проверки пробуем подключится.