Установка WireGuard на Ubuntu/Debian

Сегодня в статье приведу пример по установке и настройке VPN сервера WireGuard для операционных систем Ubuntu и Debian. Также данная статья будет справедлива и для всех производных систем данного типа.






WireGuard – это современная высокопроизводительная VPN для Linux,Windows, MacOS. Главной функцией WireGuard является обеспечение безопасного соединения между сторонами через сетевой интерфейс, зашифрованный с помощью аутентификации по открытому ключу. Это означает, что, в отличие от большинства виртуальных частных сетей, WireGuard не применяет топологию, что позволяет создавать различные конфигурации путем изменения конфигураций окружающей сети. Эта модель предлагает большую производительность и гибкость.




Сейчас WireGuard готовится к включению в состав ядра Linux. Если быть точнее, то он появится в ядре версии 5.6, он даже получил похвалу от Линус Торвальдса и в американском сенате.




Специалисты проверили скорость работы WireGuard и выяснили, что он способен обойти большинство протоколов шифрования в том числе широко известный протокол OpenVPN.




Причина, которая объясняет высокую скорость работы WireGuard, это применение быстрого и современного алгоритма шифрования, благодаря которому скорость передачи данных очень высока.
Кроме того, данный протокол очень похож на https, что позволяет обманывать системы анализа трафика DPI, установленные у Вашего провайдера и обходить эти блокировки по сигнатурам.




Установка и настройка при помощи скрипта




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




Первым шагом подготовим нашу систему:




sudo -su
apt update && apt upgrade -y
apt install curl




Далее скачиваем скрипт.




curl -O https://raw.githubusercontent.com/angristan/wireguard-install/master/wireguard-install.sh




Делаем его исполняемым:




chmod +x wireguard-install.sh




Запускаем установку и настройку WireGuard




./wireguard-install.sh




Установка WireGuard на Ubuntu




Установку нашего VPN WireGuard я буду производить на сервере под управлением операционной системы Ubuntu/Debian. И так поехали.




Ubuntu 18.04




Для начала надо добавить официальный репозиторий в систему:




sudo add-apt-repository ppa:wireguard/wireguard




  • Обновляем индексы




sudo apt update




  • Устанавливаем wireguard




sudo apt install -y wireguard wireguard-dkms iptables resolvconf qrencode




Ubuntu 20.04/22.04




Так как пакет входит в офицмальный репозиторий, то необходимо набрать всего лишь данные команды:




  • Обновляем индексы




sudo apt update




  • Устанавливаем wireguard




sudo apt install -y wireguard wireguard-dkms iptables resolvconf qrencode




Установка WireGuard на Debian




Для того чтобы установить WireGuard на Debian с начало необходимо авторизоваться под root пользователем:




sudo su




Далее набираем следующее:




echo "deb http://deb.debian.org/debian buster-backports main" >/etc/apt/sources.list.d/backports.list
apt update
apt install -y iptables resolvconf qrencode
apt install -y -t buster-backports wireguard




Для остальных операционных систем можете посмотреть официальную страничку инсталляции.




Также установите заголовки для вашего ядра, если вы еще этого не сделали:




apt-get install linux-headers-$(uname -r|sed 's/[^-]*-[^-]*-//')




Настройка VPN WireGuard на серверной части




Давайте теперь настроим наш высокопроизводительный VPN на сервере wireguard. Для этого создадим файл конфигурации и необходимые ключи шифрования. Все действия выполняем из под root.




sudo su




