Wireguard не работает dns

Обновлено: 06.07.2024

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

Перед уста­нов­кой необ­хо­ди­мо­го ПО на сер­вер, выпол­ни­те обнов­ле­ние паке­тов на сер­ве­ре с помо­щью пакет­но­го менеджера:

Или для CentOS 8:

Для CentOS 8:

В даль­ней­шем настрой­ка WireGuadr не отли­ча­ет­ся на этих дис­три­бу­ти­вах CentOS. Что­бы про­ве­рить, что модуль wireguard был уста­нов­лен и загру­жен, выпол­ни­те команду:


Базовая настройка VPN сервера WireGuard

Создай­те дирек­то­рию для WireGuard:

Теперь мож­но при­сту­пить к гене­ра­ции клю­чей для кли­ен­та и сервера:

В резуль­та­те выпол­не­ния преды­ду­щих команд, появит­ся 4 фай­ла с клю­ча­ми: при­ват­ный и пуб­лич­ный клю­чи для сер­ве­ра, а так­же ана­ло­гич­ные клю­чи для кли­ен­та (мы будем исполь­зо­вать их при настрой­ке кли­ен­та WireGuard).

OpenWrt ставится на очень много моделей soho роутеров, конфигурируется и расширяется как душа пожелает. Сейчас многие прошивки роутеров — это надстройки над OpenWrt.

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

Немного о WireGuard

В нашем случае сервер — это VPS вне РКН, клиент — OpenWrt роутер дома. Когда вы захотите зайти на pornolab telegram, ваш роутер направит трафик через сервер с WireGuard.
WireGuard поднимает site-to-site соединение, т.е. и у сервера и у клиента имеется серверная и клиентская часть конфигурации. Если не понятно — станет понятно когда увидите конфигурацию.

У сервера и у клиента есть свои собственные приватный и публичный ключи.

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

Я проделываю всё на Ubuntu 18.04, но в официальной документации есть инструкции по установке для всех известных и не очень ОС.

Установка


Установите software-properties-common — пакет предоставляет возможность добавления и удаления PPA

Генерируем ключи для сервера. Ключи сохраним в директории WireGuard для удобства

Соответственно в файле privatekey-server будет приватный ключ, а в publickey-server — публичный.
Так же сгенерируем сразу ключ для клиента:


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

Конфиг хранится в /etc/wireguard/wg0.conf. Серверная часть выглядит так:

Address — адрес для интерфейса wg (адрес внутри туннеля)
PrivateKey — Приватный ключ (privatekey-server)
ListenPort — Порт на котором служба ожидает подключения

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

PublicKey — публичный ключ нашего роутера (publickey-client)
AllowedIPs — подсети, которые будут доступны через этот туннель. Серверу требуется доступ только до адреса клиента.

Обе части хранятся в одном конфиге.

Включаем автозапуск при перезагрузке:

Делаем сервер маршрутизатором:

Настроим фаервол. Предположим, что у нас на сервере только WireGuard и ssh:

Сохраним конфигурацию iptables:

Поднимаем wg интерфейс первый раз вручную:


WireGuard сервер готов.

UPD 27.06.19 Если ваш провайдер до сих пор использует PPoE, то нужно добавить правило. Спасибо denix123

Настройка роутера

Я использую OpenWrt версии 18.06.1 на Xiaomi mi 3G и Asus RT-N16.

Логика работы роутера

Загружаем списки, помещаем их в iptables, все адреса из этих списков iptables помечает маркером 0x1. Далее все пакеты помеченные 0x1 идут в отдельную таблицу маршрутизации, все пакеты попавшие в эту таблицу маршрутизации идут через wg интерфейс.

Установка пакетов

Насчет занимаемого места на флеше, на всё понадобится примерно 0.9МБ. Если у вас совсем плохо с местом, замените curl wget'ом и можете не ставить dnscrypt-proxy.

Ставим пакеты. В OpenWrt это просто сделать через менеджер пакетов opkg:

Загрузка списков

Всё, что можно сделать через стандартные возможности OpenWrt, сделано через них. Всё остальное (кроме hotplug) я поместил в небольшой скрипт:

Списки запрещенных подсетей и адресов получаем файлами. Для них создаём директорию в /tmp. В /tmp — потому что это RAM, такая особенность OpenWrt, довольно удобная. На ROM роутера что-то писать лишний раз не стоит.

Выкачиваем списки с antifilter.download curl'ом, флаг z означает, что curl будет скачивать файл, только если удаленный файл отличается от локального или если его нет, как например в случае при загрузке роутера.

subnet.lst — список заблокированных подсетей, изменяется не часто.
ipsum.lst — список заблокированных адресов, который суммаризирован по маске. Вместо 150 тысяч записей получаем 15 тысяч — удобно.

После того как файлы у нас — рестартуем firewall, это нужно для того что бы ipset отработал и добавил списки в iptables, ipset у нас будет сконфигурен в /etc/config/firewall.

Скрипт этот мы добавляем в /etc/init.d/ назовём hirkn. Сделаем его исполняемым

Теперь у нас не просто скрипт, а целая служба. Для того, что бы он запускался при загрузке, делаем симлинк в /etc/rc.d. Нам нужно, что бы он запускался после всех остальных служб, поэтому делаем приставку S99

