Поиск по сайту:

Как настроить WireGuard в Debian 11


Введение

Хвост работает.

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

Для сравнения, другое программное обеспечение VPN, такое как IPSec, использует Transport Layer Security (TLS) и сертификаты для аутентификации и установления зашифрованных туннелей между системами. Различные версии TLS включают поддержку сотен различных криптографических наборов и алгоритмов, и хотя это обеспечивает большую гибкость для поддержки различных клиентов, это также делает настройку VPN, использующей TLS, более трудоемкой, сложной и подверженной ошибкам.

В этом руководстве вы настроите WireGuard на сервере Debian 11, а затем настроите другой компьютер для подключения к нему в качестве однорангового узла, используя соединения IPv4 и IPv6 (обычно называемое соединением двойного стека). Вы также узнаете, как направлять интернет-трафик партнера через сервер WireGuard в конфигурации шлюза, в дополнение к использованию VPN для зашифрованного однорангового туннеля.

Для целей этого руководства мы настроим другую систему Debian 11 в качестве партнера (также называемого клиентом) для сервера WireGuard. В последующих руководствах этой серии объясняется, как установить и запустить WireGuard в системах и устройствах Windows, macOS, Android и iOS.

Примечание. Если вы планируете настроить WireGuard на дроплете DigitalOcean, имейте в виду, что мы, как и многие хостинг-провайдеры, взимаем плату за превышение пропускной способности. По этой причине помните, сколько трафика обрабатывает ваш сервер. См. эту страницу для получения дополнительной информации.

Предпосылки

Чтобы следовать этому руководству, вам понадобятся:

  • Один сервер Debian 11 с пользователем без полномочий root и включенным брандмауэром. Чтобы настроить это, вы можете следовать нашему руководству Initial Server Setup with Debian 11. В этом руководстве мы будем называть его сервером WireGuard.
  • Вам потребуется клиентский компьютер, который вы будете использовать для подключения к серверу WireGuard. В этом руководстве мы будем называть эту машину пиром WireGuard. Для целей этого руководства рекомендуется использовать локальный компьютер в качестве узла WireGuard, но вы можете использовать удаленные серверы или мобильные телефоны в качестве клиентов, если хотите. Если вы используете удаленную систему, обязательно следуйте всем необязательным разделам этого руководства, иначе вы можете заблокировать себя от системы.
  • Чтобы использовать WireGuard с IPv6, вам также необходимо убедиться, что ваш сервер настроен для поддержки этого типа трафика. Если вы хотите включить поддержку IPv6 с помощью WireGuard и используете дроплет DigitalOcean, обратитесь к этой странице документации Как включить IPv6 для дроплетов. Вы можете добавить поддержку IPv6 при создании дроплета или позже, следуя инструкциям на этой странице.

Шаг 1 — Установка WireGuard и создание пары ключей

Первым шагом в этом руководстве является установка WireGuard на ваш сервер. Для начала обновите индекс пакетов вашего сервера WireGuard и установите WireGuard, используя следующие команды. Вам может быть предложено ввести пароль пользователя sudo, если вы впервые используете sudo в этом сеансе:

  1. sudo apt update
  2. sudo apt install wireguard

Теперь, когда у вас установлен WireGuard, следующим шагом будет создание пары закрытого и открытого ключей для сервера. Вы будете использовать встроенные команды wg genkey и wg pubkey для создания ключей, а затем добавите закрытый ключ в файл конфигурации WireGuard.

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

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

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

Команда sudo chmod go=... удаляет все разрешения для файла для пользователей и групп, кроме пользователя root, чтобы гарантировать, что только пользователь root может получить доступ к закрытому ключу.

Вы должны получить одну строку вывода в кодировке base64, которая является закрытым ключом. Копия выходных данных также сохраняется в файле /etc/wireguard/private.key для дальнейшего использования в части tee команды. Внимательно запишите полученный закрытый ключ, так как вам нужно будет добавить его в файл конфигурации WireGuard позже в этом разделе.

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

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

Эта команда состоит из трех отдельных команд, объединенных в цепочку с помощью оператора | (канал):

  • sudo cat /etc/wireguard/private.key: эта команда считывает файл закрытого ключа и выводит его в стандартный поток вывода.
  • wg pubkey: вторая команда принимает выходные данные первой команды в качестве стандартного ввода и обрабатывает их для создания открытого ключа.
  • sudo tee /etc/wireguard/public.key: последняя команда берет вывод команды генерации открытого ключа и перенаправляет его в файл с именем /etc/wireguard/public. ключ.

Когда вы запустите команду, вы снова получите одну строку вывода в кодировке base64, которая является открытым ключом для вашего сервера WireGuard. Скопируйте его куда-нибудь для справки, так как вам нужно будет распространять открытый ключ любому пиру, который подключается к серверу.

Шаг 2 — Выбор адресов IPv4 и IPv6

