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

По сравнению с сотнями тысяч строк кода 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.


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

Введение в модуль виртуальной сети 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, и в ближайшем будущем его популярность, вероятно, будет расти. Дополнительную информацию, настройки и сценарии применения см. в официальной документации.