Списки нужно обновлять время от времени, добавляем запись в cron:

Мне кажется вполне достаточным обновлять их раз в сутки. Имейте в виду, что при добавлении списков в ipset, отваливается сеть, в моём случае это 2 секунды.
UPD: Если не хотите разрывов, то sigo73 и Grayver подсказали в комментариях как это осуществить.

Так же включите крон, по дефолту он отключен:

Конфигурация таблицы маршрутизации

Создаем таблицу маршрутизации для трафика через туннель, просто добавив строку:

в файл /etc/iproute2/rt_tables.

Создать дефолтный маршрут для таблицы "vpn" через wg интерфейс можно командой:

Но при рестарте сети маршрут пропадёт, поэтому создаём файл 30-rknroute в директории /etc/hotplug.d/iface/ с простым содержимым:

Это означает, что при включении\выключении интерфейсов будет добавляться наш маршрут. И соответственно, этот маршрут будет всегда прописан.

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

Нам необходимо сконфигурировать WireGuard и правило для пакетов с меткой 0x1.

Конфигурация WireGuard располагается в /etc/config/network

private_key — это privatekey-client, который мы генерировали при настройке сервера
list addresses — адрес wg интерфейса
listen_port — порт на котором WireGuard принимает соединения. Но соединение будет происходить через порт на сервере, поэтому здесь мы не будем открывать для него порт на firewall
proto — указываем протокол, что бы openwrt понимало что это конфигурация WireGuard

public_key — ключ publickey-server
allowed_ips — подсети, в которые может ходить трафик через тунель, в нашем случае никаких ограничей не требуется, поэтому 0.0.0.0/0
route_allowed_ips — флаг, который делает роут через wg интерфейс для перечисленных сетей из параметра allowed_ips. В нашем случае это не нужно, эту работу выполняет iptables
endpoint_host — ip/url нашего wg сервера
persistent_keepalive — интервал времени, через который отправляются пакеты для поддержки соединения
endpoint_port — порт wireguard на сервере

Ещё в конфигурацию network добавим правило, которое будет отправлять весь трафик, помеченный 0x1, в таблицу маршрутизации "vpn":

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

Конфигурация фаервола находится в /etc/config/firewall

Добавляем зону для wireguard. В openwrt зоны — это кастомные цепочки в iptables. Таким образом создаётся зона с одним\несколькими интерфейсами и уже на неё вешаются правила. Зона для wg выглядит например вот так:

Мы разрешаем только выход трафика из интерфейса и включаем маскарадинг.

Теперь нужно разрешить переадресацию с lan зоны на wg зону:

Ну и последнее — это формирование списков в iptables с помощью ipset:

loadfile — файл из которого берем список
name — имя для нашего списка
storage, match — здесь указываем как хранить и какой тип данных. Будем хранить тип "подсеть"

UPD: Если хотите использовать список отдельных IP адресов, то вам необходимо увеличить размер списка ipset. В config ipset добавьте

Иначе вы будете получать ошибку

UPD: Добавим два правила маркировки пакетов

Эти правила подразумевают под собой, что все пакеты идущие в подсети из списков vpn_subnets и vpn_ipsum необходимо помечать маркером 0x1.

После этого рестартуем сеть:


и запускаем скрипт:

После отработки скрипта у вас должно всё заработать. Проверьте маршрут на клиенте роутера:

Бонусом настроим DNSCrypt

Зачем? Ваш провайдер может заботливо подменять ip-адрес заблокированного ресурса, таким образом перенаправляя вас на свой ip с заглушкой, ну и наш обход по ip в данном случае не поможет. Для подмены не всегда даже нужно использовать dns сервер провайдера, ваши запросы могут перехватываться и ответы подменяться. Ну и к слову, это может делать не только провайдер.

Настраиваем конфиг /etc/config/dnscrypt-proxy примерно так:

Таким образом у нас есть сервис dnscrypt на порту 5353 доступный на localhost.

Настраиваем dnsmasq на работу с dnscrypt. В /etc/config/dhcp комментируем строчку:

для того что бы не были задействованы dns серверы провайдера.

Запись list server 'domain/ip_dns' указывает какой dns сервер использовать для резолва указанного домена. Таким образом мы не задействуем dnscrypt для синхронизации ntp — для работы службе dnscrypt важно иметь актуальное время.

При загрузке роутера, скрипт hirkn запускается быстрее чем стартует dnscrypt, таким образом домен antifilter.download не резолвится и списки не скачиваются. Можно сделать задержку или ещё что придумать, но пока что не вижу смысла.
UPD: необходимо добавить строку

В итоге мы получаем такую вставку в конфиг:

Отключаем использование провайдерских DNS для интерфейса wan
В /etc/config/network добавляем строку

к интерфейсу wan.
Получаем такую конфигурацию

Добавляем в автозагрузку и стартуем dnscrypt:


Илюстрация работы без DNSCrypt и c DNSCrypt

Автоматически развертываем с помощью Ansible

Playbook и темплейты лежат на github. Используется модуль, в нём не нужен python на роутере и есть поддержка uci. Я постарался сделать так, что бы ваша конфигурация OpenWrt осталась не тронутой, но всё равно будьте бдительны.

Устанавливаем модуль gekmihesg/ansible-openwrt:

Копируем плейбук и темлпейты:

