WireGuard: Установка и настройка сервера в Linux

Введение

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

Основные концепции и особенности

WireGuard позиционируется разработчиками как надёжный, быстрый и производительный VPN на фоне IPsec и OpenVPN. Это достигается благодаря кодовой базе, объем которой намного меньше вышеописанных решений.

Насколько VPN действительно безопасный – судить сложно, т.к. нужно хотя бы немного разбираться в криптографии и ИБ. По заявлениям разработчиков, используются Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF

Под капотом wireguard оперирует с ключами, наподобие, как ssh-key. На основе этого и устанавливаются VPN-соединения. Скорость работы достигается засчет того, что WireGuard является частью ядра Linux с версии 5.6, а в качестве транспорта используется 51820/UDP.

Реализация протокола в Linux основана на том, что создаётся туннельный интерфейс (или несколько интерфейсов) с именем wg0, wg1 и т.д. Интерфейсу назначается туннельный IP-адрес, производится конфигурирование на основе приватного ключа сервера и публичного ключа пира (клиента), после чего устанавливается соединение. Причём конфигурирование может быть выполнено как вручную утилитами типа ifconfig, ip-address, ip route, так и утилитой wg в автоматическом режиме.

WireGuard отлично подходит для объединения локальных сетей (site-to-site) и для организации удаленного доступа, что и будет рассмотрено в данной статье.

Установка и настройка сервера

Посмотреть варианты установки для необходимой операционной системы можно в официальном руководстве.

В данной заметке используется Amazon Linux AMI в AWS, на котором установить можно так:

amazon-linux-extras install epel
yum install -y wireguard-tools

Подготовить каталог и сгенерировать в нём ключи для сервера:

cd /etc/wireguard
umask 077
wg genkey > server.key
wg pubkey < server.key > server.pub

Подготовить конфигурационный файл для сервера:

cat > /etc/wireguard/wg0.conf << EOF
Address = 192.168.88.1/24
ListenPort = 49312
SaveConfig = True
PrivateKey = $(cat /etc/wireguard/server.key)
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
EOF
В поле Address необходимо указать подсеть для тунельных интерфейсов

Выполнить автоматический запуск интерфейса и добавить в автозагрузку:

wg-quick up wg0
systemctl enable wg-quick@wg0

Проверить статус запущенного сервера можно так:

wg show

interface: wg0
  public key: dWHl7UojrbHC/Nda/ZKg7X3FYA0PUD7y5ho+l7
  private key: (hidden)
  listening port: 49312

Маршрут добавляется автоматически:

192.168.88.0/24 dev wg0 proto kernel scope link src 192.168.88.1

Чтобы клиенты могли выходить в интернет, необходимо включить forwarding пакетов:

cat > /etc/sysctl.d/wg.conf << EOF
net.ipv4.ip_forward = 1
EOF

sysctl --system

# check forwarding
cat /proc/sys/net/ipv4/ip_forward

А также настроить snat – это уже указано в поле PostUp конфига /etc/wireguard/wg0.conf

Для возможности подключения клиентов нужно не забыть настроить фаервол – разрешить форвардинг пакетов в iptables\nft, а также возможность подключения к UDP-порту, на котором слушает сервер.
В случае с AWS настройки фаервола выполняются из консоли управления EC2 и в данном случае не рассматриваются.

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

Подготовить каталог для хранения клиентских конфигов и сертификатов:

Обратить внимание на порядковый адрес для каждого клиента в поле Address, который необходимо указать в переменной CLIENT_IP.
В переменной PEER_NAME указать символьное имя клиента, а в переменной EP адрес сервера, по которому он доступен из интернета для клиента.
PEER_NAME=CHANGE_ME
CLIENT_IP=192.168.88.3
EP=CHANGE_ME # IP\DNS сервера, доступного из интернета

mkdir -p /etc/wireguard/clients && cd /etc/wireguard/clients
umask 077
mkdir ${PEER_NAME} && cd ${PEER_NAME}

Сгенерировать ключи клиента:

wg genkey > /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.key
wg pubkey < /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.key > /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.pub
wg genpsk > /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.psk

Сгенерировать конфигурационный файл для клиента:

cat > /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.conf << EOF
[Interface]
Address = ${CLIENT_IP}/32
PrivateKey = $(cat /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.key)
DNS = 1.1.1.1

[Peer]
Endpoint = ${EP}:49312
AllowedIPs = 0.0.0.0/0
PublicKey = $(cat /etc/wireguard/server.pub)
PresharedKey = $(cat /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.psk)
EOF
В поле AllowedIPs указаны адреса, доступ к которому имеет клиент. В данном случае указано 0.0.0.0/0, т.е. доступ ко всему интернету с маршрутом по умолчанию через сервер WG
Для клиентов iOS обязательно указывать параметр DNS, иначе резолвинг при подключении тунеля не работает при импорте конфига через QR-код и необходимо вписывать DNS-сервер вручную.

Добавить клиента в конфигурационный файл сервера:

cat >> /etc/wireguard/wg0.conf << EOF

[Peer]
# ${PEER_NAME}
AllowedIPs = ${CLIENT_IP}/32 
PublicKey = $(cat /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.pub)
PresharedKey = $(cat /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.psk)
EOF

Выполнить мягкий перезапуск сервера:

wg syncconf wg0 <(wg-quick strip wg0)

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

yum -y install qrencode

Для генерации QR прямо в терминале:

qrencode -t ansiutf8 < /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.conf

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

После выполнения вышеописанных действий по настройке клиентской конфигурации можно подключить роутер Mikrotik в качестве клиента.

# Создать интерфейс для клиента с указанием приватного ключа пира, сгенерированного ранее
/interface/wireguard/add name=wireguard-client listen-port=12345 private-key="содержимое файла /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.key"

# Создать пир, указав публичный ключ сервера WG, psk ключ клиента, а также разрешенные подсети + адрес и порт самого сервера WG
/interface/wireguard/peers add interface=wireguard-client public-key="содержимое файла /etc/wireguard/server.pub" preshared-key="содержимое файла /etc/wireguard/clients/${PEER_NAME}/${PEER_NAME}.psk" allowed-address=192.168.88.0/24 endpoint-address=IP_OF_WG_SRV endpoint-port=49312

# Назначить IP-адрес клиента для созданного интерфейса
/ip/address/add interface=wireguard-client address=192.168.88.2/24
На момент написания заметки RouterOS 7 не принимает значения DNS в качестве эндпоинта, нужно указывать только IP-адрес

Заключение

В заметке был рассмотрен протокол WireGuard и его реализация в Linux, а также пошаговая настройка сервера и мобильного клиента. Протокол набирает популярность, что теперь добавлен в ядро линукс, а также доступен из коробки в RouterOS 7.

В заключении можно сказать, что WireGuard очень прост и будет удобен для тех, кто не хочет по каким-то причинам разбираться в сложной настройке и конфигурации сети, маршрутов и т.д. Для эксплуатации при наличии множества клиентов WG может быть не очень удобен, т.к. вручную добавлять каждого клиента и удалять может быть утомительно без какой-либо автоматизации\обёртки. Из доступных навскидку нашёл такое, но на практике не проверял.

В сравнении с IPsec реализация WG куда проще и удобнее в настройке. Если сравнить с OpenVPN – он тоже не особо сложный, поэтому тут стоит сравнивать скорость работы и исходные требования под задачу. Где и как применять WG – этот вопрос останется без ответа, главное помнить, что любой инструмент хорошо применим для конкретной задачи.

Используемые источники

Понравилась статья? Поделиться с друзьями:
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: