Введение
В рунете уже достаточно статей про 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
Выполнить автоматический запуск интерфейса и добавить в автозагрузку:
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
В случае с AWS настройки фаервола выполняются из консоли управления EC2 и в данном случае не рассматриваются.
Настройка клиента
Подготовить каталог для хранения клиентских конфигов и сертификатов:
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
Добавить клиента в конфигурационный файл сервера:
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
Заключение
В заметке был рассмотрен протокол WireGuard и его реализация в Linux, а также пошаговая настройка сервера и мобильного клиента. Протокол набирает популярность, что теперь добавлен в ядро линукс, а также доступен из коробки в RouterOS 7.
В заключении можно сказать, что WireGuard очень прост и будет удобен для тех, кто не хочет по каким-то причинам разбираться в сложной настройке и конфигурации сети, маршрутов и т.д. Для эксплуатации при наличии множества клиентов WG может быть не очень удобен, т.к. вручную добавлять каждого клиента и удалять может быть утомительно без какой-либо автоматизации\обёртки. Из доступных навскидку нашёл такое, но на практике не проверял.
В сравнении с IPsec реализация WG куда проще и удобнее в настройке. Если сравнить с OpenVPN – он тоже не особо сложный, поэтому тут стоит сравнивать скорость работы и исходные требования под задачу. Где и как применять WG – этот вопрос останется без ответа, главное помнить, что любой инструмент хорошо применим для конкретной задачи.