Добавляйте ваш роутер в hosts:

Подставляете свои переменные в hirkn.yml:

Обязательно нужно задать:

wg_server_address — ip/url wireguard сервера
wg_private_key, wg_public_key — приватный ключ клиента и публичный сервера
Остальное можно не менять или менять, в зависимости от того как настроен WireGuard сервер

После выполнения плейбука, роутер сразу начнёт выполнять обход блокировок через ваш wireguard сервер.

Почему не BGP?

Под openwrt есть две утилиты реализующих BGP — quagga и bird. Quagg'у мне не удалось заставить забирать данные с antifilter. Bird подружился с сервисом с полпинка, но как заставить добавлять полученным подсетям интерфейс по умолчанию я, к сожалению, не понял. (Буду рад узнать как это можно реализовать).

В комментариях к подобным статьям я видел, что роутеры у людей "призадумывались" на некоторое время, когда те загоняют списки в таблицу маршрутизации. С реализацией через ipset мой Xiaomi mi 3G задумывается на 2 секунды (Asus rt-n16 на 5 секунд), когда скармливаешь ему список из 15ти тысяч подсетей. При дальнейшей работе нагрузки на процессор не замечал.

Все материалы не являются призывом к действию и представлены для ознакомления с функционалом ОС Linux.

Хочу обезопасить свой Интернет-трафик. Какую реализацию VPN выбрать?¶

WireGuard¶

WireGuard – самый современный и актуальный протокол для VPN. Обеспечивает максимальную скорость работы за счёт реализации в виде модуля ядра Linux и надёжную криптографическую защиту от прослушивания.

OpenVPN¶

OpenVPN – cамая популярная и стабильная в настоящее время реализация VPN. Способен работать как через UDP, так и TCP, имеет плагины маскировки под TLS, обеспечивает высокую защищённость, но имеет низкую производительность из-за постоянных переключений между режимами пользователя и ядра.

L2TP/IPSec¶

Поддерживается большинством роутеров «из коробки», но является устаревшим. Изначально создавался для Windows, поэтому многие серверы заточены под соответствующие реализации клиентов.

Устаревший, уязвимый by design протокол. Трафик, проходящий через сеть, использующую данный протокол, может быть легко расшифрован за несколько часов. Категорически не рекомендуется к применению даже на устаревшем оборудовании.

Если продключение к VPN по протоколу PPTP не проходит из-за ошибки, включим поддержку GRE в настройках межсетевого экрана .

Для этого выполним следующее:

Изменения вступят в силу немедленно.

Важно: Некоторые интернет-провайдеры и большая часть операторов сотовой связи ограничивают передачу данных по протоколу GRE. В случае, если вы уверены, что поставщик услуг связи здесь не при чем, обратите внимание на маршрутизатор: некоторые модели бюджетных устройств также могут ограничивать трафик.

Как пробросить локальный порт на удалённый хост?¶

Как поднять OpenVPN сервер в Fedora?¶

См. здесь. В данной статье вместо ovn следует использовать openvpn во всех путях и именах юнитов.

Как поднять WireGuard сервер в Fedora?¶

Как поднять свой сервер Matrix в Fedora?¶

Как запустить простейший веб-сервер в Fedora?¶

Для запуска простейшего веб-сервера можно использовать Python и модуль, входящий в состав базового пакета:

Веб-сервер будет запущен на порту 8080. В качестве webroot будет использоваться текущий рабочий каталог.

Как лучше настраивать сетевые подключения?¶

В Fedora для настройки сети используется Network Manager. Для работы с ним доступны как графические менеджеры (встроены в каждую DE), так и консольный nm-cli.

Как поднять DLNA сервер в локальной сети?¶

Как сделать замеры скорости локальной или беспроводной сети?¶

Для точных замеров производительности сети нам потребуется как минимум два компьютера (либо компьютер и мобильное устройство), а также утилита iperf3, присутствующая в репозиториях Fedora. Установим её:

На первом устройстве запустим сервер:

По умолчанию iperf прослушивает порт 5001/tcp на всех доступных сетевых соединениях.

Теперь временно разрешим входящие соединения на данный порт посредством Firewalld (правило будет действовать до перезагрузки):

На втором устройстве запустим клиент и подключимся к серверу:

В качестве клиента может выступать и мобильное устройство на базе ОС Android с установленным Network Tools. В этом случае в главном меню программы следует выбрать пункт Iperf3, а в окне подключения ввести:

Параметр -c обязателен. Если он не указан, программа выдаст ошибку.

192.168.1.2 – это внутренний IP-адрес устройства в ЛВС, на котором запущен сервер. Номер порта указывать не требуется.

Как передать содержимое каталога на удалённый сервер?¶

Передача содержимого локального каталога на удалённый сервер посредством rsync:

Как получить содержимое каталога с удалённого сервера?¶

Получение содержимого каталога с удалённого сервера посредством rsync:

Как правильно указать DNS серверы в Fedora?¶

Для того, чтобы указать другие DNS серверы, необходимо использовать Network Manager (графический или консольный): свойства соединения -> страница IPv4 -> другие DNS серверы.

Нет, т.к. этот файл целиком управляется Network Manager и перезаписывается при каждом изменении статуса подключения (активация-деактивация соединений, перезапуск сервиса и т.д.).

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

