Главная
» LINUX
»
Как настроить VPN-сервер WireGuard Point-to-Site на Debian 12
Как настроить VPN-сервер WireGuard Point-to-Site на Debian 12
VPN-соединение WireGuard типа «точка-сайт» на Debian 12 (Bookworm) — это практичный способ обеспечить доступ ноутбуков, телефонов или удаленных рабочих станций к серверу или маршрутизацию трафика через него. Важно отметить, что WireGuard не имеет специального «серверного режима». Каждый участник является равноправным партнером. В конфигурации «точка-сайт» один хост Debian просто выступает в качестве стабильного, общедоступного хаба, а каждое удаленное устройство получает свою собственную пару ключей и адрес туннеля.
В этом руководстве используются встроенные в Debian инструменты WireGuard, wg-quickпереадресация IPv4 и nftables. Предполагается, что сервер Debian имеет права root или sudo и что UDP-порт 51820доступен. Если сервер находится за домашним или офисным маршрутизатором, необходимо перенаправить этот UDP-порт на хост Debian. Если интернет-провайдер использует NAT операторского класса (CGNAT), обычной переадресации портов маршрутизатора может быть недостаточно; перед устранением неполадок WireGuard убедитесь, что у вас действительно есть доступный публичный адрес.
Что даст эта конфигурация?
В примере VPN используется 10.8.0.0/24. Сервером является 10.8.0.1, а первым клиентом — 10.8.0.2. Клиент может быть настроен либо как полнотуннельный VPN, где интернет-трафик IPv4 выходит через сервер Debian, либо как разделенный туннель, где WireGuard используется только в выбранных частных сетях.
Распространенное заблуждение заключается в том, что Debian 12 требует наличия модуля WireGuard, не входящего в основную ветку ядра. Это не так. WireGuard уже много лет присутствует в ядре Linux; пакеты Debian предоставляют необходимые инструменты управления пользовательским пространством. Рекомендация: используйте пакеты Debian вместо загрузки непроверенного установочного скрипта.
Перед созданием конфигурации туннеля установите WireGuard и nftables из репозиториев пакетов Debian.
Шаг 2: Сгенерируйте пару ключей сервера.
Создайте ключевые файлы с ограниченными правами доступа:
sudo -i
install -d -m 700 /etc/wireguard
umask 077
wg genkey | tee /etc/wireguard/server_private.key | wg pubkey > /etc/wireguard/server_public.key
chmod 600 /etc/wireguard/server_private.key
cat /etc/wireguard/server_public.key
Закрытый ключ должен оставаться закрытым. Открытый ключ — это то, что вы копируете в конфигурации клиента. В идеале, закрытый ключ каждого клиента следует генерировать на самом клиенте, а не на сервере. Таким образом, серверу никогда не потребуется хранить закрытые ключи клиентов.
Сгенерируйте закрытый ключ WireGuard для сервера Debian и получите его открытый ключ, используя ограниченные права доступа к файлам.
Шаг 3: Включите переадресацию IPv4.
VPN-туннель может успешно установиться, даже если маршрутизация трафика по-прежнему завершается с ошибкой. Причина в том, что переадресация IP-пакетов в Linux — это отдельная настройка ядра, не связанная с самим WireGuard. Создайте постоянный файл sysctl:
В итоговой команде должно отобразиться значение net.ipv4.ip_forward = 1. В документации ядра Debian оно описывается ip_forwardкак переключатель, который включает пересылку пакетов IPv4. Действие: проверьте это значение явно, а не предполагайте, что интерфейс туннеля автоматически включает маршрутизацию. См. руководство Debian ip(7) и документацию sysctl.conf .
Включите пересылку IPv4, чтобы Debian мог маршрутизировать пакеты между интерфейсом WireGuard и другими сетями.
Шаг 4: Создание конфигурации сервера
Прочитайте закрытый ключ сервера, затем создайте /etc/wireguard/wg0.conf:
AllowedIPsЧасто ошибочно считают просто списком разрешенных адресов в стиле брандмауэра. Он также управляет маршрутизацией. На сервере назначение адреса 10.8.0.2/32этому узлу сообщает WireGuard, что пакеты для этого конкретного адреса туннеля принадлежат этому клиенту. Каждому клиенту следует присвоить уникальный адрес и отдельный [Peer]блок.
Ещё один полезный вариант — опустить этот параметр, SaveConfig = trueесли вы планируете управлять этим файлом вручную. В этом случае SaveConfigможно wg-quickзаписывать текущее состояние обратно в конфигурацию при завершении работы, что может перезаписать изменения, внесённые вручную. Действие: оставляйте файл декларативным, если только вы специально не хотите сохранять текущее состояние.
Создайте на стороне сервера файл wg0.conf, указав адрес туннеля, порт прослушивания UDP, закрытый ключ сервера и одного клиента.
Шаг 5: Настройка маскировки nftables
Если клиентам, использующим полнотуннельный доступ, необходимо получить доступ к Интернету через сервер Debian, проще всего использовать маскировку IPv4. Сначала определите исходящий интерфейс сервера:
ip route get 1.1.1.1
Ищите интерфейс после dev, например eth0, ens3, или enp1s0. Не следует предполагать, что это всегда eth0.
Если вы уже используете этот /etc/nftables.confфайл, вместо замены файла объедините следующую таблицу NAT с существующим набором правил:
table ip wireguard-nat {
chain postrouting {
type nat hook postrouting priority 100; policy accept;
oifname "eth0" ip saddr 10.8.0.0/24 masquerade
}
}
Замените eth0на фактический исходящий интерфейс. Перед загрузкой выполните проверку:
NAT не является обязательным требованием для WireGuard. Если в целевой локальной сети уже есть обратный маршрут 10.8.0.0/24, маршрутизация доступа может работать без маскировки. NAT удобен в основном тогда, когда вы хотите, чтобы удаленные клиенты использовали существующий интернет-маршрут сервера, и вы не контролируете обратные маршруты в других местах. Действие: используйте маскировку в простом случае исходящего трафика из интернета; предпочтительнее явная маршрутизация, когда вы контролируете сеть и хотите сохранить исходные адреса.
Добавьте отдельное правило NAT в nftables для сети 10.8.0.0/24 и проверьте набор правил, прежде чем включать его.
Вам также нужны правила брандмауэра?
Это зависит от уже установленного брандмауэра. Если ваша политика входящего трафика nftables является ограничительной, разрешите входящий UDP-трафик 51820. Если ваша цепочка пересылки имеет политику отбрасывания по умолчанию, добавьте туда правила, разрешающие трафик от источника wg0к месту назначения и разрешающие установленный обратный трафик. У облачных VPS-провайдеров также может быть отдельная группа безопасности или брандмауэр провайдера, который должен разрешать UDP-трафик 51820.
Не следует бездумно вставлять совершенно новый набор правил брандмауэра по умолчанию на удаленный SSH-сервер. Это может привести к блокировке доступа. Действие: проверьте sudo nft list rulesetи интегрируйте WireGuard в уже имеющийся у вас брандмауэр.
Шаг 6: Создание профиля клиента
На стороне клиента сгенерируйте собственную пару ключей с помощью приложения WireGuard или wg genkey. Профиль IPv4 для полного туннелирования выглядит следующим образом:
Замените vpn.example.comна общедоступное DNS-имя или общедоступный IP-адрес сервера. Эта DNSстрока необязательна, и поддержка реализации на стороне клиента может различаться. Для разделенного туннеля измените значение AllowedIPsтак, чтобы через VPN проходили только те сети, которые должны проходить, например, 10.8.0.0/24плюс частная локальная сеть, такая как 192.168.50.0/24.
PersistentKeepalive = 25Также это необязательно. В официальной документации WireGuard рекомендуется значение 25 секунд в качестве разумного параметра, если узлу за NAT или межсетевым экраном с отслеживанием состояния необходимо сохранять сопоставление в периоды простоя. Это не параметр производительности и не является обязательным для каждого клиента. Действие: используйте его в основном для роуминговых или NAT-подключенных клиентов, которые в противном случае становятся недоступными после простоя.
Настройте клиент, указав собственный закрытый ключ, открытый ключ сервера, конечную точку, политику маршрутизации и, при необходимости, функцию поддержания соединения (keepalive).
Шаг 7: Запустите WireGuard при загрузке системы.
Сначала запустите nftables, затем включите интерфейс WireGuard:
wg-quick@wg0В /etc/wireguard/wg0.confруководстве wg-quickподтверждается, что это соглашение об именовании является обычным сокращением для конфигураций, хранящихся в папке /etc/wireguard. Действие: используйте службу, а не пользовательский сценарий загрузки, если у вас нет более сложной архитектуры сетевого менеджера.
Включите nftables и службу systemd wg-quick@wg0, чтобы VPN автоматически восстанавливался после перезагрузки.
Шаг 8: Проверка подтверждения соединения и обмена данными.
Подключите клиент, затем проверьте сервер:
sudo wg show
ip address show wg0
ping -c 3 10.8.0.2
Как правило, работоспособный узел после прохождения трафика через туннель отображает недавнее рукопожатие и ненулевые счетчики передачи. Если вы настроили полный туннель, проверьте публичный IPv4-адрес клиента с помощью доверенной службы проверки IP-адресов; он должен совпадать с исходящим адресом сервера Debian.
Убедитесь, что у партнера произошло недавнее рукопожатие WireGuard, счетчики передач увеличиваются, и адрес клиентского туннеля отвечает.
Распространенные проблемы и что они на самом деле означают.
Убедитесь, что UDP-сообщение 51820 достигает хоста Debian, и перепроверьте оба открытых ключа.
Установление соединения работает, но интернета нет.
Отсутствует переадресация IPv4, правила переадресации брандмауэра или NAT.
Проверьте sysctl net.ipv4.ip_forward, nft list ruleset, и имя исходящего интерфейса.
Можно подключиться к 10.8.0.1, но не к частной локальной сети.
У клиента отсутствует маршрут по локальной сети, или у локальной сети отсутствует обратный маршрут.
Добавьте подсеть локальной сети к клиентскому приложению AllowedIPsи настройте маршрутизацию или NAT соответствующим образом.
Некоторые сайты зависают
Возможная проблема с path-MTU
Перед тем как принудительно устанавливать MTU, протестируйте его с пакетами меньшего размера. wg-quickMTU может быть выбран автоматически, поэтому не устанавливайте значение 1420 только потому, что так указано в другом руководстве.
IPv4 использует VPN, а IPv6 — нет.
Маршруты, доступные только для профиля0.0.0.0/0
Настройте IPv6 также через WireGuard или намеренно отключите/заблокируйте IPv6 для клиентов, если необходимо избежать утечки IPv6.
Полнопролетный или раздвоенный туннель: что выбрать?
Используйте полный туннель, если цель — защитить трафик в ненадежных сетях Wi-Fi или обеспечить выход интернет-трафика с сервера Debian. Используйте разделенный туннель, если вам нужен только удаленный доступ к серверу, домашней сети, лаборатории или внутреннему приложению, и вы хотите, чтобы обычный интернет-трафик оставался локальным. Выбор в основном зависит от настроек клиента AllowedIPs.
Для небольшого развертывания типа «точка-сайт» приведенной выше конфигурации достаточно для создания поддерживаемой базовой конфигурации: один блок пиров на клиента, уникальные адреса туннелей, управляемые Debian сервисы и nftables для маршрутизации, которая вам действительно необходима. Для более крупных развертываний распределение ключей, жизненный цикл пиров, DNS, ведение журналов и управление конфигурацией становятся операционными проблемами, даже несмотря на то, что сам протокол WireGuard остается простым.
Контрольный список окончательной проверки
wg-quick@wg0активен и wg0имеет 10.8.0.1/24.
Сервер прослушивает UDP-трафик 51820, и этот порт доступен через любой вышестоящий брандмауэр или маршрутизатор.
У каждого клиента своя пара ключей и уникальная /32запись на сервере.
net.ipv4.ip_forwardравнозначно, 1когда требуется маршрутизированный доступ.
Функция маскировки nftables присутствует для доступа к Интернету через полнотуннельное соединение, если вы намеренно не используете вместо этого маршрутизированные обратные пути.
wg showОтображает недавнее рукопожатие после отправки клиентом трафика.
Проект клиента AllowedIPsсоответствует предполагаемой конструкции туннеля полного или разделенного типа.
Эти шаги предназначены для Debian 12 и стандартных инструментов WireGuard, доступных в Debian. Топология сети, NAT в вышестоящем узле, облачные брандмауэры, маршрутизация в частной локальной сети и политика IPv6 являются специфичными для каждой среды, поэтому эти параметры нельзя определить только на основе конфигурации WireGuard. Проверяйте каждый параметр отдельно, а не рассматривайте каждую проблему с подключением как сбой WireGuard.