Содержание

Wireguard сервер на OpenBSD с UI

WireGuard - полезный инструмент для создания шифрованных туннелей между подсетями или для организации доступа в локальную сеть. Конечно, можно делать все по памяти, либо сделать пару-тройку простеньких скриптов для выполнения каких-то повторяющихся действий по внесению изменений в настройки сервиса, но так же можно использовать UI веб-интерфейсы. На мой взгляд, это, в некоторых случаях, может давать ряд приимуществ. В данном случае, основным приимуществом для меня является то, что, при использовании wireguard-ui, можно быстро добавить нового пользователя, даже если ты уже давно этого не делал. Всё что нужно помнить - это логин и пароль от веб-интерфейса, а все остальное делается интуитивно.

Почему именно OpenBSD выбран в качестве основы для предоставления сервиса? Тут действуют два основных стимула - малые требования к ресурсам самой ОС и скруeпулезный подход к безопасности системы со стороны коммьюнити, занимающегося разработкой данного дистрибутива. Так же мне видится плюсом использование pf (packet filter) в качестве межсетевого экрана, ведь читаемость его конфигурации (как мне кажется) значительно лучше нежели в iptables.

План действий следующий:

  • Установка и настройка OpenBSD в VirtualBox
  • Сборка приложения wireguard-ui из иходного кода (т.к. таковой отсутствует под OpenBSD)
  • Установка и настройка OpenBSD в Proxmox VE
  • Настройка WireGuard-сервера
  • Начальная настройка wireguard-ui

Установка и настройка OpenBSD в VirtualBox

  • Скачиваем загрузочный ISO-образ OpenBSD с офф.сайта

  • Создаем новую ВМ в VirtualBOX, где все предлагаемые параметры можно оставить по умолчанию, либо сделать больше, но конфигурации с одним ядром и одним гигабайтом оперативной памяти, плюс 16 Гб жесткого диска вполне достаточно. Единственный нюанс - это то, что нужно сменить тип контроллера в разделе “Storage” конфигурации ВМ, у диска на который будет производиться установка, c PIIX4 на ACHI. В противном случае установка не удастся

  • Устанавливаем ОС:

    Весь процесс установки, я думаю, описывать не стоит, но следует обратить внимание на некоторые моменты:

    • На вопрос “Allow root ssh login?” отвечаем утвердительно, т.к. все действия будут выполняться от имени пользователя root и удобнее работать c машиной именно через SSH
    • На шаге создания разметки выбираем вариант (c)-Custom и создаем два раздела:
     1
     2
     3
     4
     5
     6
     7
     8
     9
    10
    
    sd0> a a
    offset: [64]
    size: [33554368] 14G
    FS type: [4.2BSD]
    mount point: [none] /
    sd0*> a b
    offset: [29366816]
    size: [4187616]
    FS type: [swap]
    sd0*> q
    

    Если всё получилось, то извлекаем установочный диск и загружаемся в свежеустановленную ОС

  • Чтобы подключиться к этой машине по SSH, пробрасываем в нее какой-то порт хостовой машины, ведущий на 22-й порт гостевой. Всё это можно сделать в разделе: Machine -> Settings -> Network -> Advanced -> Port Forwarding, добавив новое правило перенаправления следующего вида:

    Name Protocol Host IP Host Port Guest IP Guest Port
    Rule 1 TCP 127.0.0.1 2222 22

    Подключаемся с помощью команды ssh root@127.0.0.1 -p 2222

Сборка приложения wireguard-ui

Для начала скачаем набор, так называемых, “портов”, чтобы получить среди этого набора сценарий сборки и установки golang. Для этого, сначала, скачиваем архив:

1
2
3
cd /tmp
ftp https://cdn.openbsd.org/pub/OpenBSD/$(uname -r)/{ports.tar.gz,SHA256.sig}
signify -Cp /etc/signify/openbsd-$(uname -r | cut -c 1,3)-base.pub -x SHA256.sig ports.tar.gz