Как можно средствами Firewalld запретить ICMP?¶

По умолчанию ICMP трафик разрешён для большей части зон, поэтому запретить его можно вручную:

Применим новые правила:

В данном примере для зоны public блокируются как входящие, так и исходящие ICMP ECHO и ICMP TIMESTAMP.

Как средствами Firewalld разрешить подключение к OpenVPN серверу только с разрешённых IP адресов?¶

Сначала отключим правило по умолчанию для OpenVPN , разрешающее доступ к серверу с любых IP адресов:

Теперь создадим rich rule, разрешающее доступ с указанных IP-адресов (или подсетей):

Применим новые правила:

Здесь public – имя зоны для публичного интерфейса, 1.2.3.4 – IP-адрес, а 5.6.7.0/24 – подсеть, доступ для адресов из которой следует разрешить.

Как средствами Firewalld разрешить подключение к WireGuard серверу только с разрешённых IP адресов?¶

Сначала отключим правило по умолчанию для WireGuard , разрешающее доступ к серверу с любых IP адресов:

Теперь создадим rich rule, разрешающее доступ с указанных IP-адресов (или подсетей):

Применим новые правила:

Здесь 27015 – порт сервера WireGuard, public – имя зоны для публичного интерфейса, 1.2.3.4 – IP-адрес, а 5.6.7.0/24 – подсеть, доступ для адресов из которой следует разрешить.

Как узнать внешний IP адрес за NAT провайдера?¶

Для этой цели можно использовать внешний сервис, возвращающий только внешний IP и утилиту curl:

Как средствами Firewalld разрешить подключение к веб-серверу только с IP адресов CloudFlare?¶

При использовании CloudFlare в качестве системы защиты от DDoS атак, а также WAF, возникает необходимость разрешать входящие подключения исключительно с IP адресов данного сервиса.

Сначала отключим правило по умолчанию для веб-сервера, разрешающее доступ с любых IP адресов:

Напишем небольшой скрипт foo-bar.sh , который получит актуальные пулы IP-адресов и создаст rich rule, разрешающие доступ лишь с подсетей CloudFlare (IPv4, IPv6):

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

Применим новые правила файрвола:

Здесь public – имя зоны для публичного сетевого интерфейса.

Как пробросить IP адреса клиентов за CloudFlare?¶

Как проверить наличие или отсутствие потерь пакетов до узла?¶

Для проверки работоспособности сети и наличия, либо отсутствия потерь пакетов между узлами маршрута, широко используется утилита mtr:

Приостановить работу можно нажатием клавиши P, для возобновить – пробел, а для выхода – Q.

Как получить список установленных сетевых соединений?¶

Воспользуемся утилитой ss для вывода списка установленных сетевых соединений:

Как получить список открытых портов?¶

Воспользуемся утилитой ss для вывода открытых портов, ожидающих входящих соединений:

Статус LISTEN означает, что TCP-порт открыт и ожидает входящих соединений. В то же время для UDP-портов будет отображаться статус UNCONN, т.к. этот протокол не подразумевает предварительное открытие подключений.

Почему при подключении к сети имя хоста машины изменяется?¶

DHCP сервер провайдера способен выдавать помимо IP-адресов и DNS-серверов ещё и нестандартное имя хоста. Полученное таким способом значение называется transient hostname. Оно будет применимо с компьютеру с момента установки соединения и до отключения от соответствующей сети.

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

Как запретить использование полученного от провайдера имени хоста?¶

Для того, чтобы запретить использование полученного от DHCP сервера transient hostname , установим статическое имя хоста .

Как переключить Network Manager на использование systemd-resolved?¶

Начиная с Fedora 30, в комплект базовой системы входит systemd-resolved, который занимается преобразованием имён DNS в IP-адреса, имеет встроенный DNS-кэш и активирован по умолчанию.

В то же время, Network Manager с настройками по умолчанию использует собственный виртуальный файл конфигурации resolv.conf , игнорирующий присутствие systemd-resolved.

Для исправления этой ситуации, убедимся, что systemd-neworkd запущен и функционирует:

Создадим в каталоге /etc/NetworkManager/conf.d файл 99-resolved.conf следующего содержания:

Убедимся, что файл /etc/resolv.conf является символической ссылкой на /run/NetworkManager/resolv.conf :

Если по какой-то причине это не так, то внесём соответствующие правки:

Перезапустим затронутые сервисы:

Проверим, что в качестве основного сервера DNS применяется виртуальная заглушка:

Если в выводе присутствует строка nameserver 127.0.0.53 , значит всё настроено верно.

Как проверить статус работы systemd-resolved?¶

Выведем статус systemd-resolved, включающий список используемых DNS серверов и общие параметры конфигурации:

Выведем статистические данные об использовании systemd-resolved (состояние кэша, количество запросов и т.д.):

Как сделать systemd-resolved основным резолвером?¶

Важно: Начиная с Fedora 33, systemd-resolved уже используется в качестве основного системного DNS-резолвера.

Удалим существующую символическую ссылку, указывающую на Network Manager:

Установим systemd-resolved основным резолвером:

Изменения вступят в силу немедленно.

Как отключить systemd-resolved и вернуться к прежней реализации?¶

Удалим существующую символическую ссылку, указывающую на systemd-resolved :

Установим Network Manager основным генератором файла /etc/resolv.conf :

