Network, Security: Wireguard

Summary
  • Ключевые особенности/характеристики Wireguard:
    • Достоинства
      • Connection-less Protocol (based on UDP)
WireGuard only[9] uses UDP[4] and thus does not work in networks that block UDP traffic. This is unlike alternatives like OpenVPN because of the many disadvantages of TCP-over-TCP routing.
      • WireGuard supports only layer 3 for both IPv4 and IPv6 and can encapsulate v4-in-v6 and vice versa.
      • WireGuard supports multiple topologies: Point-to-point, Star (server/client) Mesh
      • WireGuard original code-base is less than 1% the size of a popular IPsec/OpenVPN implementation(s), making it easy for us to understand and secure.
      • Высокая производительность (ниже чем Ipsec с offload, но выше чем без offload)
      • Современный стек security протоколов
      • Быстрая установка соединений и меньшая задержка приложений за счет того, что полезные данные передаются в первом же пакете
Ars Technica reported that in testing, stable tunnels were easily created with WireGuard, compared to alternatives, and commented that it would be "hard to go back" to long reconnection delays, compared to WireGuard's "no nonsense" instant reconnections.
      • Поддержка связки ассиметричного (Curve25519)
        и симметричного шифрования (PSK) для большей безопаности
      • Один из сенаторов USA попросил NIST изучить протокол как замену IPsec/OpenVPN.
WireGuard aims to provide a simple and effective virtual private network implementation. A 2018 review by Ars Technica observed that popular VPN technologies such as OpenVPN and IPsec are often complex to set up, disconnect easily (in the absence of further configuration), take substantial time to negotiate reconnections, may use outdated ciphers, and have relatively massive code bases of over 400,000 and 600,000 lines of code, respectively, which hinders debugging.
By using versioning of cryptography packages, it focuses on ciphers believed to be among the most secure current encryption methods, and at the time of the Ars Technica review had a codebase of around 4000 lines of kernel code, about 1% of either OpenVPN or IPsec, making security audits easier.

Oregon senator Ron Wyden has recommended to the National Institute of Standards and Technology (NIST) that they evaluate WireGuard as a replacement for existing technologies like IPsec and OpenVPN.

Optional Pre-shared Symmetric Key Mode
WireGuard supports pre-shared symmetric key mode, which provides an additional layer of symmetric encryption to mitigate future advances in quantum computing. This addresses the risk that traffic may be stored until quantum computers are capable of breaking Curve25519; at which point traffic could be decrypted. Pre-shared keys are "usually troublesome from a key management perspective and might be more likely stolen", but in the shorter term, if the symmetric key is compromised, the Curve25519 keys still provide more than sufficient protection.
Wireguard was incorporated into the Linux 5.6 kernel

