WireGuard — это новый VPN протокол с открытым исходным кодом, основанный на последних концепциях криптографии. Его особенность – простота реализация и высокая скорость работы. WireGuard работать быстрее и качественнее, чем VPN-протоколы OpenVPN и IKEv2. WireGuard реализует методы виртуальной частной сети для создания защищенных соединений в маршрутизируемых или мостовых конфигурациях, Включен в состав ядра Linux, начиная с версии 5.6.
Преимущества WireGuard:
- Простой в установке, настройке и использовании;
- Использует современные криптографические алгоритмы: Noise protocol framework, Curve25519, ChaCha20, Poly1305 и т.д.
- Высокая производительность за счет реализации его в виде модуля ядра (можно получить скорость до 1Гбит/с, что в 4 раза больше чем производительность OpenVPN);
- Компактный и читаемый код (основная логика WireGuard занимает порядка 4 тыс. строк кода, тогда как в OpenVPN доходит до нескольких сотен тысяч), проще исследовать на уязвимости..
Из минусов можно привести несколько примеров:
- WireGuard VPN работает только по UDP, то есть если у вас закрыт UDP трафик, подключения работать не будут;
- Разработчики пока еще называют свой продукт экспериментом.
В данной статье, мы рассмотрим настройку WireGuard на сервере с CentOS 7 и 8, но данный VPN-сервер, поддерживается практически на всех Linux дистрибутивах и не только.
Установка WireGuard в Linux
Перед установкой необходимого ПО на сервер, выполните обновление пакетов на сервере с помощью пакетного менеджера:
# yum update -y
Или для CentOS 8:
# dnf update -y
Теперь нужно подключить репозиторий EPEL и wireguard, затем установить необходимые пакеты. Для CentOS 7:
# curl -Lo /etc/yum.repos.d/wireguard.repo https://copr.fedorainfracloud.org/coprs/jdoss/wireguard/repo/epel-7/jdoss-wireguard-epel-7.repo
# yum install epel-release -y && yum install wireguard-tools wireguard-dkms qrencode -y
Для CentOS 8:
# dnf install epel-release && dnf install https://download1.rpmfusion.org/free/el/rpmfusion-free-release-8.noarch.rpm && dnf install akmod-wireguard wireguard
В дальнейшем настройка WireGuadr не отличается на этих дистрибутивах CentOS. Чтобы проверить, что модуль wireguard был установлен и загружен, выполните команду:
# modprobe wireguard && lsmod | grep wireguard
Базовая настройка VPN сервера WireGuard
Создайте директорию для WireGuard:
# mkdir /etc/wireguard && cd /etc/wireguard
Теперь можно приступить к генерации ключей для клиента и сервера:
# wg genkey | tee server-private.key | wg pubkey > server-public.key
# wg genkey | tee client-private.key | wg pubkey > client-public.key
# chmod 600 ./*-private.key
В результате выполнения предыдущих команд, появится 4 файла с ключами: приватный и публичный ключи для сервера, а также аналогичные ключи для клиента (мы будем использовать их при настройке клиента WireGuard).
Далее нужно создать конфигурационный файл для сервера:
# nano /etc/wireguard/wg0-server.conf
И добавить в него следующее содержимое:
[Interface] Address = 10.0.0.1/24 PrivateKey = SERVER_PRIVATE_KEY PostUp = 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 FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE ListenPort = 39548 [Peer] PublicKey = CLIENT_PUBLIC_KEY AllowedIPs = 10.0.0.2/32
- В поле PrivateKey нужно добавить содержимое файла server-private.key
- В поле PublicKey вы добавляете содержимое с файла client-public.key
- Address — IP адрес сервера wireguard
- ListenPort — порт на котором будет работать wireguard
- AllowedIPs — IP адреса, которые назначаются VPN клиенту
PostUp и PostDown правила iptables при подключении wireguard.
В блоке [Peer] указываются данные для VPN клиентов. Если их будет несколько, то нужно добавить блоки для новых клиентов, с новым IP адресом и новым ключом.
Если у вас на сервере используется не iptables, а firewalld, замените строки в конфигурационном файле, которые относятся к настройкам межсетевого экрана:
PostUp = 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 FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE
Вы заменяете на:
PostUp = firewall-cmd --add-port $SERVER_PORT/udp && firewall-cmd --add-rich-rule='rule family=ipv4 source address=$FIREWALLD_IPV4_ADDRESS/24 masquerade' && firewall-cmd --add-rich-rule='rule family=ipv6 source address=$FIREWALLD_IPV6_ADDRESS/24 masquerade' PostDown = firewall-cmd --remove-port $SERVER_PORT/udp && firewall-cmd --remove-rich-rule='rule family=ipv4 source address=$FIREWALLD_IPV4_ADDRESS/24 masquerade' && firewall-cmd --remove-rich-rule='rule family=ipv6 source address=$FIREWALLD_IPV6_ADDRESS/24 masquerade'
Чтобы добавить нового клиента на сервер, вам нужно сгенерировать для него ключи, выполняется это так же, как и для первого клиента:
# wg genkey | tee client2-private.key | wg pubkey > client-public.key
# chmod 600 ./*-private.key
Теперь добаьте блок для нового клиента в конфигурационный файл /etc/wireguard/wg0-server.conf:
[Peer] PublicKey = CLIENT2_PUBLIC_KEY AllowedIPs = 10.0.0.3/32
И так далее.
Включите форвардинг пакетов:
# cat /etc/sysctl.conf
net.ipv4.ip_forward = 1
# sysctl -p
Добавьте сервис WireGuard в автозагрузку и запустите его:
# systemctl enable [email protected]
# systemctl start [email protected]
Проверьте, что появился отдельный сетевой интерфейс:
#ip a show wg0
Теперь вы можете подключиться к вашему VPN серверу с различных клиентов. Рассмотрим, как их настроить.
Подключение к WireGuard с мобильного устройства Android
Для подключения с мобильного устройства Android, лучше всего использовать приложение WireGuard, которое доступно в Play Маркет (Google Play):
Установите приложение, откройте и нажмите кнопку для добавления нового подключения:
Чтобы максимально просто создать новое VPN подключение, нужно на WireGuard сервере и создать файл для генерации qr-кода:
# nano /etc/wireguard/client.conf
И добавим в него следующее содержимое:
[Interface] Address = 10.0.0.2/24 PrivateKey = CLIENT_PRIVATE_KEY DNS = 77.88.8.8 [Peer] PublicKey = SERVER_PUBLIC_KEY AllowedIPs = 0.0.0.0/0 Endpoint = SERVER_IP:39548 PersistentKeepalive = 20
- В поле PrivateKey нужно указать содержимое файла client-private.key
- В поле PublicKey – данные из файла server-public.key
- Значение SERVER_IP замените белым (реальным) IP-адресом вашего сервера
- DNS можете заполнить на ваш выбор.
Выполните команду для генерации QR кода:
# qrencode -t ansiutf8 < /etc/wireguard/client.conf
После выполнения команды, вы должны получить qr-код который нужно отсканировать в приложении на Android:
Осталось указать имя подключения и оно будет автоматически создано на вашем мобильном (со свеми ключами и настройками). После подключения к VPN серверу вы выйти в интернет с адресом WireGuard (как при подключении к любому VPN сервису):
Для устройств с IOS так же есть клиент WireGuard. Настройка выполняется аналогично Android. Все ваши шаги для подключения будут идентичными.
Настройка клиента WireGuard в Windows
Для подключения к WireGuard VPN с компьютера Windows, скачайте дистрибутив с официального сайта https://www.wireguard.com/install/#windows-7-8-81-10-2012-2016-2019
Установите клиент WireGuard и запустите его.
Создайте файл client.conf ( генерируется по способу, описанному выше при генерации qr-кода), нажмите кнопку Import и укажите данный файл:
Нажмите кнопку ‘Activate’ и соединение будет установлено. В настройках подключения будет содержаться публичный ключ, порт подключения, назначенный IP адрес.
Чтобы отключиться от WireGuard, нажмите кнопку Deactivate.
Таким образом, мы настроили VPN-сервер WireGuard, который не уступает OpenVPN или IpSec, а настраивается гораздо быстрее и проще.
А как у него с маршрутизацией? Клиенты по дефолту друг друга видят или это отдельный танец?
Клиенты из одного сегмента на одном wg интерфейсе в такой конфигурации будут видеть друг друга. Дополнительным поведением и маршрутизацией можно управлять через правила PostUp и PostDown.
Можно даже сделать несколько wg интерфейсов в разных подсетях и с помощью PostUp и PostDown настроить маршрутизацию между ними. Что-то типа
[Interface]
.....
PostUp = ip route add 10.0.1.0/24 via 10.0.0.1 ; ping -c1 10.0.0.1
PostDown = ip route delete 10.0.1.0/24 via 10.0.0.1
....
https://winitpro.ru/index.php/2020/04/13/nastrojka-marshrutov-v-linux/
Благодарю!
а как запретить клиентам видеть друг друга? чтобы и пингов не было, и порты друг другу не сканировали?
для изоляции клиентов wireguard можно сделать правила iptables:
ip6tables -I FORWARD -i wg0 -o wg0 -j REJECT --reject-with icmp6-adm-prohibited
iptables -I FORWARD -i wg0 -o wg0 -j REJECT --reject-with icmp-admin-prohibited
Спасибо за материал.
Сперва замечание:
Мне кажется, автор не удачно выразился, написав:
.
Такое определение этого параметра заставляет думать, буд-то VPN-server push-ит VPN-client-у указанный в параметре адрес, в то вр., как этот параметр определяет хосты (или сети в CIDR notation), которым (из которых) разрешено устанавливать соединение с VPN-server.
Теперь вопросы:
1.у автора материала Windows vpn-clien работает нормально?
(у меня постоянно пропадает доступ к Интернету (при том, что vpn-соединение остаётся установленным)).
2.в ОС Windows виртуальный сетевой интерфейс создаётся всякий раз при установлении vpn-соединения и удаляется при разъединении. И всякий раз нужно вручную конфигурировать стек TCP/IP для этого интерфейса.
Скажите, можно как-то push-тить с VPN-server параметры стека (adr., net.mask, def.gw, dns)?
Доп.вопрос:
Не разобрался, как сделать так, чтобы установление vpn-соединения не приводило к тому, что vpn-client становится недоступен из ЛАН (речь о ОС Windows)?
инструкция нерабочая для CentOS 8
после установки модуль не загружается
#modprobe wireguard && lsmod | grep wireguard
modprobe: FATAL: Module wireguard not found in directory /lib/modules/4.18.0-193.19.1.el8_2.x86_64
модуль ядра появился с 5.6 версии
А как избежать того, чтобы каждый раз при нажатии кнопки Activate в Windows 7 создавался новый сетевой профиль, и Windows 7 спрашивала какая это сеть — Work, Home или Public (в официальном клиенте 0.5.2)? Как сделать так чтобы TunSafe в Windows 7 начал работать, а не выдавать ошибку UdpWinSock ?
На случай если это кто-то нагуглит, отвечаю сам себе. С официальным клиентом разобраться у меня не получилось, видимо это считается не баг, а фича. TunSafe заработал. Чтобы он заработал, надо его поставить первым, перед OpenVPN, и вместе с ним поставить драйвер интерфейса TAP. Потом, при установке OpenVPN, драйвер интерфейса TAP ставить не надо, OpenVPN нормально работает с драйвером от TunSafe, а вот TunSafe с драйвером от OpenVPN работать отказывается — выдает ошибку UdpWinSockError .