Остановим и заблокируем сервис:

Изменения вступят в силу немедленно.

Можно ли зашифровать DNS при помощи TLS?¶

Да, systemd-resolved, входящий в поставку системы начиная с Fedora 30, полностью поддерживает технологию DNS-over-TLS, позволяющую зашифровать весь DNS трафик устройства.

Настроим систему на использование systemd-resolved либо совместно с Network Manager , либо в монопольном режиме , затем откроем файл конфигурации /etc/systemd/resolved.conf :

Внесём следующие правки:

Здесь используются серверы CloudFlare с поддержкой DNS-over-TLS.

Сохраним изменения в файле и перезапустим systemd-resolved:

Теперь в информации об используемых DNS должна отображаться информация об использовании этой технологии.

Как очистить кэши systemd-resolved?¶

Очистим кэш systemd-resolved:

Где расположены файлы конфигурации доступных сервисов Firewalld?¶

Предустановленные файлы конфигурации служб Firewalld находятся в каталоге /usr/lib/firewalld/services .

Настоятельно не рекомендуется что-либо изменять в нём ибо при следующем обновлении пакета все изменения будут потеряны. Вместо этого следует создать пользовательское переопределение .

Как переопределить предустановленный сервис в Firewalld?¶

Пользовательские переопределения должны храниться в каталоге /etc/firewalld/services .

В качестве примера создадим оверрайд для сервиса SSH на базе настроек по умолчанию:

Откроем скопированный файл в текстовом редакторе:

Внесём правки, добавив возможность использования порта 2222/tcp:

Перезагрузим настройки Firewalld для вступления изменений в силу:

Как правильно импортировать подключение из OVPN файла?¶

Воспользуемся консольной утилитой nmcli для быстрого импортирования подключения из OVPN файла:

Здесь /path/to/foo-bar.ovpn – путь к OVPN файлу на диске.

Встроенные сертификаты и ключи будут автоматически импортированы и сохранены в каталоге

/.cert/nm-openvpn , что не вызовет проблем с SELinux .

Как проверить открыт ли порт на удалённом сервере?¶

Воспользуемся утилитой nc для непосредственного осуществления проверки без полного сканирования портов.

Проверим доступность сервиса на IP 1.2.3.4 с номером порта 443/tcp:

Проверим доступность сервиса на IP 1.2.3.4 с номером порта 27015/udp:

Как открыть доступ к локальной сети через WireGuard?¶

Для того, чтобы через VPN была также доступна локальная сеть, внесём ряд изменений в файлы конфигурации сервера и клиента WireGuard .

Отредактируем файл /etc/wireguard/wg0.conf сервера:

В директиве AllowedIPs через запятую добавим адрес локальной подсети клиента, например 192.168.1.0/24:

Перезапустим сервис WireGuard на сервере:

На клиенте, к локальной сети которого требуется получить доступ, разрешим перенаправление трафика и включим маскарадинг в Firewalld :

Отредактируем файл конфигурации данного клиента, дописав в AllowedIPs подсеть через запятую (однако если там уже указано 0.0.0.0/0, то ничего более делать не требуется).

Проверим доступность компьютеров из локальной сети со стороны других клиентов WireGuard:

Здесь вместо 192.168.1.2 укажем реально существующий адрес в локальной сети.

Если всё работает корректно, сделаем изменения на клиенте с LAN постоянными:

Перезагрузим настройки Firewalld:

Из-за использования systemd-resolved в chroot-окружениях Fedora не работает преобразование имён DNS, т.е. фактически отсутствует доступ к Интернету.

WireGuard — инструмент для построения виртуальных сетей. Многие называют его этаким «VPN нового поколения». Он включен в состав ядра, начиная с версии 5.6.

Заметка обновлена 27.02.2020.

В рамках этой заметки, мы запустим в работу простой WireGuard VPN сервер и настроим подключение из Linux клиента к нему. Работать мы будем в CentOS 8, но инструкция вполне подойдёт и для других дистрибутивов, разве что пакетные менеджеры и репозитории будут отличаться.

wireguard

Сервер wireguard.

Подготовка и установка.

1. Для начала, подключаем репозитории EPEL и RPMFusion Free. Cтавим доступные обновления и запускаем систему с новым ядром.

2. Далее, ставим на сервер всё необходимое и собираем модуль для Wireguard. После, убеждаемся, что модуль запущен в работу:

Вывод последней команды будет примерно таким:

Настройка сервера.

3. Генерируем ключи для клиента и сервера:

4. Создаём конфигурационный файл для сервера /etc/wireguard/wg0.conf со следующим содержимым:

Разумеется, вместо SERVER_PRIVATE_KEY и CLIENT_PUBLIC_KEY мы прописываем ключи, из созданных ранее файлов. Далее, комментарии по конфигу:

Address — адрес виртуального интерфейса wg0 на сервере.
ListenPort — порт, на котором будет работать VPN.
AllowedIPs — виртуальные IP клиентов, которые будут подключаться к нашему серверу.

При необходимости, мы можем так же указать параметры PostUp и PostDown — команды, которые будут выполнены при включении и отключении интерфейса.

5. Включаем форвардинг пакетов:

6. Настраиваем фаервол:

7. Запускаем сервис в работу:

Клиент wireguard.

Пишем конфиг.