В предыдущем разделе вы установили WireGuard и сгенерировали пару ключей, которая будет использоваться для шифрования входящего и исходящего трафика сервера. В этом разделе вы создадите файл конфигурации для сервера и настроите WireGuard для автоматического запуска при перезагрузке сервера. Вы также определите частные адреса IPv4 и IPv6 для использования с вашим сервером WireGuard и пирами.

Если вы планируете использовать адреса IPv4 и IPv6, следуйте обоим этим разделам. В противном случае следуйте инструкциям в соответствующем разделе для нужд вашей сети VPN.

Шаг 2 (a) — Выбор диапазона IPv4

Если вы используете сервер WireGuard с одноранговыми узлами IPv4, серверу потребуется ряд частных адресов IPv4 для использования клиентами и туннельным интерфейсом. Вы можете выбрать любой диапазон IP-адресов из следующих зарезервированных блоков адресов (если вы хотите узнать больше о том, как распределяются эти блоки, см. спецификацию RFC 1918):

  • 10.0.0.0 – 10.255.255.255 (префикс 10/8)
  • 172.16.0.0 до 172.31.255.255 (префикс 172.16/12)
  • 192.168.0.0 до 192.168.255.255 (префикс 192.168/16)

Для целей этого руководства мы будем использовать 10.8.0.0/24 в качестве блока IP-адресов из первого диапазона зарезервированных IP-адресов. Этот диапазон допускает до 255 различных одноранговых подключений и, как правило, не должен иметь перекрывающихся или конфликтующих адресов с другими диапазонами частных IP-адресов. Не стесняйтесь выбирать диапазон адресов, который работает с конфигурацией вашей сети, если этот примерный диапазон не совместим с вашими сетями.

Сервер WireGuard будет использовать один IP-адрес из диапазона для своего IPv4-адреса частного туннеля. Здесь мы будем использовать 10.8.0.1/24, но можно использовать любой адрес в диапазоне от 10.8.0.1 до 10.8.0.255. Запишите выбранный вами IP-адрес, если вы используете что-то отличное от 10.8.0.1/24. Вы добавите этот IPv4-адрес в файл конфигурации, который вы определили на шаге 3 — Создание конфигурации сервера WireGuard.

Шаг 2(b) — Выбор диапазона IPv6

Если вы используете WireGuard с IPv6, вам потребуется сгенерировать уникальный локальный префикс индивидуального адреса IPv6 на основе алгоритма RFC 4193. Адреса, которые вы используете с WireGuard Server, будут связаны с интерфейсом виртуального туннеля. Вам нужно будет выполнить несколько шагов, чтобы сгенерировать случайный уникальный префикс IPv6 в зарезервированном блоке fd00::/8 частных IPv6-адресов.

Согласно RFC, рекомендуемый способ получения уникального префикса IPv6 — объединить время суток с уникальным идентификационным значением из системы, таким как серийный номер или идентификатор устройства. Затем эти значения хэшируются и усекаются, в результате чего получается набор битов, который можно использовать в качестве уникального адреса в зарезервированном частном блоке IP-адресов fd00::/8.

Чтобы начать генерировать диапазон IPv6 для вашего сервера WireGuard, соберите 64-битную метку времени с помощью утилиты date с помощью следующей команды:

  1. date +%s%N

Вы получите число, подобное следующему, которое является количеством секунд (%s в команде date) и наносекунд (%N) с 1970-01-01 00:00:00 UTC вместе взятые:

Output
1650301699497770167

Запишите значение где-нибудь для использования позже в этом разделе. Затем скопируйте значение machine-id для вашего сервера из файла /var/lib/dbus/machine-id. Этот идентификатор уникален для вашей системы и не должен изменяться, пока существует сервер.

  1. cat /var/lib/dbus/machine-id

Вы получите следующий вывод:

/var/lib/dbus/machine-id
610cef4946ed46da8f71dba9d66c67fb

Теперь вам нужно объединить временную метку с machine-id и хешировать полученное значение с помощью алгоритма SHA-1. Команда будет использовать следующий формат:

printf <timestamp><machine-id> | sha1sum

Запустите команду, подставив метку времени и значения идентификатора машины:

  1. printf 1650301699497770167610cef4946ed46da8f71dba9d66c67fb | sha1sum

Вы получите хэш-значение, подобное следующему:

Output
442adea1488d96388dae9ab816045b24609a6c18 -

Обратите внимание, что вывод команды sha1sum представлен в шестнадцатеричном формате, поэтому в выводе используются два символа для представления одного байта данных. Например, 4f и 26 в выходных данных примера — это первые два байта хешированных данных.

Алгоритм в RFC требует только младших значащих (завершающих) 40 бит или 5 байтов хэшированного вывода. Используйте команду cut, чтобы напечатать последние 5 шестнадцатеричных закодированных байтов из хэша:

  1. printf 442adea1488d96388dae9ab816045b24609a6c18 | cut -c 31-

