WireGuard: новое поколение виртуальных сетевых артефактов уровня ядра

Что такоеWireGuard

 Это простой в настройке, быстрый и безопасный VPN-сервис с открытым исходным кодом, использующий новейшие технологии шифрования. Он призван обеспечить более быструю, простую и оптимизированную VPN общего назначения, которую можно легко развернуть как на бюджетных устройствах, таких как Raspberry Pi, так и на высокопроизводительных серверах.

Большинство других решений, таких как IPsec и OpenVPN, были разработаны десятилетия назад после того, как исследователь безопасности и разработчик ядра Джейсон Доненфельд понял, что они медленные и их сложно правильно настраивать и администрировать.

Это привело его к созданию нового протокола VPN с открытым исходным кодом и решения, которое было бы быстрее, безопаснее и проще в развертывании и управлении.

WireGuard изначально был разработан для Linux, но теперь доступен для Windows, macOS, BSD, iOS и Android. Он всё ещё находится в стадии активной разработки.

Почему WireGuard так популярен?

Одним из главных преимуществ WireGuard, помимо кроссплатформенности, является простота его развертывания. Настройка и развертывание WireGuard так же просты, как настройка и использование SSH.

Ознакомьтесь с руководством по настройке WireGuard. Установите WireGuard, сгенерируйте открытый и закрытый ключи (например, SSH), настройте правила брандмауэра и запустите службу. А теперь сравните это с руководством по настройке OpenVPN — там ещё много всего нужно сделать.

Ещё одно преимущество WireGuard — небольшая кодовая база, состоящая всего из 4000 строк. Сравните это с OpenVPN (ещё одним популярным VPN с открытым исходным кодом), у которого 100 000 строк кода. Очевидно, отладка WireGuard гораздо проще.

Не позволяйте его простоте обмануть вас. WireGuard поддерживает все новейшие криптографические методы, такие как фреймворк Noise Protocol, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и безопасные доверенные структуры.

Поскольку WireGuard работает в пространстве ядра, он может обеспечить безопасную сетевую работу на высоких скоростях.

Характеристики основных виртуальных сетей

В настоящее время на рынке представлены такие основные виртуальные сети, как виртуальная сеть IPSEC, виртуальная сеть SSL, виртуальная сеть PPTP, виртуальная сеть L2TP и т. д. Все они имеют очевидные недостатки с точки зрения безопасности и производительности, как показано в таблице 1 ниже.

WireGuard: новое поколение виртуальных сетевых артефактов уровня ядра

Введение в WireGuard

Виртуальная сеть WireGuard — новейшая разработанная виртуальная сеть уровня ядра. Она настоятельно рекомендована основателем Linux Линусом Торвальдсом и официально включена в ядро Linux 5.6 в марте 2020 года. Впоследствии GG также добавила виртуальную сеть WireGuard в ядро Linux для Android 12. Её преимуществами являются высокая безопасность, производительность и простота. Подробнее см. в таблице 2 ниже.

WireGuard: новое поколение виртуальных сетевых артефактов уровня ядра

По сравнению с сотнями тысяч строк кода OpenVPN и IPSec, WireGuard имеет всего четыре тысячи строк.

Основатель LinuxЛинус ТорвальдсПо почтеНазови этоПроизведение искусства:произведение искусстваИсходное письмо: https://lists.openwall.net/netdev/2018/08/02/124

Могу ли я ещё раз выразить ему свою любовь и надежду на скорое объединение? Возможно, код не идеален, но я его бегло просмотрел, и по сравнению с ужасами OpenVPN и IPSec это настоящее произведение искусства.

Безопасность WireGuard

  • Curve25519 в настоящее время является алгоритмом обмена ключами самого высокого уровня.
  • Симметричный алгоритм шифрования и дешифрования ChaCha20, более быстрый и эффективный, чем AES.
  • Poly1305 — это стандарт MAC (код аутентификации сообщений), используемый для проверки целостности данных и подлинности сообщений.
  • BLAKE2 — более безопасный алгоритм HASH (аналогичный SHA1, SHA256, MD5)
  • SipHash24 Еще один алгоритм HASH.
  • HKDF — это алгоритм вывода ключей