8. На основе сделанной настройки, пишем простой конфиг для клиента. Этот конфиг подойдёт и для десктопа, и для, например, android приложения:

В данном случае, вместо CLIENT_PRIVATE_KEY и SERVER_PUBLIC_KEY мы опять же, подставляем ключи, сгенерированные ранее, а вместо SERVER_REAL_IP прописываем IP адрес нашего сервера, на котором установлен VPN.

Wireguard и десктоп клиент.

Проверяем подключение, и если всё сделано верно, то весь наш трафик теперь будет проходить через VPN сервер.

Для отключения от VPN просто выполняем команду wg-quick down wg0-client:

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

Wireguard на android.

Для использоания wireguard на android, достаточно скачать клиента из Play Market или из F-Droid репозитория, а для подключения просто выполнить импорт подготовленного wg конфига для клиента.

И, собственно, всё. Вот так, очень просто (куда проще чем тот же OpenVPN) мы можем настроить защищённый VPN туннель и использовать его в повседневной работе.

Дополнительно.

Быстрая установка.
Использование iptables.

Для случаев, когда в системе не оказывается firewalld (либо его не хочется ставить по какой-то причине), можно настроить обработку подключений с помощью iptables, для этого, конфиг на сервере нужно модифицировать так:

Несколько клиентов.

Для работы с несколькими клиентами, каждому из них нужно сгенерировать свои открытый и закрытый ключи. Затем, в конфиге сервера указать каждого из них. Пример такого конфига:

Просто, для истории.

21 thoughts on “ WireGuard ”

Так и не дошли руки?

Сам нашел косяк, у клиента в конфиге обязательно должна быть маска /32

Более производительный. На роутере где tinc загибался под 10 мегабитами, wireguard 80-90 давал.

Проблема в том, что он только UDP.

А почему это проблема?

Потому что в офисной сетке нашей например UDP вообще зарезан. А вот OpenVPN по TCP на 443-й порт прекрасно работает.

Возможно ли с помощью WireGuard создать VPN между
точкой с реальным IP адресом и точкой без реального IP адреса ( роутер+OpenWRT+3G/4G internet)? При этом требуется доступ к компьютерам, находящимся за роутером с OpenWRT.

как отключить логи?

Возможно неправильно указываю -> Endpoint = SERVER_REAL_IP:51820

Пробывал разные внешние сервисы, но не получилось.
Что не так? Где смотреть?

Вы пробовали делать настройки, чтобы default gateway поднимался только после установления соединения?

Чтобы этого не произошло, достаточно настроить Kill Switch.
В конфиг клиента добавляем пару строк. Покажу на примере iptables в линукс:

[Peer]
PublicKey = SERVER_PUBLIC_KEY
Endpoint = SERVER_REAL_IP:51820
AllowedIPs = 0.0.0.0/0
PersistentKeepalive = 21

А как написать конфиг если у меня на серваке серый адре, на роутере белый с пробросом протов на серый и клиентом является плашет с симкой?

Здравствуйте, есть VPS установил WG (192.168.2.1) так же есть debian 10 клиент 192.128.2.2 он же шлюз в локальной сети для обхода блокировок, соединение через WG с сервером установлено, как сделать так что бы был доступ в локальную сеть 192.168.1.0/24 с сервера? Не могу разобраться с маршрутом

Здравствуйте, есть VPS установил WG (192.168.2.1) так же есть debian 10 клиент 192.128.2.2 он же шлюз (192.168.1.2) в локальной сети для обхода блокировок, соединение через WG с сервером установлено, как сделать так что бы был доступ в локальную сеть 192.168.1.0/24 с сервера? Не могу разобраться с маршрутом

Столкнулся с не критичной проблемой:
Несмотря на то, что мой хостинг провайдер находится в Англии, а по тестам DNS leaks мне выделили сервер во Франции, поисковики считают что я в Украине..
Вот и думаю, где пошаманить, чтобы играться с определением геолокации

Ребят, подскажите, пожалуйста, как сконфигурировать route, чтобы клиент не маршрутизировал трафик до одного конкретного айпишника? То есть чтобы трафик до этого шел напрямую на клиенте.

в конфиге опенвпн на клиенте я просто добавлял
route 255.255.255.255 net_gateway

У меня ANR уведомление перестало выплывать! Отметьте у себя в качестве достоинства приложения!

Напоминаем, что все действия, описанные в статье, пользователь делает на свой страх и риск. Материал приведен исключительно в ознакомительных целях. Если же вы собираетесь воспроизводить действия, описанные ниже, настоятельно советуем внимательно прочитать статью до конца хотя бы один раз. Редакция 3DNews не несет никакой ответственности за любые возможные последствия.

WireGuard — это современный протокол для организации VPN, написанный с нуля, бесплатный и с открытыми исходниками. В отличие от «мастодонтов» вроде OpenVPN или IPSec, он намного проще и легче. Это касается и скорости (пере)подключения, и производительности, и требований к ресурсам, и процесса настройки, и объёма кода. Недавно было объявлено, что WireGuard войдёт в состав будущих ядер Linux, а впоследствии попадёт и во все популярные дистрибутивы, что косвенно указывает на зрелость этого решения.