Аргумент -c указывает команде cut выбрать только указанный набор символов. Аргумент 31- указывает cut напечатать все символы с позиции 31 до конца входной строки.

Вы должны получить вывод, подобный следующему:

Output
24609a6c18

В этом примере выходных данных набор байтов: 24 60 9a 6c 18 .

Теперь вы можете создать свой уникальный сетевой префикс IPv6, добавив к сгенерированным вами 5 байтам префикс fd, разделив каждые 2 байта двоеточием : для удобства чтения. Поскольку каждая подсеть в вашем уникальном префиксе может содержать в общей сложности 18 446 744 073 709 551 616 возможных IPv6-адресов, для простоты вы можете ограничить подсеть стандартным размером /64.

Используя ранее сгенерированные байты с размером подсети /64, результирующий префикс будет следующим:

Unique Local IPv6 Address Prefix
fd24:609a:6c18::/64

Этот диапазон fd24:609a:6c18::/64 — это то, что вы будете использовать для назначения индивидуальных IP-адресов вашим туннельным интерфейсам WireGuard на сервере и одноранговых узлах. Чтобы выделить IP для сервера, добавьте 1 после последних символов ::. Результирующий адрес будет fd24:609a:6c18::1/64. Одноранговые узлы могут использовать любой IP-адрес в диапазоне, но обычно вы увеличиваете значение на единицу каждый раз, когда добавляете одноранговый узел, например. fd24:609a:6c18::2/64. Запишите IP-адрес и продолжите настройку сервера WireGuard в следующем разделе этого руководства.

Шаг 3 — Создание конфигурации сервера WireGuard

Перед созданием конфигурации вашего сервера WireGuard вам потребуется следующая информация:

  1. Убедитесь, что у вас есть доступ к закрытому ключу из шага 1 — установка WireGuard и создание пары ключей.
  2. Если вы используете WireGuard с IPv4, вам потребуется IP-адрес, который вы выбрали для сервера на шаге 2 (a) — Выбор диапазона IPv4, в данном примере это 10.8.0.1/24<. /знак>.
  3. Если вы используете WireGuard с IPv6, вам понадобится IP-адрес сервера, который вы создали на шаге 2 (b) — Выбор диапазона IPv6. В этом примере используется IP-адрес fd24:609a:6c18::1/64.

Получив требуемый закрытый ключ и IP-адрес(а), создайте новый файл конфигурации с помощью nano или предпочитаемого вами редактора, выполнив следующую команду:

  1. sudo nano /etc/wireguard/wg0.conf

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

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_private_key_goes_here Address = 10.8.0.1/24, fd24:609a:6c18::1/64 ListenPort = 51820 SaveConfig = true

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

Сохраните и закройте файл /etc/wireguard/wg0.conf. Если вы используете nano, вы можете сделать это с помощью CTRL+X, затем Y и ENTER для подтверждения. Теперь у вас есть первоначальная конфигурация сервера, которую вы можете использовать в зависимости от того, как вы планируете использовать свой VPN-сервер WireGuard.

Шаг 4 — Настройка сетевой конфигурации сервера WireGuard

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

Чтобы настроить переадресацию, откройте файл /etc/sysctl.conf на сервере Wireguard, используя nano или предпочитаемый вами редактор:

  1. sudo nano /etc/sysctl.conf

Если вы используете IPv4 с WireGuard, добавьте следующую строку внизу файла:

net.ipv4.ip_forward=1

Если вы используете IPv6 с WireGuard, добавьте эту строку внизу файла:

net.ipv6.conf.all.forwarding=1

Если вы используете и IPv4, и IPv6, убедитесь, что вы включили обе строки. Сохраните и закройте файл, когда закончите.

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

  1. sudo sysctl -p
Output
net.ipv6.conf.all.forwarding = 1 net.ipv4.ip_forward = 1

Теперь ваш WireGuard Server сможет перенаправлять входящий трафик с виртуального VPN-устройства Ethernet на другие устройства на сервере, а оттуда — в общедоступный Интернет. Использование этой конфигурации позволит вам направлять весь веб-трафик от вашего узла WireGuard через IP-адрес вашего сервера, а общедоступный IP-адрес вашего клиента будет эффективно скрыт.

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

Шаг 5 — Настройка брандмауэра сервера WireGuard

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

Чтобы разрешить трафик WireGuard VPN через брандмауэр сервера, вам необходимо включить маскировку, которая представляет собой концепцию iptables, обеспечивающую динамическую трансляцию сетевых адресов (NAT) на лету для правильной маршрутизации клиентских подключений.

Сначала найдите общедоступный сетевой интерфейс вашего сервера WireGuard с помощью подкоманды ip route:

  1. ip route list default

Открытый интерфейс — это строка, найденная в выводе этой команды, которая следует за словом \dev. Например, этот результат показывает интерфейс с именем eth0, который выделен ниже:

Output
default via 203.0.113.1 dev eth0 proto static