Возможности виртуальной сети WireGuard

Поскольку виртуальная сеть WireGuard обрабатывается ядром 100%, она устраняет накладные расходы на взаимодействие пользовательских процессов с ядром, что обеспечивает превосходную производительность. В частности, она обладает высокой пропускной способностью, которая в 2–4 раза превышает пропускную способность виртуальных сетей SSL/открытых виртуальных сетей, как показано на рисунке 1. При этом она имеет низкую задержку, которая составляет от 30% до 40% по сравнению с задержками виртуальных сетей SSL/открытых виртуальных сетей, как показано на рисунке 2.

WireGuard: новое поколение виртуальных сетевых артефактов уровня ядра
WireGuard: новое поколение виртуальных сетевых артефактов уровня ядра

Более высокая пропускная способность и меньшая задержка означают большее количество одновременных пользователей виртуальной сети в сетевой среде с той же пропускной способностью, меньшую нагрузку на систему и более стабильную работу в долгосрочной перспективе. Это один из ключевых факторов, которые следует учитывать при выборе виртуальных сетей с числом пользователей от 100 до 10 000, нулевым доверием и SD-WAN.

Чтобы определить, обслуживается ли служба виртуальной сети ядром 100%, можно выполнить команду netstat –nap в командной строке Shell, чтобы увидеть программу, соответствующую порту прослушивания сервера виртуальной сети. Если в последнем столбце указано имя программы, это означает, что прослушивает программа пользовательского режима. Если в последнем столбце указан символ «-» без имени программы, это означает, что прослушивает ядро. Ниже представлена статистика различных серверов виртуальной сети в системе управления облаком Dadi, представленная в таблице 3.

WireGuard: новое поколение виртуальных сетевых артефактов уровня ядра

Введение в модуль виртуальной сети WireGuard

Виртуальная сеть WireGuard использует систему шифрования с открытым и закрытым ключами. Параметры шифрования состоят из собственного закрытого ключа и открытого ключа другой стороны. То есть, взаимодействующим сторонам необходимо заранее обменяться открытыми ключами. При большом количестве клиентов генерация, изменение, уничтожение и обмен ключами, а также получение клиентских конфигурационных файлов становятся сложной задачей. В отличие от этого, виртуальная сеть IKEv2 использует систему шифрования с использованием CA. При использовании CA-сертификата с реальным доменным именем можно избежать предварительного обмена открытыми ключами.

Установка WireGuard

  • Официальное руководство по установке: https://www.wireguard.com/install/
  • Установка Docker: https://hub.docker.com/r/linuxserver/wireguard

Установка исходного кода Wireguard в CentOS 7

 curl -o /etc/yum.repos.d/jdoss-wireguard-epel-7.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo 

Установка Wireguard на CentOS 7

 yum install -y wireguard-dkms wireguard-tools 

Если вы чувствуете, что скорость низкая, вы можете сначала перейти на источник Wireguard, чтобы загрузить пакет RPM:

 wget https://copr-be.cloud.fedoraproject.org/results/jdoss/wireguard/epel-7-x86_64/02151984-wireguard-dkms/wireguard-dkms-1.0.20210424-1.el7.noarch.rpm 

Установка Wireguard на CentOS 8

 
yum install epel-release yum config-manager --set-enabled powerTools yum copr enable jdoss/wireguard yum install wireguard-dkms wireguard-tools
 

Конфигурация WireGuard

Инструкции по настройке Wireguard

  • [Interface] в файле конфигурации сервера хранит закрытый ключ сервера, а [Interface] в файле конфигурации клиента также хранит закрытый ключ клиента.
  • [Peer] в файле конфигурации сервера хранит открытый ключ клиента, тогда как [Peer] в файле конфигурации клиента хранит открытый ключ сервера.
  • Сервер и клиент сохраняют свои собственные закрытые ключи в [Interface], а открытые ключи друг друга — в [Peer].

Конфигурация сервера Wireguard

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat <<EOF>/etc/wireguard/wg0.conf

[Интерфейс] # Адрес необходимо только записать и назначить локальному виртуальному адресу. Адреса сервера и клиента уникальны и не могут конфликтовать. Адрес = 178.10.10.1/24 SaveConfig = true # Серверному брандмауэру нужно только включить маскарад для одного порта UDP и сопоставить его с внешней сетью PostUp = firewall-cmd --zone=public --add-port 50107/udp && firewall-cmd --zone=public --add-masquerade PostDown = firewall-cmd --zone=public --remove-port 50107/udp && firewall-cmd --zone=public --remove-masquerade # прослушивает порт, открытый верхним брандмауэром ListenPort = 50107 #PrivateKey — закрытый ключ сервера PrivateKey = kADzYhPw3F1XCAolbpHQKyPjZE1VQQeyncL60wbFQlM= [Peer] #PublicKey — открытый ключ клиента. PublicKey = xUh7M1dhWZijlQfZv1bqPAvI8dwCfsdm8RD7NfumqXY = #. AllowIP сервера нельзя задать ни для внешнего сегмента IP-адреса сервера, ни для сегмента IP-адреса локальной сети. Достаточно указать только сегмент сети, к которому локальная машина хочет получить доступ через VPN-сеть. Я задаю здесь только сегмент виртуального адреса для сервера, поскольку мне не нужно, чтобы сервер напрямую обращался к сегменту IP-адреса внутренней сети клиента. AllowedIPs = 178.10.10.2/32 EOF

Используйте перезапуск для первого запуска службы.

 systemctl restart wg-quick@wg0.service 

Повторно включить перезагрузку после последующих изменений конфигурации

 systemctl reload wg-quick@wg0.service 

Службу можно настроить на автоматический запуск только тогда, когда обе стороны могут нормально взаимодействовать.

 systemctl enable wg-quick@wg0.service 

Конфигурация клиента WireGuard

wg genkey | sudo tee /etc/wireguard/privatekey | wg pubkey | sudo tee /etc/wireguard/publickey;cat <<EOF>/etc/wireguard/wg0.conf

[Интерфейс] #PrivateKey — это закрытый ключ клиента. PrivateKey = CERouQpIqthDNhcSKqS2I/lexMH9z/pImXajg7QLs3E= #. Адрес нужно только записать и назначить локальному виртуальному адресу. Адреса сервера и клиента уникальны и не могут конфликтовать. Адрес = 178.10.10.6/32 #. Определите, какой сетевой интерфейс использовать для связи Wireguard, вот eth0. PostUp = iptables -I INPUT -i %i -j ACCEPT; iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE PostDown = iptables -D INPUT -i %i -j ACCEPT;iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE [Peer] #PublicKey — открытый ключ сервера. PublicKey = yVco0xaLnYtcR1eMjBfRnZ6mmUvmpOSeasS250nLkE4= #endpoint — внешний IP-адрес и порт сервера. Конечная точка = xxx.xx.x.xx:50107 #allowip не может записать сегмент внешнего IP-адреса сервера и сегмент IP-адреса локальной сети. Вам нужно только указать, к какому сегменту сети локальная машина хочет получить доступ через VPN-сеть. Я записал только сегмент виртуального адреса и сегмент IP-адреса внутренней сети сервера, поскольку мне нужно, чтобы клиент имел доступ к сегменту IP-адреса внутренней сети сервера. AllowedIPs = 178.10.10.0/24,192.168.0.100/24 PersistentKeepalive = 10 EOF
 

Используйте перезапуск для первого запуска службы.

 systemctl restart wg-quick@wg0.service 

Повторно включить перезагрузку после последующих изменений конфигурации

 systemctl reload wg-quick@wg0.service 

Службу можно настроить на автоматический запуск только тогда, когда обе стороны могут нормально взаимодействовать.

 systemctl enable wg-quick@wg0.service 

Конфигурация MAC WireGuard

# установить brew /bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)" # установить homebrew-bottle source echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc source ~/.zshrc # установить wireguard brew установить wiregraurd-tools

WireGuard в повседневном использовании

использование:

Использование: wg-quick [ up | down | save | strip ] [ CONFIG_FILE | INTERFACE ] # Сохранение конфигурации. Этот метод командной строки более контролируем. Лучше не редактировать файл конфигурации /etc/wireguard/wg0.conf напрямую. touch /etc/wireguard/wg0.conf wg-quick save wg0 # Или: wg showconf wg0 > /etc/wireguard/wg0.conf # Если одноранговый узел находится за NAT, может потребоваться удалить соответствующую информацию о конечной точке, поскольку к ней невозможно получить активный доступ. # Запуск/остановка wg-quick up wg0 # Автоматический выбор файла конфигурации '/etc/wireguard/wg0.conf' wg-quick up /path/to/wg0.conf # Указание пути wg-quick down wg0 # Удаление однорангового узла wg set wg0 peer $(cat cpublickey1) remove

Варианты использования WireGuard

Предыдущий пример — это базовый сценарий «точка-точка», самый простой из возможных. Давайте рассмотрим другие сценарии использования ниже.

Сценарий 1: ПК-LAN

 
# Разрешить клиенту доступ ко всем локальным сетям на сервере (т. е. обычно используется режим «ПК-локальная сеть») # Исходя из базового сценария, также необходимо выполнить следующие настройки: ## на сервере: # Добавить маршрут сегмента сети VPN к корпоративному маршрутизатору на стороне сервера # 172.30.0.0/24 через [локальный IP-адрес локальной сети] ## на клиенте: # Добавить сегмент сети на стороне сервера в локальную таблицу маршрутизации ip route add 10.1.0.0/16 через 172.30.0.1 ... # Разрешить сети на стороне сервера доступ к клиентской стороне (нет необходимости в ip link down + up; здесь 0.0.0.0/0 представляет все сети) wg set wg0 peer dLssxxxxxxxxxxxxxxxxxq98NQKOivi3MN/VM= persistent-keepalive 25 allowed-ips 172.30.0.1/32,0.0.0.0/0 конечная точка 192.168.11.29:51820

Сценарий 2: LAN-to-LAN

# Соединить локальные сети с обеих сторон в единую локальную сеть (т. е. LAN-to-LAN) # Исходя из базового сценария, необходимо выполнить следующие настройки: ## на сервере: # Добавить маршрут сегмента сети VPN к корпоративному маршрутизатору на стороне сервера # 172.30.0.0/24 через [локальный IP-адрес LAN] # Добавить маршрут сегмента сети клиента к корпоративному маршрутизатору на стороне сервера # 192.168.2.0/24 через [локальный IP-адрес LAN] # ... # Добавить маршрут сегмента сети клиента в локальную таблицу маршрутизации ip route add 192.168.0.0/16 через 172.30.0.2 ... # Разрешить клиенту доступ к сети на стороне сервера (не нужно устанавливать ip link down + up) wg set wg0 peer VbR3Kxgxxxxxxxxxxxxxxxxxzq3H4ebdgTng= allowed-ips 172.30.0.2/32,192.168.0.0/24## на клиенте: # Добавить маршрут сегмента сети VPN к клиентскому корпоративному маршрутизатору # 172.30.0.0/24 через [локальный IP-адрес LAN] # Добавить маршрут сегмента сети сервера к клиентскому корпоративному маршрутизатору # 10.1.0.0/16 через [локальный IP-адрес LAN] # ... # Добавить маршрут сегмента сети сервера в локальную таблицу маршрутизации ip route add 10.1.0.0/16 через 172.30.0.1 ... # Разрешить серверу доступ к клиентской сети (не нужно выполнять ip link down + up; 0.0.0.0/0 представляет все сети) wg set wg0 peer dLssxxxxxxxxxxxxxxxxx98NQKOivi3MN/VM= persistent-keepalive 25 allowed-ips 172.30.0.1/32,0
 

Популярность WireGuard вполне обоснована. Популярные VPN-сервисы, ориентированные на конфиденциальность, такие как Mullvad VPN, уже используют WireGuard, и в ближайшем будущем его популярность, вероятно, будет расти. Дополнительную информацию, настройки и сценарии применения см. в официальной документации.

счет

Ответить

Ваш адрес электронной почты не будет опубликован. Обязательные поля помечены *