Как и было заявлено в анонсе, мы рассматриваем сценарий защиты подключения к публичным и другим недоверенным сетям. Естественно, этим использование WireGuard не ограничивается. В качестве примера рассмотрим настройку клиентов и сервера (правда, в данном случае это условные понятия — в силу специфики протокола), работающего в облаке и на домашнем роутере Keenetic. Как показывает практика, многие публичные VPN-сервисы не отличаются щепетильностью в отношении данных клиентов, поэтому всегда лучше иметь что-то своё, подконтрольное только пользователю. В нашем случае мы рассматриваем установку и настройку WireGuard, используя для этого компьютер на Windows и облачную виртуальную машину на Ubuntu.

Нам понадобится полный набор PuTTY, так что лучше скачать сразу MSI-пакет с инсталлятором (доступен по предыдущей ссылке), который всё установит и создаст новую группу в главном меню. Там нам нужна утилита PuTTYgen. После запуска генерируем новую пару ключей с настройками по умолчанию (RSA-2048), нажав кнопку Generate и поводив с полминуты мышкой в окне утилиты. Осталось заполнить несколько полей: в Key comment можно ввести название ключа в качестве напоминания, а в Key passphrase и Confirm passphrase ввести один и тот же пароль.


Пароль этот ещё пригодится, так что его надо запомнить или сохранить в надёжном месте. Далее в PuTTYgen сохраняем по отдельности приватный (Save private key, файл .ppk) и публичный (Save public key) ключи. Если планируется использовать несколько облачных провайдеров, то для каждого из них, а лучше и для каждого сервера, использовать собственные ключи.

Vscale — российский облачный провайдер, имеющий собственные площадки в Москве и Санкт-Петербурге и предлагающий неплохие конфигурации по низким ценам. Самый дешёвый сервер, мощностей которого вполне достаточно для наших задач, обойдётся в 200 руб./месяц. Хранение снапшота стоит ещё 40 руб./месяц. И его тоже можно перенести из одного региона в другой. Зато никаких ограничений по трафику нет.

Специально для читателей 3DNews Vscale подготовила промокод 3DNEWS500, чтобы можно было ознакомиться со всеми возможностями сервиса. После регистрации надо пополнить баланс хотя бы на 100 рублей или привязать банковскую карту. Затем промокод надо активировать на этой странице. Код будет действовать до 23:59:59 18.02.2020.


Интерфейс сервиса доступен на русском языке. Разобраться в нём просто, так что коротко опишем основные этапы. Для работы первым делом нужно в настройках аккаунта добавить публичный SSH-ключ, полученный в PuTTYgen. Затем в разделе серверов создать новый сервер с ОС Ubuntu 18.04, указав нужный регион, тариф и ключ. В течение минуты сервер будет готов и запущен.



Отдельного SSH-клиента для доступа к командной строке не требуется, так как Vscale предоставляет веб-консоль. Для входа вводим логин root и нажимаем Enter, далее по одной вводим нижеприведённые команды и на всё соглашаемся, нажимая Enter:



Пара замечаний на случай использования других облачных провайдеров. Во-первых, для Ubuntu 19.10 и более свежих версий ОС добавлять ppa не надо, достаточно будет первых двух команд. Во-вторых, доступ к командной строке возможен с помощью PuTTY. В поле Host Name надо ввести IP-адрес сервера, а в разделе Connection → SSH → Auth — путь до приватного ppk-ключа. Логин root, а пароль тот, что был указан при создании ключа (Key passphrase). Для удобства можно сохранить сессию (Save). По нажатии кнопки Open откроется окно консоли, при первом запуске предваряемое уведомлением о безопасности, с которым надо согласиться.


Обратите внимание, что даже за выключенным сервером сохраняются ресурсы, которые точно так же оплачиваются. Поэтому ненужный сервер надо удалять. Если VPN необходим не на постоянной основе, а лишь иногда, то можно сохранить все настройки, создав снапшот (бэкап). Сам снапшот можно перенести в другой регион и при создании нового сервера выбрать именно его в качестве основы. Создавать снапшот надо строго после завершения настройки VPN-сервера и весьма желательной в этом случае установки DDNS-клиента, выключив сервер непосредственно перед созданием бэкапа.



Для настройки сервера WireGuard не будем мудрствовать лукаво, а воспользуемся открытым решением easy-wg-quick. Данный скрипт автоматически формирует файлы конфигурации и позволяет легко манипулировать настройками. Предварительно надо установить сам wireguard и некоторые дополнительные утилиты. В веб-консоли Vscale или в PuTTY вводим следующие команды, нажимая Enter после каждой:


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



Чтобы добавить настройки ещё для одного клиента (ноутбука, например), надо ещё раз выполнить эту же команду, указав имя нового профиля:

Например, для имени профиля win10 будет создан соответствующий файл wgclient_win10.conf. Его содержимое можно просмотреть командой cat, что пригодится при настройке клиента WireGuard в будущем.


После добавления всех нужных профилей осталось лишь добавить сервер WireGuard в автозапуск и включить его:

Для просмотра текущих подключений используйте эту команду:

Клиенты для Windows, Android, iOS и других ОС можно скачать на сайте WireGuard. С мобильными версиями всё просто — достаточно отсканировать QR-код. Или же, как и для всех остальных клиентов, вручную скопировать настройки из файлов wgclient_*.conf. Из дополнительных опций там есть только возможность исключить доступ через VPN для выбранных пользователем приложений: Excluded Applications в настройках профиля.