Запишите имя вашего устройства, так как вы добавите его в правила iptables на следующем шаге.

Чтобы добавить правила брандмауэра на ваш сервер WireGuard, снова откройте файл /etc/wireguard/wg0.conf с помощью nano или другого редактора.

  1. sudo nano /etc/wireguard/wg0.conf

Внизу файла после строки SaveConfig=true вставьте следующие строки:

/etc/wireguard/wg0.conf
. . . PostUp = ufw route allow in on wg0 out on eth0 PostUp = iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PostUp = ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE PreDown = ufw route delete allow in on wg0 out on eth0 PreDown = iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE PreDown = ip6tables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

Строки PostUp будут запущены, когда WireGuard Server запустит виртуальный VPN-туннель. В приведенном здесь примере он добавит три правила ufw и iptables:

  • ufw route allow in on wg0 out on eth0 — это правило разрешает пересылать трафик IPv4 и IPv6, поступающий через wg0 VPN. интерфейса к сетевому интерфейсу eth0 на сервере. Он работает в сочетании со значениями sysctl net.ipv4.ip_forward и net.ipv6.conf.all.forwarding, настроенными в предыдущем разделе.
  • iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE — это правило настраивает маскировку и перезаписывает трафик IPv4, поступающий на интерфейс VPN wg0, чтобы это выглядит так, как будто оно исходит непосредственно от общедоступного IPv4-адреса сервера WireGuard.
  • ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE — это правило настраивает маскировку и перезаписывает трафик IPv6, поступающий на интерфейс VPN wg0, чтобы это выглядит так, как будто оно исходит непосредственно от общедоступного IPv6-адреса сервера WireGuard.

Правила PreDown запускаются, когда сервер WireGuard останавливает виртуальный VPN-туннель. Эти правила обратны правилам PostUp и служат для отмены правил пересылки и маскировки для интерфейса VPN при остановке VPN.

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

И наоборот, если вы используете только IPv6, отредактируйте конфигурацию, включив в нее только команды ip6tables. Строки ufw должны существовать для любой комбинации сетей IPv4 и IPv6. Сохраните и закройте файл, когда закончите.

Последней частью настройки брандмауэра на вашем сервере WireGuard является разрешение входящего и исходящего трафика через порт WireGuard UDP. Если вы не изменили порт в файле /etc/wireguard/wg0.conf сервера, вы откроете порт 51820. Если вы выбрали другой порт при редактировании конфигурации, обязательно замените его в следующей команде UFW.

Если вы забыли открыть порт SSH, следуя предварительному руководству, добавьте его сюда:

  1. sudo ufw allow 51820/udp
  2. sudo ufw allow OpenSSH

Примечание. Если вы используете другой брандмауэр или настроили конфигурацию UFW, вам может потребоваться добавить дополнительные правила брандмауэра. Например, если вы решили туннелировать весь сетевой трафик через VPN-подключение, вам необходимо убедиться, что трафик порта 53 разрешен для DNS-запросов, а такие порты, как 80 и 443 для трафика HTTP и HTTPS соответственно. Если есть другие протоколы, которые вы используете через VPN, вам также нужно будет добавить правила для них.

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

  1. sudo ufw disable
  2. sudo ufw enable

Вы можете убедиться, что правила действуют, выполнив команду ufw status. Запустите его, и вы должны получить вывод, подобный следующему:

  1. sudo ufw status
Output
Status: active To Action From -- ------ ---- 51280/udp ALLOW Anywhere 22/tcp ALLOW Anywhere 51280/udp (v6) ALLOW Anywhere (v6) 22/tcp (v6) ALLOW Anywhere (v6)

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

Шаг 6 — Запуск сервера WireGuard

WireGuard можно настроить для работы в качестве службы systemd с помощью встроенного скрипта wg-quick. Хотя вы можете вручную использовать команду wg для создания туннеля каждый раз, когда вы хотите использовать VPN, это ручной процесс, который становится повторяющимся и подверженным ошибкам. Вместо этого вы можете использовать systemctl для управления туннелем с помощью скрипта wg-quick.

Использование службы systemd означает, что вы можете настроить WireGuard на запуск при загрузке, чтобы вы могли подключаться к VPN в любое время, пока сервер работает. Для этого включите службу wg-quick для туннеля wg0, который вы определили, добавив его в systemctl:

  1. sudo systemctl enable wg-quick@wg0.service

Обратите внимание, что команда указывает имя устройства туннеля wg0 как часть имени службы. Это имя соответствует файлу конфигурации /etc/wireguard/wg0.conf. Такой подход к именованию означает, что вы можете создать столько отдельных VPN-туннелей, сколько захотите, используя свой сервер.

Например, у вас может быть туннельное устройство с именем prod и файлом его конфигурации /etc/wireguard/prod.conf. Каждая конфигурация туннеля может содержать различные настройки IPv4, IPv6 и клиентского брандмауэра. Таким образом, вы можете поддерживать несколько различных одноранговых соединений, каждое из которых имеет свои уникальные IP-адреса и правила маршрутизации.

Теперь запустите службу:

  1. sudo systemctl start wg-quick@wg0.service

Дважды проверьте, активна ли служба WireGuard, с помощью следующей команды. Вы должны увидеть active (running) в выводе:

  1. sudo systemctl status wg-quick@wg0.service
Output
● wg-quick@wg0.service - WireGuard via wg-quick(8) for wg0 Loaded: loaded (/lib/systemd/system/wg-quick@.service; enabled; vendor preset: enabled) Active: active (exited) since Mon 2022-04-18 17:22:13 UTC; 2s ago Docs: man:wg-quick(8) man:wg(8) https://www.wireguard.com/ https://www.wireguard.com/quickstart/ https://git.zx2c4.com/wireguard-tools/about/src/man/wg-quick.8 https://git.zx2c4.com/wireguard-tools/about/src/man/wg.8 Process: 98834 ExecStart=/usr/bin/wg-quick up wg0 (code=exited, status=0/SUCCESS) Main PID: 98834 (code=exited, status=0/SUCCESS) CPU: 193ms Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] wg setconf wg0 /dev/fd/63 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -4 address add 10.8.0.1/24 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip -6 address add fd24:609a:6c18::1/64 dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip link set mtu 1420 up dev wg0 Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ufw route allow in on wg0 out on ens3 Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added Apr 18 17:22:13 thats-my-jam wg-quick[98890]: Rule added (v6) Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] iptables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam wg-quick[98834]: [#] ip6tables -t nat -I POSTROUTING -o ens3 -j MASQUERADE Apr 18 17:22:13 thats-my-jam systemd[1]: Finished WireGuard via wg-quick(8) for wg0.

В выходных данных показаны команды ip, которые используются для создания виртуального устройства wg0 и присвоения ему адресов IPv4 и IPv6, которые вы добавили в файл конфигурации. Вы можете использовать эти правила для устранения неполадок в туннеле или с помощью самой команды wg, если хотите попробовать вручную настроить интерфейс VPN.

Когда сервер настроен и запущен, следующим шагом будет настройка клиентского компьютера в качестве узла WireGuard и подключение к серверу WireGuard.

Шаг 7 — Настройка узла WireGuard

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

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

Чтобы настроить одноранговый узел WireGuard, убедитесь, что у вас установлен пакет WireGuard, используя следующие команды apt. При одноранговом запуске WireGuard:

  1. sudo apt update
  2. sudo apt install wireguard

Создание пары ключей WireGuard Peer

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

  1. wg genkey | sudo tee /etc/wireguard/private.key
  2. sudo chmod go= /etc/wireguard/private.key

Вы снова получите одну строку вывода в кодировке base64, которая является закрытым ключом. Копия вывода также хранится в /etc/wireguard/private.key. Внимательно запишите полученный закрытый ключ, так как вам нужно будет добавить его в файл конфигурации однорангового узла WireGuard позже в этом разделе.

Затем используйте следующую команду для создания файла открытого ключа:

  1. sudo cat /etc/wireguard/private.key | wg pubkey | sudo tee /etc/wireguard/public.key

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

Создание файла конфигурации узла WireGuard

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

Вам понадобится несколько фрагментов информации для файла конфигурации:

  • Закрытый ключ в кодировке base64, сгенерированный вами на узле.
  • Диапазоны адресов IPv4 и IPv6, которые вы определили на сервере WireGuard.
  • Открытый ключ в кодировке base64 с сервера WireGuard.
  • Общедоступный IP-адрес и номер порта сервера WireGuard. Обычно это будет адрес IPv4, но если ваш сервер имеет адрес IPv6, а ваш клиентский компьютер имеет подключение к Интернету по протоколу IPv6, вы можете использовать его вместо IPv4.

Имея всю эту информацию под рукой, откройте новый файл /etc/wireguard/wg0.conf на машине WireGuard Peer с помощью nano или предпочитаемого вами редактора:

  1. sudo nano /etc/wireguard/wg0.conf

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

/etc/wireguard/wg0.conf
[Interface] PrivateKey = base64_encoded_peer_private_key_goes_here Address = 10.8.0.**2**/24 Address = fd24:609a:6c18::**2**/64 [Peer] PublicKey = U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= AllowedIPs = 10.8.0.0/24, fd24:609a:6c18::/64 Endpoint = 203.0.113.1:51820

Обратите внимание, что в первой строке Address используется адрес IPv4 из подсети 10.8.0.0/24, которую вы выбрали ранее. Этот IP-адрес может быть любым в подсети, если он отличается от IP-адреса сервера. Увеличение адресов на 1 каждый раз, когда вы добавляете одноранговый узел, обычно является самым простым способом выделения IP-адресов.

Аналогично, обратите внимание, как во второй строке Address используется адрес IPv6 из созданной ранее подсети, и увеличивается адрес сервера на единицу. Опять же, любой IP-адрес в диапазоне действителен, если вы решите использовать другой адрес.

Другой примечательной частью файла является последняя строка AllowedIPs. Эти два диапазона IPv4 и IPv6 предписывают одноранговому узлу отправлять трафик через VPN только в том случае, если целевая система имеет IP-адрес в любом из диапазонов. Используя директиву AllowedIPs, вы можете ограничить VPN на одноранговом узле, чтобы подключаться только к другим одноранговым узлам и службам в VPN, или вы можете настроить параметр для туннелирования всего трафика через VPN и использовать сервер WireGuard. как шлюз.

Если вы используете только IPv4, опустите завершающий диапазон fd24:609a:6c18::/64 (включая запятую ,). И наоборот, если вы используете только IPv6, включите только префикс fd24:609a:6c18::/64 и исключите диапазон IPv4 10.8.0.0/24.

В обоих случаях, если вы хотите отправлять весь трафик вашего партнера через VPN и использовать сервер WireGuard в качестве шлюза для всего трафика, вы можете использовать 0.0.0.0/0, который представляет весь трафик. адресное пространство IPv4 и ::/0 для всего адресного пространства IPv6.

(Необязательно) Настройка узла для маршрутизации всего трафика через туннель

Если вы решили маршрутизировать весь трафик партнера через туннель, используя маршруты 0.0.0.0/0 или ::/0, а партнер является удаленной системой, то вам нужно будет выполнить шаги в этом разделе. Если ваш пир является локальной системой, то лучше пропустить этот раздел.

Для удаленных пиров, к которым вы обращаетесь через SSH или какой-либо другой протокол с использованием общедоступного IP-адреса, вам нужно будет добавить некоторые дополнительные правила в файл wg0.conf пира. Эти правила обеспечат возможность подключения к одноранговой системе из-за пределов туннеля, когда он подключен. В противном случае, когда туннель установлен, весь трафик, который обычно обрабатывается через общедоступный сетевой интерфейс, не будет правильно направляться в обход туннельного интерфейса wg0, что приведет к недоступности удаленной системы.

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

  1. ip route list table main default

Вы получите следующий вывод:

Output
default via 203.0.113.1 dev eth0 proto static

Обратите внимание на выделенный IP-адрес шлюза 203.0.113.1 для последующего использования и устройство eth0. Имя вашего устройства может быть другим. Если это так, замените его на eth0 в следующих командах.

Затем найдите общедоступный IP-адрес для одноранговой системы, изучив устройство с помощью команды ip address show:

  1. ip -brief address show eth0

Вы получите следующий вывод:

Output
eth0 UP 203.0.113.5/20 10.20.30.40/16 2604:a880:400:d1::3d3:6001/64 fe80::68d5:beff:feff:974c/64

В этом примере выделенный IP-адрес 203.0.113.5 (без завершающего /20) является общедоступным адресом, назначенным eth0, которое необходимо добавить в конфигурацию однорангового устройства WireGuard.

Теперь откройте файл /etc/wireguard/wg0.conf узла WireGuard с помощью nano или предпочитаемого вами редактора.

  1. sudo nano /etc/wireguard/wg0.conf

Перед строкой [Peer] добавьте следующие 4 строки:

PostUp = ip rule add table 200 from 203.0.113.5
PostUp = ip route add table 200 default via 203.0.113.1
PreDown = ip rule delete table 200 from 203.0.113.5
PreDown = ip route delete table 200 default via 203.0.113.1

[Peer]
. . .

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

  • PostUp=ip rule add table 200 from 203.0.113.5 — эта команда создает правило, которое проверяет любые записи маршрутизации в таблице с номером 200, когда IP-адрес совпадает с общедоступным адресом 203.0.113.5 одноранговой системы.
  • PostUp=ip route add table 200 default via 203.0.113.1. Эта команда гарантирует, что любой трафик, обрабатываемый таблицей 200, будет используйте для маршрутизации шлюз 203.0.113.1 вместо интерфейса WireGuard.

Строки PreDown удаляют пользовательское правило и маршрут, когда туннель закрыт.

Примечание. Номер таблицы 200 является произвольным при построении этих правил. Вы можете использовать значение от 2 до 252 или использовать собственное имя, добавив метку в файл /etc/iproute2/rt_tables и ссылаясь на имя вместо числового значения.

Дополнительные сведения о том, как таблицы маршрутизации работают в Linux, см. в Руководстве по сетевому администрированию IP-уровня в Linux.

Если вы направляете весь трафик пира через VPN, убедитесь, что вы настроили правильные правила sysctl и iptables на сервере WireGuard на шаге 5 — Настройка брандмауэра сервера WireGuard. .

(Необязательно) Настройка DNS-преобразователей WireGuard Peer