(umask 077 && printf "[Interface]nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/wg-server-publickey.key




  • Первая команда записывает исходное содержимое конфигурационного файла в /etc/wireguard/wg0.conf. Значение umask в суб-оболочке позволяет создать файл с ограниченными разрешениями, не затрагивая обычную среду.
  • Вторая команда генерирует закрытый ключ с помощью команды wg и записывает ее непосредственно в конфигурационный файл с ограниченным доступом. Затем ключ передается обратно команде wg pubkey, чтобы получить связанный с ним открытый ключ, который записывается в /etc/wireguard/wg-sever-publickey.key. 




Следующим шагом нам необходимо включить форвардинг пакетов через наш сервер, для этого открываем следующий файл:




sudo nano /etc/sysctl.conf




И уберем знак комментария # со строки:




net.ipv4.ip_forward=1




Применим изменения




sudo sysctl -p




Далее отрываем файл на редактирования и вносим необходимую информацию о нашей VPN сети.




sudo nano /etc/wireguard/wg0.conf




Конфигурационный файл vpn wireguard




Внутри, в разделе [Interface], вы должны увидеть свой сгенерированный закрытый ключ. Этот раздел содержит конфигурацию для локальной стороны соединения.




В разделе Interface нужно также определить IP-адрес VPN, который будет использовать этот узел, и порт, который он будет прослушивать для соединений с одноранговыми узлами.




Давайте добавим в него следующие строки ListenPort, SaveConfig и Address:




[Interface]
PrivateKey = приватный_ключ_сервера
ListenPort = 5555
SaveConfig = true
Address = 10.0.0.1/24 
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -t nat -A POSTROUTING -o wg0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -t nat -D POSTROUTING -o wg0 -j MASQUERADE




  • ListenPort – указываем свободный порт который будет прослушивать наш сервис wg-quick (VPN WireGuard)
  • SaveConfig – имеет значение true, чтобы сервис wg-quick мог автоматически сохранять свою активную конфигурацию в этом файле при завершении работы.
  • Address – это наш IP-адрес и маска сети
  • PostUP и PostDown – запускают необходимые правило для iptables




Пробуем поднять нашу сеть скриптом wg-quick:




sudo wg-quick up /etc/wireguard/wg0.conf




В системах с systemd вместо этого можно использовать следующую запись:




sudo systemctl start wg-quick@wg0.service




Если systemd ругается, то сперва необходимо включить сервис следующей командой:




sudo systemctl enable wg-quick@wg0.service




Настройка VPN WireGuard на клиентской машине




В качестве клиента у меня будет выступать ноутбук с операционной системой Ubuntu Desktop 18.04 LTS




Все действия выполняем из под пользователя root.




sudo su
add-apt-repository ppa:wireguard/wireguard 
apt install wireguard -y




Для Ubuntu 20.04 необходимо повторить тоже самое, что и при установке на серверную часть. (см. Выше)




Далее создаем конфигурационный файл и генерируем ключи:




(umask 077 && printf "[Interface]nPrivateKey = " | sudo tee /etc/wireguard/wg0.conf > /dev/null)
wg genkey | sudo tee -a /etc/wireguard/wg0.conf | wg pubkey | sudo tee /etc/wireguard/wg-server-publickey.key




Открываем наш конфигурационный файл и вносим изменения.




sudo nano /etc/wireguard/wg0.conf




[Interface]
PrivateKey = приватный_ключ_клиента
ListenPort = 5555
Address = 10.0.0.2/32 




Создайте раздел под названием [Peer] после раздела [Interface].




[Peer]
PublicKey = Публичный_ключ_сервера
AllowedIPs = 10.0.0.0/24
Endpoint = IP-адрес_сервера:5555
PersistentKeepalive = 10




  • PublicKey – укажите значение открытого ключа сервера. Вы можете найти это значение, набрав на сервере команду: wg
  • AllowedIPs – указывает на пропуск трафика через VPN. В данном случае будет проходить через VPN только трафик сети 10.0.0.0/24. Весть остальной трафик пойдет через вашего провайдер. Для заворота всего трафика через VPN указываем значение 0.0.0.0/0
  • PersistentKeepalive – время в секундах для постоянной проверки доступности ресурса.




Запускаем сервис на Ubuntu:




 sudo systemctl start wg-quick@wg0.service 




Запускаем сервис на Debian:




sudo wg-quick up /etc/wireguard/wg0.conf




Peer на стороне сервера




На сервере также необходимо добавить информацию о клиенте. Иначе ваш туннель VPN не откроется. Для этого возвращаемся на сервер и останавливаем службу wireguard:




sudo systemctl stop wg-quick@wg0.service




Далее открываем конфигурационный файл:




sudo nano /etc/wireguard/wg0.conf




И вносим информацию о клиенте.




[Peer]
PublicKey = публичный_ключ_клиента
AllowedIPs = 10.0.0.5/32
PersistentKeepalive = 10




  • PublicKey – ключ клиента можно посмотреть на клиентской машине при помощи команды wg.
  • AllowedIPs – указывает на IP клиента. Обязательно с маской 32




Запускаем наш сервис:




 sudo systemctl start wg-quick@wg0.service 




Пробуем пропинговать клиента.




ping 10.0.0.2




64 bytes from 10.0.0.2: icmp_seq=1 ttl=64 time=0.916 ms
64 bytes from 10.0.0.2: icmp_seq=2 ttl=64 time=0.545 ms
64 bytes from 10.0.0.2: icmp_seq=3 ttl=64 time=0.647 ms




Со стороны клиента также должен проходить пинг до сервера.




ping 10.0.0.1




64 bytes from 10.0.0.1: icmp_seq=1 ttl=64 time=2.40 ms
64 bytes from 10.0.0.1: icmp_seq=2 ttl=64 time=0.646 ms
64 bytes from 10.0.0.1: icmp_seq=3 ttl=64 time=0.555 ms




Хотя статья получилась большой, но все настраивается очень быстро.




Тонкая настройка параметров WireGuard на примере Proxmox




  • /usr/lib/sysctl.d/10-pve-ct-inotify-limits.conf
    fs.inotify.max_queued_events = 8388608
    fs.inotify.max_user_instances = 65536
    fs.inotify.max_user_watches = 4194304
    vm.max_map_count = 262144
    net.ipv4.neigh.default.gc_thresh3 = 8192
    net.ipv6.neigh.default.gc_thresh3 = 8192
    kernel.keys.maxkeys = 2000
  • /usr/lib/sysctl.d/10-pve.conf
    net.bridge.bridge-nf-call-ip6tables = 0
    net.bridge.bridge-nf-call-iptables = 0
    net.bridge.bridge-nf-call-arptables = 0
    net.bridge.bridge-nf-filter-vlan-tagged = 0
    net.ipv4.igmp_link_local_mcast_reports = 0
    fs.aio-max-nr = 1048576
  • /usr/lib/sysctl.d/50-pid-max.conf
    kernel.pid_max = 4194304
  • /etc/sysctl.d/99-sysctl.conf
    net.ipv4.ip_forward = 1
  • /usr/lib/sysctl.d/protect-links.conf
    fs.protected_fifos = 1
    fs.protected_hardlinks = 1
    fs.protected_regular = 2
    fs.protected_symlinks = 1
  • /usr/lib/sysctl.d/pve-firewall.conf
    net.ipv4.conf.all.rp_filter = 2
  • /etc/sysctl.d/wg.conf
    net.ipv4.ip_forward = 1
    net.ipv6.conf.all.forwarding = 1
  • /etc/sysctl.conf
    net.ipv4.ip_forward = 1



[endtxt]




. . . .




2020-02-06T02:33:33
VPN