В случае Windows-клиента в меню левой нижней кнопки надо выбрать Add empty tunnel, вставить в новом окне всё содержимое conf-файла, указать имя профиля (Name). Опционально можно включить функцию kill-switch для блокировки любого трафика вне VPN-подключения. Наконец, надо сохранить (Save) и активировать (Activate) соединение. Для проверки корректности подключения проще всего зайти на какой-нибудь сайт, определяющий текущий внешний IP-адрес.


В актуальных моделях роутеров Keenetic с прошивкой версии 3.3 или старше также появилась поддержка VPN-подключений WireGuard — нужно установить одноимённый компонент. Чтобы импортировать настройки соединения, нужно сохранить содержимое файла wgclient_*.conf (см. выше) в текстовый документ, а затем в разделе «Другие подключения» загрузить параметры из этого файла. Роутер создаст на их основе новое подключение, которое нужно активировать переключателем в левой части списка.


Для корректной работы надо сделать несколько небольших изменений (кстати, после каждого действия не забывайте нажимать кнопку «Сохранить» в нижней части веб-интерфейса). Во-первых, включить галочку «Использовать для входа в Интернет». Во-вторых, поле «Разрешенные подсети» привести к виду 0.0.0.0/0. В-третьих, в разделе «Приоритеты подключений» перетащить свежесозданное подключение выше всех остальных.


После этого все клиенты, подключённые к роутеру, по умолчанию будут выходить в Интернет через VPN-туннель. Если же необходим доступ только для некоторых устройств, то лучше завести отдельный профиль.


Обратите внимание, что для каждого клиента нужно будет сгенерировать и скопировать собственный conf-файл. Если на предыдущем этапе вы настроили DDNS-клиент на сервере, то в разделе Endpoint у всех клиентов надо будет прописать DDNS-имя вместо IP-адреса.

В самом начале мы уже упоминали, что принципиального различия между сервером и клиентом в случае WireGuard нет. И раз уже поддержка этого протокола доступна в прошивке, то можно настроить подключение клиентов к роутеру. В текущей версии не все настройки вынесены в веб-интерфейс, но ничего сложного всё равно нет. Единственное требование — наличие «белого» внешнего IP-адреса, пусть даже динамического (в этом случае поможет DDNS).

В разделе «Другие подключения» в секции WireGuard нужно добавить новое подключение. Указываем имя (любое) и ставим галочку «Генерация ключей» (Generate a random key pair). В поле «Адрес» надо ввести любой подходящий адрес из частного диапазона, но такой, чтобы он не пересекался с другими сетями на самом роутере. В качестве примера используем 10.11.12.1/24. Номер порта можно указать произвольный, лишь бы он не блокировался провайдером и не совпадал с уже открытыми портами для других сервисов. В нашем примере это 55555. Наконец, в поле DNS надо указать адрес любого публичного DNS-сервера.


Следующий этап — добавление пиров (клиентов) соответствующей кнопкой. Имя указываем любое, а в поле «Разрешённые подсети» вводим 0.0.0.0/0. Теперь открываем на смартфоне мобильное приложение WireGuard и добавляем новое подключение — Create from scratch. В разделе Interface указываем имя (любое) и жмём кнопку Generate. Содержимое поля Public Key копируем и вставляем в настройках пира на роутере в поле «Публичный ключ». В поле Addresses указываем частный IP-адрес из той же подсети, что и для роутера. В нашем примере у него был 10.11.12.1/24, так что для клиента возьмём просто следующий: 10.11.12.2/24. DNS опять же любой публичный.

В разделе Peers в поле Public keys копируем содержимое поля «Публичный ключ» роутера, в Allowed IPs вводим 0.0.0.0/0, а в Endpoint вводим внешний IP-адрес роутера (или DDNS-имя) и порт через двоеточие, то есть для нашего примера должна получиться конструкция вида xx.xx.xx.xx:55555. Опционально можно включить функцию поддержки активности подключения, указав время в секундах в поле Persistent keepalive на клиенте и в поле «Проверка активности» в параметрах пира на роутере. Обычно достаточно интервала от 3 до 30 секунд. Для остальных клиентов придётся повторить эту же процедуру добавления новых пиров.



Наконец, после всех этих действий надо активировать WireGuard-соединение. Если всё прошло успешно, то после подключения клиента напротив пира будет гореть зелёный кружочек и показываться статистика по трафику. Только учтите, что производительность роутера всё-таки намного меньше, чем у любого облачного сервера. Так что приличную скорость соединения он обеспечит ценой нагрузки на CPU маршрутизатора, что может повлиять на работу других сервисов.


Напоследок напомним «народную» мудрость: на VPN надейся, а сам не плошай. Проще говоря, надо всегда соблюдать осторожность и цифровую гигиену. К совсем уж подозрительным сетям и вовсе подключаться не надо, да и про базовые правила забывать не стоит. Их не так уж много: вовремя ставить обновления ОС и ПО, использовать двухфакторную аутентификацию, тщательно выбирать используемые программы, проверять разумность запросов ПО на доступ к различным ресурсам устройства, обзавестись современным антивирусом. Всё это касается и смартфонов, и планшетов, и ноутбуков, и десктопов.

Читайте также: