WireGuard ® - это чрезвычайно простой, но быстрый и современный VPN, в котором используется самая современная криптография . Он нацелен на то, чтобы быть быстрее , проще , компактнее и полезнее, чем IPsec, избегая при этом огромной головной боли. Он намерен быть значительно более производительным, чем OpenVPN. WireGuard разработан как VPN общего назначения для работы как на встроенных интерфейсах, так и на суперкомпьютерах, пригодный для многих различных ситуаций. Изначально выпущенный для ядра Linux, теперь он является кроссплатформенным (Windows, macOS, BSD, iOS, Android) и может широко развертываться. В настоящее время он интенсивно разрабатывается, но уже может считаться самым безопасным, простым в использовании и самым простым решением VPN в отрасли.
Наступило время, когда VPN уже не является каким-то экзотическим инструментом бородатых сисадминов. Задачи у пользователей разные, но факт в том, что VPN стал нужен вообще всем.
Проблема текущих VPN решений в том, что их тяжело правильно настроить, дорого обслуживать, а так же в них полно legacy кода сомнительного качества.
Несколько лет назад канадский специалист по информационной безопасности Jason A. Donenfeld решил, что хватит это терпеть, и начал работу над WireGuard. Сейчас WireGuard готовится к включению в состав ядра Linux, он даже получил похвалы от Линуса Торвальдса и в американском сенате.
Заявленные преимущества WireGuard над другими VPN решениями:
- Простой в использовании.
- Использует современную криптографию: Noise protocol framework, Curve25519, ChaCha20, Poly1305, BLAKE2, SipHash24, HKDF и т.д.
- Компактный читаемый код, проще исследовать на уязвимости.
- Высокая производительность.
- Четкая и проработанная спецификация.
Неужели найдена серебрянная пуля? OpenVPN и IPSec пора закапывать? Я решил с этим разобраться, а заодно сделал скрипт для автоматической установки личного VPN сервера.
Принципы работы
Принципы работы можно описать примерно так:
- Создается WireGuard интерфейс, ему назначается приватный ключ и IP адрес. Загружаются настройки других пиров: их публичные ключи, IP адреса и т.д.
- Все IP пакеты, приходящие на WireGuard интерфейс инкапсулируются в UDP и безопасно доставляются другим пирам.
- Клиенты задают публичный IP адрес сервера в настройках. Сервер автоматически узнает внешние адреса клиентов, когда от них приходят корректно аутентифицированные данные.
- Сервер может менять публичный IP адрес не прерывая работы. При этом он отошлет оповещение подключенным клиентам и они обновят свою конфигурацию на лету.
- Используется концепт маршрутизации Cryptokey Routing. WireGuard принимает и отправляет пакеты на основании публичного ключа пира. Когда сервер расшифровывает корректно аутентифицированный пакет, проверяется его src поле. Если оно соответствует с конфигурацией
allowed-ips
аутентифицированного пира, то пакет принимается интерфейсом WireGuard. При отправке исходящего пакета происходит соответственная процедура: берется dst поле пакета и на основании его выбирается соответсвующий пир, пакет подписывается своим ключом, шифруется ключом пира и отправляется на remote endpoint.
Вся основная логика WireGuard занимает менее 4 тысяч строк кода, тогда как OpenVPN и IPSec имеют сотни тысяч строк. Для поддержки современных криптоалгоритмов предлагается включить в состав ядра Linux новый криптографический API Zinc. В данный момент идет обсуждение, насколько это удачная идея.
Существует несколько основных типов топологий сетей:
1. Это так называемая "Общая шина" ее частным случаем применительно к VPN и WireGuard "Point-to-Point". Точка - точка.
2. Наиболее часто используемой топологией является "Star". Она же звезда. Когда все хосты подключены к единому центру.
3. Топология "Mesh" это комбинированный вариант двух предыдущих, сочетающий в себе их достоинства.
В данном примере будет рассмотрен способ построения сети VPN c помощью ПО WireGuard из трех серверов по топологии "Mesh".
Установите на вашу ОС специальное ПО, если у вас Ubuntu/Debian, то используйте следующие команды:
Обновляемся и устанавливаем wireguard:
apt update
apt upgrade
apt install wireguard
Если у вас старая версия дебиана то возможно вам помежет команда:
sudo apt-get install linux-headers-$(uname -r|sed 's/[^-]*-[^-]*-//')
Можем перезагрузиться:
shutdown -r now
Создаем ключи на всех серверах:
umask 077
wg genkey | tee privatekey | wg pubkey > publickey
Создаем конфигурационный файл с настройками на Server1:
nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = < Server1 private key >
Address = 10.0.0.1/32
ListenPort = 51820
[Peer]
PublicKey = < Server2 public key >
AllowedIPs = 10.0.0.2/32
Endpoint = < Server2 ip address >:51820
[Peer]
PublicKey = < Server3 public key >
AllowedIPs = 10.0.0.3/32
Endpoint = < Server3 ip address >:51820
Создаем конфигурационный файл с настройками на Server2:
nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = < Server2 private key >
Address = 10.0.0.2/32
ListenPort = 51820
[Peer]
PublicKey = < Server1 public key >
AllowedIPs = 10.0.0.1/32
Endpoint = < Server1 ip address >:51820
[Peer]
PublicKey = < Server3 public key >
AllowedIPs = 10.0.0.3/32
Endpoint = < Server3 ip address >:51820
Создаем конфигурационный файл с настройками на Server3 и т.д. Только не забудьте по аналогии добавить нужные сервера во все конфиги:
nano /etc/wireguard/wg0.conf
[Interface]
PrivateKey = < Server3 private key >
Address = 10.0.0.3/32
ListenPort = 51820
[Peer]
PublicKey = < Server1 public key >
AllowedIPs = 10.0.0.1/32
Endpoint = < Server1 ip address >:51820
[Peer]
PublicKey = < Server2 public key >
AllowedIPs = 10.0.0.2/32
Endpoint = < Server2 ip address >:51820
Посмотреть публичный и приватный ключи на серверах можно командами:
root@Deb10kali:~# cat publickey OotmzeyQA1Eogo/X310L3HsNpckxK6sELp5p2wVZUjM=
root@Deb10kali:~# cat privatekey OMz9ITDaynESUc+VcQktijnSjUoDekkIAOBJmpXn6FM=
Переход в папку с программой:
cd /etc/wireguard/
ls -l
PrivateKey - Приватный ключ Server1.
Address - IP Внешний ip сервера wireguard vpn Server1
ListenPort - какой wireguard слушает порт.
mcedit /etc/wireguard/wg0.conf
Для некоторых топологий может потребоваться включение форвординга:
в файле /etc/sysctl.conf раскомментируйте:
net.ipv4.ip_forward=1
echo 1 > /proc/sys/net/ipv4/ip_forward
Далее выполните команду:
echo 1 > /proc/sys/net/ipv4/ip_forward
После можем перезагрузиться:
shutdown -r now
Запускаем Wireguard и добавляем его в автозагрузку:
systemctl enable wg-quick@wg0
systemctl start wg-quick@wg0
Перезапуск сервиса:
systemctl restart wg-quick@wg0