Если вы используете WireGuard Server в качестве VPN-шлюза для всего трафика ваших одноранговых узлов, вам нужно будет добавить строку в раздел [Interface], указывающую преобразователи DNS. Если вы не добавите этот параметр, ваши DNS-запросы могут быть не защищены VPN или они могут быть раскрыты вашему интернет-провайдеру (ISP) или другим третьим лицам.

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

Чтобы добавить резолверы DNS в конфигурацию вашего однорангового узла, сначала определите, какие DNS-серверы использует ваш WireGuard Server. Выполните следующую команду на сервере WireGuard, заменив eth0 именем вашего устройства Ethernet, если оно отличается от этого примера:

  1. resolvectl dns eth0

Вы должны получить вывод, подобный следующему:

Output
Link 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888

Выводимые IP-адреса — это DNS-преобразователи, используемые сервером. Вы можете использовать любой или все из них или только IPv4 или IPv6 в зависимости от ваших потребностей. Запишите преобразователи, которые вы будете использовать.

Затем вам нужно будет добавить выбранные вами преобразователи в файл конфигурации узла WireGuard Peer. Вернувшись на узел WireGuard, откройте файл /etc/wireguard/wg0.conf с помощью nano или предпочитаемого вами редактора:

  1. sudo nano /etc/wireguard/wg0.conf

Перед строкой [Peer] добавьте следующее:

DNS = 67.207.67.2 2001:4860:4860::8844

[Peer]
. . .

Опять же, в зависимости от ваших предпочтений или требований к IPv4 и IPv6, вы можете редактировать список в соответствии со своими потребностями.

Подключившись к VPN на следующем шаге, вы можете проверить, отправляете ли вы DNS-запросы через VPN, используя такой сайт, как DNSутечка test.com.

Вы также можете проверить, использует ли ваш одноранговый узел настроенные резолверы с помощью команды resolvectl dns, аналогичной тому, что вы запустили на сервере. Вы должны получить вывод, подобный следующему, показывающий преобразователи DNS, которые вы настроили для туннеля VPN:

Output
Global: 67.207.67.2 67.207.67.3 . . .

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

Шаг 8 — Добавление открытого ключа узла на сервер WireGuard

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

Убедитесь, что у вас есть копия открытого ключа в кодировке base64 для узла WireGuard, выполнив:

  1. sudo cat /etc/wireguard/public.key
Output
PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=

Теперь войдите на сервер WireGuard и выполните следующую команду:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,fd24:609a:6c18::2

Обратите внимание, что часть команды allowed-ips принимает список адресов IPv4 и IPv6, разделенных запятыми. Вы можете указать отдельные IP-адреса, если хотите ограничить IP-адрес, который одноранговый узел может назначать себе, или диапазон, как в примере, если ваши одноранговые узлы могут использовать любой IP-адрес в диапазоне VPN. Также обратите внимание, что никакие два одноранговых узла не могут иметь одинаковую настройку allowed-ips.

Если вы хотите обновить разрешенные IP-адреса для существующего узла, вы можете снова запустить ту же команду, но изменить IP-адреса. Поддерживается несколько IP-адресов. Например, чтобы изменить только что добавленный одноранговый узел WireGuard, добавив IP-адрес вида 10.8.0.100 к существующим 10.8.0.2 и fd24:609a:6c18: :2 IP, вы должны запустить следующее:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed-ips 10.8.0.2,10.8.0.100,fd24:609a:6c18::2

После того, как вы запустили команду для добавления узла, проверьте состояние туннеля на сервере с помощью команды wg:

  1. sudo wg
Output
interface: wg0 public key: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= private key: (hidden) listening port: 51820 peer: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= allowed ips: 10.8.0.2/32, fd24:609a:6c18::/128

Обратите внимание, как в строке peer отображается открытый ключ узла WireGuard Peer, а также IP-адреса или диапазоны адресов, которые ему разрешено использовать для присвоения себе IP-адреса.

Теперь, когда вы определили параметры соединения узла на сервере, следующим шагом будет запуск туннеля на узле.

Шаг 9 — Подключение узла WireGuard к туннелю

Теперь, когда ваш сервер и одноранговый узел настроены на поддержку вашего выбора IPv4, IPv6, переадресации пакетов и разрешения DNS, пришло время подключить одноранговый узел к VPN-туннелю.

Поскольку вы можете захотеть, чтобы VPN была включена только для определенных случаев использования, мы будем использовать команду wg-quick, чтобы установить соединение вручную. Если вы хотите автоматизировать запуск туннеля, как на сервере, выполните шаги, описанные в разделе «Шаг 6 — Запуск сервера WireGuard», вместо использования команды wq-quick.

Если вы направляете весь трафик через VPN и настроили переадресацию DNS, вам необходимо установить утилиту resolvconf на узле WireGuard, прежде чем запускать туннель. Запустите следующую команду, чтобы настроить это:

  1. sudo apt install resolvconf

Чтобы запустить туннель, выполните на узле WireGuard следующее:

  1. sudo wg-quick up wg0