Распаковываем его:

1
2
3
cd /usr
tar xzf /tmp/ports.tar.gz
rm /tmp/ports.tar.gz

Собираем и устанавливаем golang:

1
2
3
cd /usr/ports/lang/go
make
make install

Устанавливаем git и yarn:

1
pkg_add git yarn

Идем собирать wireguard-ui:

1
2
3
4
5
6
cd /tmp
git clone https://github.com/ngoduykhanh/wireguard-ui.git
cd wireguard-ui
git checkout tags/v0.5.2
./prepare_assets.sh
go build -o wireguard-ui

В случае успеха, мы получаем бинарный файл wireguard-ui, который мы будем использовать на другой виртуальной машине, где уже будет работать сам WireGuard.

Теперь его нужно скопировать на родительский хост, после чего можно будет убить это машину в VirtualBox.

Копируем бинарник, выполнив на локальной машине:

1
scp -P 2222 root@127.0.0.1:/tmp/wireguard-ui/wireguard-ui ./

Установка и настройка OpenBSD в Proxmox VE

Установка OpenBSD в Proxmox VE будет моло чем отличаться от установки VirtualBox. Основное отличие будет заключаться только в размере диска, куда будет установлена ОС и в наборе устанавливаемых пакетов. Процесс подготовки к установке описывать не буду, т.к. подразумевается, что вы умеете это делать.

Создаем машину с примерно такими характеристиками:

1
2
3
4
5
6
7
8
9
sockets: 1
cores: 2
ide0: local-lvm:vm-100-disk-0,size=4G
memory: 512
meta: creation-qemu=6.2.0,ctime=1573432152
name: wireguard
net0: e1000=0E:97:D9:AB:CD:EF,bridge=vmbr0,firewall=1
numa: 0
ostype: other

Устанавливаем туда OpenBSD, где при установке разбиваем диск на 3.5 Гб для корневого раздела и всё остальное под swap.

На этапе выбора наборов файлов убираем всё что связано с Xorg, введя последовательно: -x* и -game*. В итоге, уже установленная система со всем содержимым будет занимать около 1.5G и ~1.7G будет свободно, чего должно быть вполне достаточно для долгой и счастливой жизни сервиса.

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

Чтобы не писать перед каждой командой doas, подразумевается, что все нижеследующее будет выполняться от имени пользователя root

Разрешаем перенаправление пакетов:

1
2
sysctl net.inet.ip.forwarding=1
sysctl net.inet6.ip6.forwarding=1

Чтобы после перезагрузки системы данные настройки сохранились, выполняем команды:

1
2
echo "net.inet.ip.forwarding=1" >> /etc/sysctl.conf
echo "net.inet6.ip6.forwarding=1" >> /etc/sysctl.conf

Создаем папку настроек wireguard и переходим в нее:

1
2
3
4
5
mkdir -p /etc/wireguard
chmod 700 /etc/wireguard
cd /etc/wireguard
touch /etc/wireguard/wg0.conf
chmod 0600 /etc/wireguard/wg0.conf
Примечание
wireguard-ui сгенерирует свои ключи и после первого сохранения конфигурации полностью перепишет приведенный ниже файл конфигурации, но мы всё равно его создаем, чтобы до того как это будет сделано сам wireguard уже мог в каком-то виде запускаться.

Генерируем приватный и публичный ключи:

1
2
3
wg genkey > private.key
chmod 0600 ./private.key
wg pubkey < private.key > public.key

Создаем файл конфигурации wg0.conf:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
cat <<EOF > wg0.conf
[Interface]
Address = 172.20.10.0/24
ListenPort = 51820
PrivateKey = $(cat private.key)
MTU = 1450
PostUp = 
PostDown = 
Table = auto
EOF

chmod 0600 /etc/wireguard/wg0.conf

Далее, добавляем правило фаервола, добавив в файл /etc/pf.conf строки:

1
2
3
4
5
# Wireguard
pass in on wg0
pass in inet proto udp from any to any port 51820
pass in inet proto tcp from (em0:0) to any port 80
pass out on egress inet from (wg0:network) nat-to (em0:0)
Примечание
em0 - это имя физического интерфейса виртуальной машины c типом сетевого адаптера Intel E1000. Если при создании ВМ, был вабран, например, тип сетевого адаптера VirtIO, то имя будет vio0, т.ч. обратите на это внимание.

Применяем изменения правил:

1
pfctl -f /etc/pf.conf

Создаем скрипт инициализации и обновления конфигурации интерфейса wireguard:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
cat <<EOF > /usr/local/bin/wireguard-up
#!/bin/ksh

ptime=0
while true; do
  ctime=\$(stat -f %m /etc/wireguard/\$1.conf)
  if [ \$ptime -ne \$ctime ]; then
    wg-quick down \$1
    wg-quick up \$1
  fi
  sleep 2
  ptime=\$ctime
done
EOF

chmod +x /usr/local/bin/wireguard-up

Создаем скрипт запуска скрипта wireguard-up как сервиса:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat <<EOF > /etc/rc.d/wgup
#!/bin/ksh
#
# \$OpenBSD: wireguard-up,v 0.0.1 2023/08/20 00:34:28 rpe Exp $

daemon="ksh /usr/local/bin/wireguard-up"
daemon_flags="wg0"

. /etc/rc.d/rc.subr

rc_bg=YES
rc_reload=NO

rc_cmd \$1
EOF

chmod 0555 /etc/rc.d/wgup

Включаем и запускаем сервис:

1
2
rcctl enable wgup
rcctl start wgup

Копируем созданный ранее в VirtualBox бинарный файл wireguard-ui в папку /usr/local/bin и создаем скрипт запуска сервиса:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
cat <<EOF > /etc/rc.d/wgui
#!/bin/ksh
#
# \$OpenBSD: wireguard-ui,v 0.5.2 2023/06/23 14:32:05 rpe Exp $

daemon="/usr/local/bin/wireguard-ui"
daemon_flags="-bind-address 0.0.0.0:80"

. /etc/rc.d/rc.subr

rc_bg=YES
rc_reload=NO

rc_cmd \$1
EOF

chmod 0555 /etc/rc.d/wgui

Включаем и запускаем сам сервис:

1
2
rcctl enable wgui
rcctl start wgui

На этом основную настройку сервера можно считать законченой и все остальное делать уже в wireguard-ui

Начальная настройка wireguard-ui

Отркрываем в браузере адрес созданной на предыдущем шаге машины и авторизуемся с логином admin и парлем admin.

Первым делом следует сменить пароль администратора по умолчанию в разделе “SETTINGS -> Users Settings

После этого следует обратить внимание на раздел “SETTINGS -> Global Settings”, в котором следует обратить внимание на значение поля “Endpoint Address”, он должен соответствовать IP-адресу интерфейса куда будет производиться подключение клиентов. Так же можно задать свой набор DNS-серверов.

В разделе “MAIN -> Wireguard Server” можно ничего не менять, но можно обратить внимание на поле “Server Interface Addresses”, который определят диапазон из которого будут выдаваться адреса для клиентских подключений. Поле “Listen Port” должно соответствовать значению “51820”, т.к. на предыдущем шаге мы создавали правило фаервола именно для этого порта.

Если все настройки устраивают, то можно добавлять клиентов с помощью кнопки “New Client”, находящейся в правом-верхнем углу страницы. В форме добавления клиента можно не заполнять ничего, кроме имени клиента в поле “Name”, т.к. все остальные поля уже заполнены, а ключи “Public Key” и “Preshared Key” будут сгенерированы автоматически.

После применения всех изменений, следует нажать кнопку “Apply Config”, находящуюся в правом-верхнем углу страницы.

Если всё работает правильно, то после добавления клиентов, мы должы увидеть их в списке раздела “UTILITES -> Status -> Connected Peers