Введение
WireGuard – это легкий виртуальный частный сетевой протокол (VPN), который поддерживает соединения IPv4 и IPv6. VPN позволяет вам проходить через ненадежные сети, как если бы вы находились в частной сети. Он предоставляет вам свободу доступа в интернет безопасно и надежно с вашего смартфона или ноутбука, когда вы подключены к ненадежной сети, например, к Wi-Fi в отеле или кофейне.
Шифрование WireGuard зависит от публичных и приватных ключей для установления зашифрованного туннеля между собой. Каждая версия WireGuard использует определенный криптографический шифр для обеспечения простоты, безопасности и совместимости с пирами.
В сравнении с другими программами VPN, такими как OpenVPN и IPSec, которые используют транспортный уровень безопасности (TLS) и сертификаты для аутентификации и установления зашифрованных туннелей между системами, WireGuard предлагает более простой подход. Различные версии TLS включают поддержку сотен различных криптографических наборов и алгоритмов, и хотя это обеспечивает большую гибкость для поддержки различных клиентов, это также делает настройку VPN, использующего TLS, более времязатратной, сложной и подверженной ошибкам.
В этом руководстве вы настроите WireGuard на сервере Ubuntu 22.04, а затем настроите другую машину для подключения к нему в качестве пира, используя как IPv4, так и IPv6-подключения (обычно называемое dual stack соединением). Вы также узнаете, как маршрутизировать интернет-трафик пира через сервер WireGuard в конфигурации шлюза, помимо использования VPN для зашифрованного пир-к-пир туннеля.
Для целей этого руководства мы настроим другую систему Ubuntu 22.04 в качестве пира (также называемого клиентом) для сервера WireGuard. Последующие уроки в этой серии объяснят, как установить и запустить WireGuard на системах и устройствах Windows, macOS, Android и iOS.
Примечание: Если вы планируете настроить WireGuard на Droplet DigitalOcean, имейте в виду, что мы, как и многие хостинг-провайдеры, взимаем плату за избыточный трафик. По этой причине, пожалуйста, имейте в виду, сколько трафика обрабатывает ваш сервер. См. эту страницу для получения дополнительной информации.
Предварительные требования
Для выполнения этого руководства вам понадобится:
- Один сервер Ubuntu 22.04 с пользователем, имеющим sudo-права, и включенным брандмауэром. Чтобы настроить это, вы можете следовать нашему Инициальному настройка сервера с Ubuntu 22.04. Мы будем называть это Сервером WireGuard в этом руководстве.
- Вам понадобится клиентский компьютер, который вы будете использовать для подключения к вашему серверу WireGuard. В этом руководстве мы будем называть этот компьютер Peer WireGuard. Для целей этого руководства рекомендуется использовать ваш локальный компьютер в качестве Peer WireGuard, но вы также можете использовать удаленные серверы или мобильные телефоны в качестве клиентов, если предпочитаете. Если вы используете удаленную систему, убедитесь, что вы выполняете все необходимые разделы позже в этом руководстве, иначе вы можете заблокировать себя из системы.
- Чтобы использовать WireGuard с IPv6, вам также необходимо убедиться, что ваш сервер настроен на поддержку этого типа трафика. Если вы хотите включить поддержку IPv6 с WireGuard и используете Droplet от DigitalOcean, обратитесь к этой странице документации Как включить IPv6 на Droplets. Вы можете добавить поддержку IPv6 при создании Droplet или позже, используя инструкции на этой странице.
Шаг 1 — Установка WireGuard и Генерация пары ключей
Первый шаг в этом руководстве – установить WireGuard на вашем сервере. Для начала обновите индекс пакетов вашего сервера WireGuard и установите WireGuard, используя следующие команды. Вам может быть предложено ввести пароль вашего sudo пользователя, если это ваш первый раз, когда вы используете sudo
в этой сессии:
Теперь, когда у вас установлен WireGuard, следующим шагом будет создание ключевой пары – приватного и публичного ключей для сервера. Вы будете использовать встроенные команды wg genkey
и wg pubkey
для создания ключей, а затем добавите приватный ключ в конфигурационный файл WireGuard.
Также вам потребуется изменить разрешения на ключ, который вы только что создали, используя команду chmod
, так как по умолчанию файл читаемый любым пользователем на вашем сервере.
Создайте приватный ключ для WireGuard и измените его разрешения с помощью следующих команд:
Команда sudo chmod go=...
удаляет любые разрешения на файл для пользователей и групп, отличных от пользователя root, чтобы гарантировать, что только он может получить доступ к приватному ключу.
Вы должны получить одну строку закодированного в формате base64
вывода, который является приватным ключом. Копия вывода также сохраняется в файле /etc/wireguard/private.key
для последующего использования командой tee
из этой команды. Внимательно запишите приватный ключ, который выводится, так как вам нужно будет добавить его в конфигурационный файл WireGuard позже в этом разделе.
Следующим шагом будет создание соответствующего публичного ключа, который происходит от приватного ключа. Используйте следующую команду для создания файла публичного ключа:
Эта команда состоит из трех отдельных команд, которые объединены вместе с помощью оператора |
(пайп):
sudo cat /etc/wireguard/private.key
: этой командой считывается файл с закрытым ключом и выводится в поток стандартного вывода.wg pubkey
: вторая команда принимает вывод первой команды как свой стандартный ввод и обрабатывает его для генерации публичного ключа.sudo tee /etc/wireguard/public.key
: последняя команда берет вывод команды генерации публичного ключа и перенаправляет его в файл с именем/etc/wireguard/public.key
.
При выполнении команды вы снова получите одну строку base64
-кодированного вывода, который является публичным ключом вашего сервера WireGuard. Скопируйте его куда-нибудь для ссылки, так как вам нужно будет распространить публичный ключ для каждого пира, подключающегося к серверу.
Шаг 2 — Выбор IPv4 и IPv6-адресов
В предыдущем разделе вы установили WireGuard и сгенерировали пару ключей, которая будет использоваться для шифрования трафика от и к серверу. В этом разделе вы создадите файл конфигурации для сервера и настроите WireGuard на автоматический запуск при перезагрузке сервера. Вы также определите частные IPv4 и IPv6-адреса для использования с вашим сервером WireGuard и пирами.
Если вы планируете использовать как IPv4, так и IPv6-адреса, то следуйте обоим этим разделам. В противном случае, следуйте инструкциям в соответствующем разделе для сетевых потребностей вашей VPN.
Шаг 2(а) — Выбор диапазона 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, будут связаны с виртуальным туннельным интерфейсом. Вам нужно выполнить несколько шагов для генерации случайного, уникального IPv6-префикса в зарезервированном блоке частных IPv6-адресов fd00::/8
.
Согласно RFC, рекомендуемым способом получения уникального IPv6-префикса является объединение времени суток с уникальным идентифицирующим значением из системы, такой как серийный номер или идентификатор устройства. Затем эти значения хешируются и усекаются, что приводит к набору битов, которые можно использовать в качестве уникального адреса в зарезервированном частном блоке IP-адресов fd00::/8
.
Для начала генерации диапазона IPv6 для вашего сервера WireGuard соберите 64-битный временной штамп, используя утилиту date
следующей командой:
Вы получите число вроде следующего, которое представляет собой количество секунд ( %s
в команде date
) и наносекунды ( %N
) с 1970-01-01 00:00:00 UTC объединенные вместе:
Output1650301699497770167
Запишите значение где-то для использования позже в этом разделе. Затем скопируйте значение machine-id
для вашего сервера из файла /var/lib/dbus/machine-id
. Этот идентификатор уникален для вашей системы и не должен изменяться так долго, как существует сервер.
Вы получите вывод вроде следующего:
/var/lib/dbus/machine-id610cef4946ed46da8f71dba9d66c67fb
Теперь вам нужно объединить временную метку с machine-id
и захешировать полученное значение, используя алгоритм SHA-1. Команда будет иметь следующий формат:
printf <timestamp><machine-id> | sha1sum
Запустите команду, подставив ваши значения временной метки и идентификатора машины:
Вы получите значение хеша вроде следующего:
Output442adea1488d96388dae9ab816045b24609a6c18 -
Обратите внимание, что вывод команды sha1sum
представлен в шестнадцатеричном формате, поэтому вывод использует два символа для представления одного байта данных. Например, 4f
и 26
в примере вывода – это первые два байта хешированных данных.
Алгоритм в RFC требует только младшие значимые (завершающие) 40 бит, или 5 байт, хешированного вывода. Используйте команду cut
для печати последних 5 шестнадцатерично закодированных байтов из хэша:
Аргумент -c
сообщает команде cut
выбирать только определенный набор символов. Аргумент 31-
говорит cut
выводить все символы с позиции 31 до конца входной строки.
Вы должны получить вывод, подобный следующему:
Output24609a6c18
В этом примере вывода набор байтов следующий: 24 60 9a 6c 18
.
Теперь вы можете создать свой уникальный префикс сети IPv6, добавив к 5 сгенерированным байтам префикс fd
, разделяя каждые 2 байта двоеточием :
для удобства чтения. Поскольку каждая подсеть в вашем уникальном префиксе может содержать в общей сложности 18,446,744,073,709,551,616 возможных адресов IPv6, вы можете ограничить подсеть стандартным размером /64
для простоты.
Используя ранее сгенерированные байты с размером подсети /64
, полученный префикс будет следующим:
Unique Local IPv6 Address Prefixfd24: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 — Установка WireGuard и генерация ключевой пары.
-
Если вы используете WireGuard с IPv4, вам потребуется IP-адрес, который вы выбрали для сервера в Шаг 2(a) — Выбор диапазона IPv4, который в этом примере составляет
10.8.0.1/24
. -
Если вы используете WireGuard с IPv6, вам потребуется IP-адрес сервера, который вы сгенерировали в Шаг 2(b) — Выбор диапазона IPv6. В этом примере IP-адрес составляет
fd24:609a:6c18::1/64
.
После того как у вас будет необходимый закрытый ключ и IP-адрес(а), создайте новый конфигурационный файл, используя nano
или ваш редактор по умолчанию, выполнив следующую команду:
Добавьте следующие строки в файл, заменив ваш закрытый ключ на выделенное значение base64_encoded_private_key_goes_here
, и IP-адрес(а) на строке Address
. Вы также можете изменить строку 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 через сервер WireGuard, вам нужно будет настроить IP-перенаправление, следуя этому разделу руководства.
Чтобы настроить перенаправление, откройте файл /etc/sysctl.conf
с помощью nano
или вашего предпочтительного редактора:
Если вы используете IPv4 с WireGuard, добавьте следующую строку в конец файла:
net.ipv4.ip_forward=1
Если вы используете IPv6 с WireGuard, добавьте эту строку в конец файла:
net.ipv6.conf.all.forwarding=1
Если вы используете как IPv4, так и IPv6, убедитесь, что включили обе строки. Сохраните и закройте файл, когда закончите.
Чтобы прочитать файл и загрузить новые значения для вашей текущей сессии терминала, выполните:
Outputnet.ipv6.conf.all.forwarding = 1
net.ipv4.ip_forward = 1
Теперь ваш сервер WireGuard сможет перенаправлять входящий трафик с виртуального устройства VPN на другие устройства на сервере и оттуда – в публичный Интернет. Используя эту конфигурацию, вы сможете маршрутизировать весь веб-трафик вашего узла WireGuard через IP-адрес вашего сервера, и публичный IP-адрес вашего клиента будет эффективно скрыт.
Однако перед тем, как трафик сможет быть маршрутизирован через ваш сервер правильно, вам нужно будет настроить некоторые правила брандмауэра. Эти правила обеспечат правильное поток трафика к и от вашего сервера WireGuard и узлов.
Шаг 5 — Настройка брандмауэра сервера WireGuard
В этом разделе вы отредактируете конфигурацию сервера WireGuard, чтобы добавить правила брандмауэра, которые обеспечат правильную маршрутизацию трафика от и к серверу и клиентам. Как и в предыдущем разделе, пропустите этот шаг, если вы используете свою VPN WireGuard только для соединения между машинами для доступа к ресурсам, ограниченным вашей VPN.
Для разрешения трафика VPN WireGuard через брандмауэр сервера вам потребуется включить маскарадинг, который является концепцией iptables, обеспечивающей динамическое перевод сетевых адресов (NAT) на лету для правильной маршрутизации клиентских подключений.
Сначала найдите общедоступный сетевой интерфейс вашего сервера WireGuard, используя подкоманду ip route
:
Общедоступный интерфейс – это строка, найденная в выводе этой команды, следующая за словом “dev”. Например, в этом результате показан интерфейс с именем eth0
, который выделен ниже:
Outputdefault via 203.0.113.1 dev eth0 proto static
Запишите имя вашего устройства, так как вы добавите его в правила iptables
на следующем шаге.
Чтобы добавить правила брандмауэра на ваш сервер WireGuard, откройте файл /etc/wireguard/wg0.conf
снова с помощью nano
или вашего предпочтительного редактора.
В конце файла, после строки 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 запустит виртуальный VPN-туннель. В приведенном здесь примере будут добавлены три правила ufw
и iptables
:
ufw route allow in on wg0 out on eth0
– Это правило позволит пересылать трафик IPv4 и IPv6, поступающий на интерфейс VPNwg0
, на сетевой интерфейсeth0
на сервере. Оно работает в сочетании с значениями sysctlnet.ipv4.ip_forward
иnet.ipv6.conf.all.forwarding
, которые вы настроили в предыдущем разделе.iptables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– Это правило настраивает маскирование и переписывает трафик IPv4, поступающий на интерфейс VPNwg0
, чтобы он выглядел так, будто исходит непосредственно от общедоступного IPv4-адреса сервера WireGuard.ip6tables -t nat -I POSTROUTING -o eth0 -j MASQUERADE
– Это правило настраивает маскирование и переписывает трафик IPv6, поступающий на интерфейс VPNwg0
, чтобы он выглядел так, будто исходит непосредственно от общедоступного IPv6-адреса сервера WireGuard.
PreDown
правила запускаются, когда сервер WireGuard останавливает виртуальный VPN-туннель. Эти правила являются обратными по отношению к правилам PostUp
и предназначены для отмены правил пересылки и маскирования для интерфейса VPN при остановке VPN.
В обоих случаях отредактируйте конфигурацию, чтобы включить или исключить правила IPv4 и IPv6, соответствующие вашему VPN. Например, если вы используете только IPv4, то можете исключить строки с командами ip6tables
.
Наоборот, если вы используете только IPv6, то отредактируйте конфигурацию так, чтобы включались только команды ip6tables
. Строки ufw
должны существовать для любой комбинации сетей IPv4 и IPv6. Сохраните и закройте файл, когда закончите.
Последний этап настройки брандмауэра на вашем сервере WireGuard – разрешить трафик к и от порта UDP WireGuard. Если вы не меняли порт в файле /etc/wireguard/wg0.conf
сервера, порт, который вы откроете, – 51820
. Если вы выбрали другой порт при редактировании конфигурации, убедитесь, что замените его в следующей команде UFW.
В случае, если вы забыли открыть порт SSH при выполнении предварительного руководства, добавьте его здесь также:
Примечание: Если вы используете другой брандмауэр или настроили свою конфигурацию UFW, вам может потребоваться добавить дополнительные правила брандмауэра. Например, если вы решите направлять весь сетевой трафик через VPN-соединение, вам нужно будет убедиться, что трафик через порт 53
разрешен для DNS-запросов, а также порты 80
и 443
для HTTP и HTTPS-трафика соответственно. Если вы используете другие протоколы через VPN, вам также придется добавить для них правила.
После добавления этих правил отключите и снова включите UFW, чтобы перезапустить его и загрузить изменения из всех файлов, которые вы изменили:
Вы можете подтвердить, что правила установлены, запустив команду ufw status
. Выполните ее, и вы должны получить вывод, подобный следующему:
OutputStatus: 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
:
Обратите внимание, что команда указывает имя туннеля wg0
как часть имени службы. Это имя соответствует конфигурационному файлу /etc/wireguard/wg0.conf
. Этот подход к именованию означает, что вы можете создать столько отдельных VPN-туннелей, сколько захотите, используя ваш сервер.
Например, у вас может быть устройство туннеля с именем prod
, и его конфигурационный файл будет находиться по пути /etc/wireguard/prod.conf
. Каждая конфигурация туннеля может содержать различные настройки IPv4, IPv6 и клиентского брандмауэра. Таким образом, вы можете поддерживать несколько различных соединений с пирами, каждое из которых имеет свои собственные уникальные IP-адреса и правила маршрутизации.
Теперь запустите службу:
Убедитесь, что служба WireGuard активна с помощью следующей команды. Вы должны увидеть active (running)
в выводе:
Output● [email protected] - WireGuard via wg-quick(8) for wg0
Loaded: loaded (/lib/systemd/system/[email protected]; 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-quick
.
Вы можете добавить столько сверстников, сколько захотите, в свою VPN, сгенерировав ключевую пару и конфигурацию, выполнив следующие шаги. Если вы добавляете несколько сверстников в VPN, убедитесь в том, что вы отслеживаете их частные IP-адреса, чтобы предотвратить коллизии.
Для настройки сверстника WireGuard убедитесь, что у вас установлен пакет WireGuard, используя следующие команды apt
. На сверстнике WireGuard выполните:
Создание ключевой пары для сверстника WireGuard
Затем вам потребуется сгенерировать ключевую пару на сверстнике, используя те же шаги, что и на сервере. С вашего локального компьютера или удаленного сервера, который будет служить сверстником, перейдите и создайте приватный ключ для сверстника с помощью следующих команд:
Снова вы получите однострочный вывод, закодированный с помощью base64
, который представляет собой приватный ключ. Копия вывода также сохраняется в /etc/wireguard/private.key
. Тщательно запишите приватный ключ, который выводится, поскольку вам понадобится добавить его в файл конфигурации WireGuard позже в этом разделе.
Затем используйте следующую команду для создания файла с публичным ключом:
Снова вы получите однострочный вывод, закодированный с помощью base64
, который представляет собой публичный ключ для вашего сверстника WireGuard. Скопируйте его куда-нибудь для ссылки, поскольку вам нужно будет распространить публичный ключ на сервер WireGuard, чтобы установить зашифрованное соединение.
Создание файла конфигурации пира WireGuard
Теперь, когда у вас есть пара ключей, вы можете создать файл конфигурации для пира, который содержит всю необходимую информацию для установки соединения с сервером WireGuard.
Вам понадобится несколько элементов информации для файла конфигурации:
-
Закодированный в base64 закрытый ключ, который вы сгенерировали на пире.
-
Диапазоны IPv4 и IPv6 адресов, которые вы определили на сервере WireGuard.
-
Закодированный в base64 открытый ключ с сервера WireGuard.
-
Публичный IP-адрес и номер порта сервера WireGuard. Обычно это будет IPv4-адрес, но если у вашего сервера есть IPv6-адрес и ваш клиентский компьютер имеет IPv6-подключение к Интернету, вы можете использовать это вместо IPv4.
Со всей этой информацией в руках откройте новый файл /etc/wireguard/wg0.conf
на машине WireGuard Peer с помощью nano
или вашего предпочтительного редактора:
Добавьте следующие строки в файл, заменив различные данные в выделенных разделах по необходимости:
/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-адреса сервера. Удобнее всего распределять IP-адреса, увеличивая их на 1 при добавлении каждого пира.
Точно так же обратите внимание, как вторая строка 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
:
Вы получите вывод вроде следующего:
Outputdefault via 203.0.113.1 dev eth0 proto static
Обратите внимание на выделенный IP-адрес шлюза 203.0.113.1
для последующего использования, а также устройство eth0
. Ваше имя устройства может отличаться. Если это так, замените его на eth0
в следующих командах.
Затем найдите публичный IP-адрес для системы, выполнив команду ip address show
:
Вы получите вывод, подобный следующему:
Outputeth0 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.
Теперь откройте файл Peer WireGuard /etc/wireguard/wg0.conf
с помощью nano
или вашего предпочтительного редактора.
Перед строкой [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-адрес соответствует общедоступному 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 в Шаге 4 — Настройка сетевой конфигурации сервера WireGuard и Шаге 5 — Настройка брандмауэра сервера WireGuard.
(Опционально) Настройка DNS-резольверов пира WireGuard
Если вы используете сервер WireGuard в качестве VPN-шлюза для всего трафика своих сверстников, вам нужно добавить строку в разделе [Interface]
, которая указывает DNS-серверы. Если вы не добавите этот параметр, то ваши запросы DNS могут не быть защищены VPN или могут быть раскрыты вашему интернет-провайдеру или другим третьим лицам.
Если вы используете WireGuard только для доступа к ресурсам в сети VPN или в конфигурации peer-to-peer, вы можете пропустить этот раздел.
Чтобы добавить DNS-серверы в конфигурацию своего сверстника, сначала определите, какие DNS-серверы использует ваш сервер WireGuard. Выполните следующую команду на сервере WireGuard, заменив имя вашего сетевого устройства Ethernet на eth0
, если оно отличается от этого примера:
Вы получите вывод подобный следующему:
OutputLink 2 (eth0): 67.207.67.2 67.207.67.3 2001:4860:4860::8844 2001:4860:4860::8888
IP-адреса, которые выводятся, являются DNS-разрешителями, которые использует сервер. Вы можете выбрать использовать любой или все из них, или только IPv4 или IPv6 в зависимости от ваших потребностей. Запишите разрешители, которые вы будете использовать.
Затем вам нужно добавить выбранные разрешители в файл конфигурации сверстника WireGuard. Вернитесь к сверстнику WireGuard, откройте файл /etc/wireguard/wg0.conf
с помощью nano
или вашего предпочтительного редактора:
Перед строкой [Peer]
добавьте следующее:
DNS = 67.207.67.2 2001:4860:4860::8844
[Peer]
. . .
Опять же, в зависимости от вашего предпочтения или требований к IPv4 и IPv6, вы можете отредактировать список в соответствии с вашими потребностями.
Как только вы подключитесь к VPN на следующем шаге, вы можете проверить, отправляете ли вы DNS-запросы через VPN, используя сайт, например, DNS leak test.com.
Вы также можете проверить, использует ли ваш пир настроенные резольверы с помощью команды resolvectl dns
, как вы делали на сервере. Вы должны получить вывод, подобный следующему, показывающему DNS-резольверы, которые вы настроили для туннеля VPN:
OutputGlobal: 67.207.67.2 67.207.67.3
. . .
Со всеми этими настройками DNS-резольвера теперь вы готовы добавить открытый ключ пира на сервер и затем запустить туннель WireGuard на пире.
Шаг 8 — Добавление открытого ключа пира на сервер WireGuard
Прежде чем подключить пира к серверу, важно добавить открытый ключ пира на сервер WireGuard. Этот шаг гарантирует, что вы сможете подключаться к VPN и маршрутизировать трафик через него. Без выполнения этого шага сервер WireGuard не позволит пиру отправлять или получать любой трафик по туннелю.
Убедитесь, что у вас есть копия открытого ключа WireGuard Peer в формате base64
, запустив:
OutputPeURxj4Q75RaVhBKkRTpNsBPiPSGb5oQijgJsTa29hg=
Теперь выполните вход на сервере WireGuard и выполните следующую команду:
Обратите внимание, что часть allowed-ips
команды принимает список IPv4 и IPv6 адресов, разделенных запятыми. Вы можете указать отдельные IP-адреса, если хотите ограничить IP-адрес, который может назначить себе пир, или диапазон, как в примере, если ваши пиры могут использовать любой IP-адрес в диапазоне VPN. Также обратите внимание, что ни у двух пиров не может быть одинаковой настройки allowed-ips
.
Если вы хотите обновить allowed-ips
для существующего пира, вы можете выполнить ту же команду снова, но изменить IP-адреса. Поддерживаются несколько IP-адресов. Например, чтобы изменить WireGuard Peer, который вы только что добавили, чтобы добавить IP-адрес, как 10.8.0.100
к существующим IP-адресам 10.8.0.2
и fd24:609a:6c18::2
, вы бы выполнили следующее:
После того как вы выполнили команду по добавлению пира, проверьте состояние туннеля на сервере, используя команду wg
:
Outputinterface: 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 Peer к туннелю
Теперь, когда ваш сервер и пир настроены для поддержки вашего выбора IPv4, IPv6, пересылки пакетов и разрешения DNS, пришло время подключить пира к VPN-туннелю.
Поскольку вы можете захотеть включить VPN только для определенных случаев использования, мы будем использовать команду wg-quick
, чтобы установить соединение вручную. Если вы хотите автоматизировать запуск туннеля, как вы делали на сервере, выполните эти шаги в разделе Шаг 6 — Запуск сервера WireGuard вместо использования команды wg-quick
.
Если вы маршрутизируете весь трафик через VPN и настроили пересылку DNS, вам нужно установить утилиту resolvconf
на пире WireGuard, прежде чем запустить туннель. Выполните следующую команду, чтобы настроить это:
Чтобы запустить туннель, выполните следующее на пире WireGuard:
Вы получите вывод, подобный следующему:
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
:
Outputinterface: 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 в качестве шлюза для всего интернет-трафика, проверьте, какой интерфейс будет использоваться для трафика, направленного к DNS-ресолверам CloudFlare 1.1.1.1
и 2606:4700:4700::1111
.
Если вы используете WireGuard только для доступа к ресурсам на VPN, замените эти команды действительным IPv4- или IPv6-адресом, таким как сам шлюз. Например 10.8.0.1
или fd24:609a:6c18::1
.
Output1.1.1.1 dev wg0 table 51820 src 10.8.0.2 uid 1000
cache
Обратите внимание на устройство wg0
, используемое, и IPv4-адрес 10.8.0.2
, который вы назначили для коллеги. Аналогично, если вы используете IPv6, выполните следующее:
Output2606:4700:4700::1111 from :: dev wg0 table 51820 src fd24:609a:6c18::2 metric 1024 pref medium
Снова обратите внимание на интерфейс wg0
и IPv6-адрес fd24:609a:6c18::2
, который вы назначили для коллеги.
Если у вашего коллеги установлен браузер, вы также можете посетить ipleak.net и ipv6-test.com, чтобы подтвердить, что ваш коллега направляет свой трафик через VPN.
Когда вы будете готовы отключиться от VPN на коллеге, используйте команду wg-quick
:
Вы получите вывод подобный следующему, указывающий на то, что туннель 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, выполните следующую команду, обязательно заменив правильным открытым ключом для узла, который вы хотите удалить:
Обычно вам потребуется удалить конфигурацию узла только в случае, если узел больше не существует или если его ключи шифрования скомпрометированы или изменены. В противном случае лучше оставить конфигурацию на месте, чтобы узел мог повторно подключиться к VPN без необходимости добавлять его ключ и allowed-ips
каждый раз.
Вывод
В этом учебном пособии вы установили пакет и инструменты WireGuard как на сервере, так и на клиентских системах Ubuntu 22.04. Вы настроили правила брандмауэра для WireGuard и настроили параметры ядра для разрешения пересылки пакетов с помощью команды sysctl
на сервере. Вы узнали, как создавать частные и открытые ключи шифрования WireGuard и как настраивать сервер и узел (или узлы) для подключения друг к другу.
Если ваша сеть использует IPv6, вы также узнали, как создать уникальный локальный диапазон адресов для использования с подключениями узлов. Наконец, вы узнали, как ограничить трафик, который должен проходить через VPN, ограничив сетевые префиксы, которые может использовать узел, а также как использовать сервер WireGuard в качестве VPN-шлюза для обработки всего интернет-трафика для узлов.
Если вы хотите узнать больше о WireGuard, включая настройку более продвинутых туннелей или использование WireGuard с контейнерами, посетите официальную документацию WireGuard.
Source:
https://www.digitalocean.com/community/tutorials/how-to-set-up-wireguard-on-ubuntu-22-04