Вы получите следующий вывод:

Output
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x

Обратите внимание на выделенные адреса IPv4 и IPv6, которые вы назначили узлу.

Если вы установите AllowedIPs на узле равном 0.0.0.0/0 и ::/0 (или используете диапазоны, отличные от тех, которые вы выбрали для VPN), то ваш вывод будет выглядеть следующим образом:

Output
[#] ip link add wg0 type wireguard [#] wg setconf wg0 /dev/fd/63 [#] ip -4 address add 10.8.0.2/24 dev wg0 [#] ip -6 address add fd24:609a:6c18::2/64 dev wg0 [#] ip link set mtu 1420 up dev wg0 [#] resolvconf -a tun.wg0 -m 0 -x [#] wg set wg0 fwmark 51820 [#] ip -6 route add ::/0 dev wg0 table 51820 [#] ip -6 rule add not fwmark 51820 table 51820 [#] ip -6 rule add table main suppress_prefixlength 0 [#] ip6tables-restore -n [#] ip -4 route add 0.0.0.0/0 dev wg0 table 51820 [#] ip -4 rule add not fwmark 51820 table 51820 [#] ip -4 rule add table main suppress_prefixlength 0 [#] sysctl -q net.ipv4.conf.all.src_valid_mark=1 [#] iptables-restore -n

В этом примере обратите внимание на выделенные маршруты, добавленные командой, которые соответствуют AllowedIPs в конфигурации однорангового узла.

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

  1. sudo wg
Output
interface: wg0 public key: PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= private key: (hidden) listening port: 49338 fwmark: 0xca6c peer: U9uE2kb/nrrzsEU58GD3pKFU3TLYDMCbetIsnV8eeFE= endpoint: 203.0.113.1:51820 allowed ips: 10.8.0.0/24, fd24:609a:6c18::/64 latest handshake: 1 second ago transfer: 6.50 KiB received, 15.41 KiB sent

Вы также можете снова проверить статус на сервере, и вы получите аналогичный результат.

Убедитесь, что ваш партнер использует VPN, используя команды ip route и ip -6 route. Если вы используете VPN в качестве шлюза для всего вашего интернет-трафика, проверьте, какой интерфейс будет использоваться для трафика, предназначенного для CloudFlare 1.1.1.1 и 2606:4700:4700::1111 DNS-преобразователи.

Если вы используете WireGuard только для доступа к ресурсам в VPN, замените действительный адрес IPv4 или IPv6, например, сам шлюз, в эти команды. Например, 10.8.0.1 или fd24:609a:6c18::1.

  1. ip route get 1.1.1.1
Output
1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000 cache

Обратите внимание, что используется устройство wg0 и адрес IPv4 10.8.0.2, который вы назначили узлу. Аналогичным образом, если вы используете IPv6, выполните следующее:

  1. ip -6 route get 2606:4700:4700::1111
Output
2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium

Снова обратите внимание на интерфейс wg0 и IPv6-адрес fd24:609a:6c18::2, который вы назначили узлу.

Если на вашем партнере установлен браузер, вы также можете посетить ipv6-test.com, чтобы убедиться, что ваш партнер направляет свой трафик через VPN.

Когда вы будете готовы отключиться от VPN на узле, используйте команду wg-quick:

  1. sudo wg-quick down wg0

Вы получите следующий вывод, указывающий, что VPN-туннель закрыт:

Output
[#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f

Если вы установите AllowedIPs на узле равном 0.0.0.0/0 и ::/0 (или используете диапазоны, отличные от тех, которые вы выбрали для VPN), то ваш вывод будет выглядеть следующим образом:

Output
[#] ip rule delete table 200 from 203.0.113.5 [#] ip route delete table 200 default via 203.0.113.1 [#] ip -4 rule delete table 51820 [#] ip -4 rule delete table main suppress_prefixlength 0 [#] ip -6 rule delete table 51820 [#] ip -6 rule delete table main suppress_prefixlength 0 [#] ip link delete dev wg0 [#] resolvconf -d tun.wg0 -f [#] iptables-restore -n [#] ip6tables-restore -n

Чтобы повторно подключиться к VPN, снова запустите команду wg-quick up wg0 на узле. Если вы хотите полностью удалить конфигурацию однорангового узла с сервера WireGuard, вы можете запустить следующую команду, обязательно заменив правильный открытый ключ для однорангового узла, который вы хотите удалить:

  1. sudo wg set wg0 peer PeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg= remove

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

Заключение

В этом руководстве вы установили пакет и инструменты WireGuard как в серверной, так и в клиентской системах Debian 11. Вы установили правила брандмауэра для WireGuard и настроили параметры ядра, чтобы разрешить пересылку пакетов с помощью команды sysctl на сервере. Вы узнали, как генерировать частные и общедоступные ключи шифрования WireGuard и как настроить сервер и одноранговый узел (или одноранговые узлы) для подключения друг к другу.

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

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