WireGuard was praised by Linux kernel creator Linus Torvalds who stated that it is a "work of art" in contrast to OpenVPN and IPsec.[
Linus Torvalds merged David Miller's net-next tree, and WireGuard entered the mainline Linux kernel tree.
Android developers added native kernel support for WireGuard in their Generic Kernel Image.
FreeBSD-based pfSense Community Edition (CE) 2.5.0 and pfSense Plus 21.02 removed kernel-based WireGuard as well.
The official package repositories for both pfSense CE 2.5.2 and pfSense Plus 21.05 included the WireGuard package.

 

Практика

Для remote-access VPN в сравнении с IPSec + L2TP Wireguard это просто сказка – поднятие VPN (а это не только первичное подключение, а любые переподключения) в тысячи раз быстрее, говорю на практике. Поднимал как чистый сервис, так и docker image контейнер от LinuxServer.io.

IOS

Приложение простейшее и удобное – конфиг клиента можно прочитать из файла, отсканировать QR (самое удобное чаще всего) или настоить вручную. Так же есть опции по включению on-demand (только в зависимости от среды LTE/WiFi, но это самые частые кейсы).

Zyxel Keenetic

На Zyxel при настройке обращает внимание IP MTU – 1324, заведомо низкий  MTU под который подстраиваются кадры с помощью adjust-mss.

Кстати, полученный конфиг peer_<name>.conf из Docker Image Wireguard (о нем ниже) не распарсился корректно GUI keenetic – пришлось подставлять IP/port вручную, только после этого заработало.
interface Wireguard0
description reverse-tunnel-for-camera-WG
security-level public
ip address <ip> 255.255.255.0
ip mtu 1324
ip tcp adjust-mss pmtu
wireguard listen-port 51820
wireguard peer <key> !weril.me
endpoint weril.me:51820
keepalive-interval 30
preshared-key <psk>
allow-ips 0.0.0.0 0.0.0.0
!
up

ManualConfiguration

Установка в Linux с ядра 5.6 не требуется – код уже в ядре.

Ключи конфигурации:

    • listen-port – на каком порту слушаем мы
    • private-key – наш приватный ключ
    • peer – публичный ключ peer
      • allowed_ips – работает как таблица маршрутизации при приеме пакета вне туннеля и как фильтр при приеме пакета из определенного туннеля
      • endpoint – адрес endpoint, можно указать только с одной стороны (напр. spoke)

Docker Image от LinuxServer.io

Использовал популярный docker img от LinuxServer.io (50 млн openvpn и 10 млн загрузок wireguard).

docker pull linuxserver/wireguard
По конфигу: осторожно с именами PEERS – во первых должны содержать только символы, во вторых не должны иметь пробелов между ними.
Так же изменение SERVERPORT на 443 по факту не сработало – Wireguard в контейнере был настроен на прослушивание стандратного 51820!
Пришлось это траблшутить (wg status) и настраивать дефолтно (перегенериррорвать контейнер и QR код).
**** Peer <some_example_name> contains non-alphanumeric characters and thus will be skipped. No config for peer <some_example_name> will be generated. ****
sudo docker run -d \
--name=weril-wireguard \
--cap-add=NET_ADMIN \
--cap-add=SYS_MODULE \
-e PUID=1000 \
-e PGID=1000 \
-e TZ=Europe/London \
-e SERVERURL=weril.me `#optional` \
-e SERVERPORT=51820 `#optional` \
-e PEERS=X1,X2,X3,X4,X5 `#optional` \
-e PEERDNS=1.1.1.1,8.8.8.8 `#optional` \
-e INTERNAL_SUBNET=10.13.13.0 `#optional` \
-e ALLOWEDIPS=0.0.0.0/0 `#optional` \
-e LOG_CONFS=true `#optional` \
-p 51820:51820/udp \
-v /path/to/appdata/config:/config \
-v /lib/modules:/lib/modules `#optional` \
--sysctl="net.ipv4.conf.all.src_valid_mark=1" \
--restart unless-stopped \
linuxserver/wireguard
Для Centos7 потребовалась установка kernel модуля. Без него была ошибка ниже.
sudo docker logs weril-wireguard
E: Sub-process returned an error code
**** No kernel headers found in the Ubuntu or Debian repos!! Will try the headers from host (if mapped), may or may not work ****
**** Kernel headers don't seem to be available in Ubuntu, Debian and Raspbian repos, or shared from the host; therefore can't compile the module. Sleeping now. . . ****
Установка на “гипервизоре” docker:
https://www.wireguard.com/install/
Method 2: users wishing to stick with the standard kernel may use ELRepo's pre-built module:
$ sudo yum install epel-release elrepo-release
$ sudo yum install yum-plugin-elrepo
$ sudo yum install kmod-wireguard wireguard-tools
Далее удаляем docker и создаем новый, должно все работать:
sudo docker rm -f weril-wireguard
sudo docker logs weril-wireguard
В логах докера будут фигурировать qr коды для клиентов, файлы с конфигами можно забрать из контейнера из папки /config/. Либо можно вызвать QR code так.
The peer/client config qr codes will be output in the docker log. They will also be saved in text and png format under /config/peerX in case PEERS is a variable and an integer or /config/peer_X in case a list of names was provided instead of an integer.

-bash-4.2$ sudo docker exec -it weril-wireguard /app/show-peer <some_example_name>

PEER <some_example_name> QR code:

Leave a Reply