Как настроить VPS как exit node в Tailscale
Настройте свой VPS как exit node в Tailscale для безопасного интернет-трафика. В руководстве описаны установка, включение IP forwarding, настройка маршрутов и исправление DNS.
Что делает exit node в Tailscale
Exit node в Tailscale — это устройство в вашей сети tailnet, которое перенаправляет весь интернет-трафик других ваших устройств. VPS (виртуальный выделенный сервер) отлично подходит для этой роли, так как он имеет постоянный публичный IP-адрес и работает непрерывно. Настройка состоит из пяти шагов: установка Tailscale на сервер, объявление (advertise) узла в качестве exit node, включение IP forwarding, одобрение маршрута в панели управления и выбор этого узла на вашем ноутбуке. Четвертый шаг выполняется переключателем на веб-странице, а не командой, и именно на этом этапе у большинства пользователей возникают сложности.
После активации ваш ноутбук шифрует каждый пакет и отправляет его на VPS. VPS применяет source NAT (трансляцию сетевых адресов) и отправляет пакет дальше, используя свой публичный IP-адрес. Веб-сайты видят только VPS. Wi-Fi в кафе видит лишь один зашифрованный UDP-поток к VPS и ничего более.
Tailscale использует WireGuard для передачи данных, а также координационный сервер, который распределяет ключи и помогает устройствам находить друг друга через NAT. Благодаря этому координационному серверу нет необходимости вручную копировать ключи. Чтобы подробно ознакомиться с компромиссами, прочитайте сравнение Tailscale и обычного WireGuard. Если вы предпочитаете полностью контролировать все компоненты туннеля самостоятельно, разверните собственный VPN на базе WireGuard на своем VPS.
Приведенные ниже шаги предполагают, что Tailscale уже установлен на вашем ноутбуке и оба устройства авторизованы в одной сети tailnet. Tailnet — это ваша частная сеть Tailscale, в которой каждое устройство получает стабильный адрес внутри 100.64.0.0/10.
Установка Tailscale на ваш VPS
curl -fsSL https://tailscale.com/install.sh | sh
sudo tailscale upСкрипт установки выбирает репозиторий пакетов для вашего дистрибутива и устанавливает демон tailscaled. Затем tailscale up выводит URL для аутентификации. Откройте его в браузере и войдите под той же учетной записью, которую использует ваш ноутбук, так как VPS, подключенный к другой tailnet, не сможет обслуживать ваш ноутбук.
tailscale status
tailscale ip -4tailscale status теперь должен отображать обе машины. tailscale ip -4 выводит адрес VPS в tailnet, который вы позже передадите клиенту.
Для создания туннеля Tailscale требуется устройство TUN. На VPS с виртуализацией KVM это устройство присутствует. На тарифах с контейнерной виртуализацией, использующих общее ядро хоста, /dev/net/tun иногда отсутствует, и tailscaled не может создать интерфейс tailscale0. Запустите ls -l /dev/net/tun, прежде чем продолжать.
Включите IP forwarding, иначе VPS будет отбрасывать все пакеты
Машина на базе Linux отбрасывает любой пакет, который не адресован ей самой, поскольку значение net.ipv4.ip_forward по умолчанию равно 0. Выходной узел (exit node) примет ваш трафик, расшифрует его, а затем отбросит. Запишите этот параметр в файл, чтобы он сохранялся после перезагрузки.
echo 'net.ipv4.ip_forward = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-tailscale.conf
sudo sysctl -p /etc/sysctl.d/99-tailscale.conftee -a добавляет данные в конец файла, поэтому повторный запуск этих строк запишет оба параметра дважды. Результат по-прежнему будет работать, но cat /etc/sysctl.d/99-tailscale.conf будет выглядеть странно. Проверяйте текущее значение вместо того, чтобы доверять файлу:
sysctl net.ipv4.ip_forwardКоманда должна вывести net.ipv4.ip_forward = 1. Если вы пропустите этот шаг и воспользуетесь tailscale up --advertise-exit-node, клиент сообщит вам следующее:
Warning: IP forwarding is disabled, subnet routing/exit nodes will not work.tailscale set --advertise-exit-node не выполняет эту проверку, поэтому отсутствие сообщений от set не является доказательством того, что пересылка включена. Проверяйте значение sysctl самостоятельно.
Вам не нужно вручную создавать правило маскарадинга (masquerade). tailscaled устанавливает собственные цепочки правил межсетевого экрана с именами ts-input, ts-forward и ts-postrouting, а правило NAT для трафика выходного узла находится в ts-postrouting. Просмотрите их с помощью sudo iptables-save | grep ts- или sudo nft list ruleset, если используется nftables.
Объявление VPS в качестве выходного узла
sudo tailscale set --advertise-exit-nodetailscale set изменяет одну настройку, не затрагивая остальные. tailscale up --advertise-exit-node также объявляет узел, но имеет побочный эффект: up воспринимает флаги в командной строке как полный набор нестандартных параметров, поэтому последующий вызов sudo tailscale up без аргументов завершается с ошибкой и выводит сообщение:
changing settings via 'tailscale up' requires mentioning all
non-default flags. To proceed, either re-run your command with --reset or
use the command below to explicitly mention the current value of
all non-default settings:Используйте set для внесения постоянных изменений, чтобы избежать появления этого сообщения.
Объявление — это лишь предложение. Теперь VPS сообщает координационному серверу о готовности стать выходным узлом. Ни один клиент пока не может его использовать.
Активация exit node в консоли администратора Tailscale
Этот этап не требует выполнения команд. Откройте страницу Machines в консоли администратора, найдите ваш VPS, нажмите на меню из трех точек в конце строки, выберите Edit route settings и активируйте опцию Use as exit node.
Пока этот переключатель выключен, сервер управления удерживает предложение и не передает его другим узлам. Команда tailscale exit-node list на вашем ноутбуке ничего не покажет, а трафик продолжит идти по стандартному маршруту. Сообщения об ошибках на устройствах отсутствуют. Exit node просто не появляется в списке.
Вы можете автоматически одобрять exit node с помощью записи в файле политик tailnet:
"autoApprovers": {
"exitNode": ["tag:exit"],
}Устройство, запущенное с флагом --advertise-tags=tag:exit, будет одобрено автоматически, если тег tag:exit указан в разделе tagOwners того же файла политик. Использование тегов меняет владельца: устройство с тегом принадлежит tailnet, а не вашей учетной записи, что меняет применяемые к нему правила доступа. Для одного VPS использование переключателя в консоли — более простой вариант.
Выбор выходного узла на ноутбуке
На клиенте Linux:
tailscale exit-node list
sudo tailscale set --exit-node=vps.your-tailnet.ts.netexit-node list выводит список одобренных выходных узлов в вашей tailnet с их адресами. Пустой список означает, что этап одобрения не был выполнен. В macOS, Windows, iOS и Android этот же выбор доступен в меню Exit Node в приложении Tailscale.
Проверьте настройки с клиента, а не с сервера:
curl -4 https://ifconfig.meВыполните эту команду один раз до выбора выходного узла и один раз после. Адрес должен измениться с вашего локального на публичный IP-адрес VPS. Чтобы прекратить использование выходного узла:
sudo tailscale set --exit-node=Еще один флаг важен при первом запуске. Когда выбран выходной узел, клиент направляет весь трафик в туннель, включая пакеты, адресованные в 192.168.1.50, из-за чего ваш принтер и сетевое хранилище перестают отвечать. Чтобы оставить локальную сеть в локальной маршрутизации:
sudo tailscale set --exit-node=<name> --exit-node-allow-lan-access=trueПочему при включении exit node меняются настройки DNS
По умолчанию устройство, использующее exit node, также применяет эту exit node в качестве DNS-резолвера для всех доменов. Это переопределяет глобальные и раздельные (split) DNS-серверы, настроенные для вашей tailnet. Такое поведение является намеренным. Если бы запросы продолжали отправляться локальному резолверу, роутер в кафе видел бы имена всех посещаемых вами сайтов, даже если сам трафик был бы зашифрован. Имена и пакеты должны выходить из одной точки.
Одно из следствий этого затрагивает пользователей внутренних резолверов: nameserver вашей tailnet, от которого вы зависите, перестает использоваться при включенной exit node. Чтобы вернуть его, включите опцию Use with exit node для этого nameserver на странице DNS в панели администратора.
Имена MagicDNS продолжают работать, так как клиент Tailscale отвечает на них локально через 100.100.100.100 до того, как запрос попадет на exit node. Проверьте это с помощью dig @100.100.100.100 your-vps.your-tailnet.ts.net или на клиенте с systemd-resolved через resolvectl status, где интерфейс Tailscale указывает 100.100.100.100 в качестве своего DNS-сервера.
Если вы отключите обработку DNS в Tailscale с помощью --accept-dns=false, клиент сохранит резолвер, полученный из локальной сети. Трафик будет передаваться через туннель, а запросы — нет, что приводит к той же утечке DNS, которая характерна для самодельных туннелей WireGuard. Не меняйте --accept-dns без особой необходимости.
IPv6 через выходной узел
Выходной узел анонсирует маршруты по умолчанию как для 0.0.0.0/0, так и для ::/0. Если на VPS нет работающего пути IPv6 в интернет, пакеты IPv6 доходят через туннель и блокируются. Протестируйте VPS перед использованием:
ip -6 addr show
curl -6 https://ifconfig.meОшибка при выполнении запроса означает, что у VPS отсутствует апстрим IPv6. Сайты с поддержкой dual stack обычно всё равно загружаются, так как клиент отказывается от IPv6 и повторяет запрос через IPv4, хотя эта повторная попытка вызывает задержку при первом подключении к каждому сайту. Ресурсы, доступные только по IPv6, останутся недоступными.
Вторая часть проблемы — пересылка пакетов. Параметр net.ipv4.ip_forward = 1 с net.ipv6.conf.all.forwarding, оставленным в значении 0, обеспечивает работающий путь IPv4 и «черную дыру» для IPv6. Пользователь воспринимает это как «некоторые сайты работают медленно», а не как ошибку, которую можно диагностировать. Обе строки должны присутствовать в файле sysctl.
Нужно ли VPS также анонсировать маршруты подсетей?
Выходной узел (exit node) передает весь интернет-трафик. Маршрут подсети передает один частный диапазон, который находится за машиной, анонсирующей его. Это отдельные функции с отдельными подтверждениями, и одна машина может выполнять обе. Ни одна из них не открывает доступ к сервису, запущенному на самой VPS, поэтому, если вам на самом деле нужен HTTPS URL для приложения на этом сервере, serve и funnel — это те функции, которые вам нужны.
sudo tailscale set --advertise-routes=10.0.0.0/24Анонсируйте подсеть, когда VPS использует общую частную сеть с другими серверами, к которым вы хотите обращаться по их частным адресам. Подтвердите это в той же панели Edit route settings, используя соответствующий переключатель. Клиенты на Linux будут игнорировать анонсированный маршрут, пока вы не передадите --accept-routes, что является одним из различий, которые руководство по настройке маршрутизатора подсети описывает в полном объеме.
Выбирайте диапазон внимательно. Анонсированный маршрут является более специфичным, чем маршрут по умолчанию на вашем ноутбуке, поэтому анонсирование 192.168.1.0/24 с VPS перехватывает адреса домашней сети, использующей тот же диапазон, и устройства на вашем столе перестают отвечать. Используйте диапазон, который вы выбрали сами, а не тот, который выбрал для вас ваш домашний маршрутизатор.
Ускорение exit node с помощью UDP GRO forwarding
Начиная с версии Tailscale 1.54 и выше, при использовании ядра Linux 6.2 и новее, можно задействовать механизм receive offload, который повышает пропускную способность для пересылаемого трафика. GRO (generic receive offload) объединяет входящие пакеты до того, как ядро начнет обрабатывать их по отдельности. По состоянию на август 2026 года эта настройка на exit node выполняется вручную.
sudo apt install -y ethtool
NETDEV=$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")
sudo ethtool -K $NETDEV rx-udp-gro-forwarding on rx-gro-list offip -o route get 8.8.8.8 показывает интерфейс, который фактически имеет выход в интернет, поэтому вам не придется выбирать между eth0, ens3 и enp1s0. Проверьте результат с помощью ethtool -k $NETDEV | grep udp-gro-forwarding, значение должно измениться на on. GRO помогает только в том случае, если канал связи исправен, поэтому если после настройки скорость exit node остается низкой, протестируйте сам канал так же, как вы делали бы это для обычного WireGuard туннеля, работающего медленнее, чем позволяет физический канал.
Настройка сбрасывается после перезагрузки. Если система использует networkd-dispatcher, автоматизируйте процесс:
printf '#!/bin/sh\n\nethtool -K %s rx-udp-gro-forwarding on rx-gro-list off \n' "$(ip -o route get 8.8.8.8 | cut -f 5 -d " ")" | sudo tee /etc/networkd-dispatcher/routable.d/50-tailscale
sudo chmod 755 /etc/networkd-dispatcher/routable.d/50-tailscaleСначала убедитесь, что /etc/networkd-dispatcher/routable.d/ существует. Если файл отсутствует, значит, в системе не используется networkd-dispatcher. В этом случае задачу можно решить с помощью небольшого systemd-юнита, который выполняет команду ethtool при загрузке.
Что политика допустимого использования (AUP) вашего провайдера означает для исходящего трафика
Каждый пакет, который клиент отправляет через выходной узел (exit node), покидает сеть с публичным IP-адресом вашего VPS, поэтому ответственность за него несет ваш аккаунт. Жалобы на злоупотребления (abuse reports) будут приходить на ваш адрес: уведомления о нарушении авторских прав, жалобы на сканирование портов. Ознакомьтесь с AUP (политикой допустимого использования) вашего провайдера, прежде чем направлять трафик всей семьи или команды через один сервер, и не открывайте выходной узел для людей, за которых вы не можете поручиться.
Пропускная способность учитывается дважды. Трафик поступает на VPS через туннель, а затем уходит в интернет, и оба направления обычно учитываются в лимите передачи данных по вашему тарифному плану. Видеопоток, просмотренный через выходной узел, потребляет гораздо больше трафика, чем ожидают многие пользователи.
Диапазоны IP-адресов дата-центров также имеют свою репутацию. Некоторые сайты чаще показывают пользователям из таких сетей CAPTCHA, а некоторые стриминговые сервисы блокируют их полностью. Ваша конфигурация не может на это повлиять, так как это свойство блока адресов, принадлежащего вашему провайдеру.
Почему трафик по-прежнему уходит через локальное соединение
Выходной узел анонсирован, но не одобрен. tailscale exit-node list на клиенте не выводит ничего, и ни на одной из машин нет записей об ошибках в логах. Перейдите на страницу Machines и включите опцию Use as exit node.
Клиент не выбрал узел. Одобрение делает узел доступным для tailnet. Выбор узла — это отдельное действие на каждом устройстве. Запустите sudo tailscale set --exit-node=<name> повторно, а затем снова проверьте curl -4 https://ifconfig.me.
Пересылка (forwarding) отключена. Симптом специфичен: tailscale ping <vps> выполняется успешно, туннель явно поднят, но все внешние адреса недоступны по таймауту. sysctl net.ipv4.ip_forward показывает 0. Исправьте файл sysctl, затем выполните sudo sysctl -p /etc/sysctl.d/99-tailscale.conf.
Межсетевой экран отбрасывает пересылаемые пакеты. tailscaled добавляет собственную цепочку ts-forward, и на чистом VPS этого достаточно. На сервере, где уже запущен ufw или Docker, политика FORWARD может быть установлена в DROP, а правила могут иметь приоритет выше, чем у Tailscale. Не пытайтесь угадать причину: запустите sudo iptables -L FORWARD -n -v в момент, когда клиент пытается загрузить страницу, и следите за тем, какие счетчики увеличиваются. На системе с ufw стандартным решением является DEFAULT_FORWARD_POLICY="ACCEPT" в файле /etc/default/ufw с последующим sudo ufw reload. Также проверьте сетевой экран в панели управления вашего провайдера, так как это отдельный уровень контроля, не зависящий от настроек внутри сервера.
Соединение работает, но медленно. Запустите tailscale netcheck на обеих машинах. Если утилита сообщает, что UDP заблокирован, устройства не могут установить прямой путь и переключаются на ретранслятор DERP, что увеличивает задержку для каждого соединения. Разрешение входящего UDP-трафика на порт 41641 для VPS в сетевом экране провайдера обычно восстанавливает прямое соединение.
Когда стоит отказаться от координационного сервера Tailscale
Всё описанное выше зависит от размещённого сервера координации Tailscale: он используется для обмена ключами и подтверждения, которое вы нажали. Трафик по-прежнему идёт напрямую с ноутбука на VPS, а сервер координации его не передаёт. Однако он определяет, кто может присоединиться к tailnet и к каким устройствам может получить доступ. Цена редко становится причиной для перехода, поскольку бесплатный план рассчитан на шесть пользователей с неограниченным числом принадлежащих им устройств. Поэтому оценивайте саму зависимость, а не стоимость. Седьмой пользователь меняет ситуацию. Tailscale взимает плату с пользователя, а не с устройства, поэтому до принятия решения по финансовым причинам рассчитайте сколько на самом деле платит семья или команда из пяти человек. Объективная оценка требует понимать, к каким ресурсам фактически может получить доступ скомпрометированный сервер координации или украденная учётная запись. Это описано в разделе о модели доверия Tailscale. Если вы хотите устранить эту зависимость, разверните Headscale как собственный сервер управления Tailscale и укажите его на обоих клиентах. После этого действия с exit node остаются прежними. Подтверждение маршрута выполняется через командную строку Headscale, а не через размещённую консоль. Headscale заменяет плоскость управления, но позволяет использовать клиенты Tailscale. Если вы хотите самостоятельно обслуживать весь стек, NetBird поставляется с собственным сервером координации и клиентами, которые можно разместить на одном VPS.
FAQ
Почему мой трафик всё ещё использует локальное соединение после выбора exit node?
Есть две частые причины. Exit node была анонсирована, но не одобрена: откройте страницу Machines в панели администратора, найдите VPS, выберите Edit route settings и включите Use as exit node. Одобрение выполняется только переключателем в консоли, команды на сервере для этого нет. Вторая причина выглядит иначе: IP forwarding выключен, поэтому туннель поднимается, tailscale ping до VPS работает, а все внешние адреса недоступны по таймауту. Проверьте значение через sysctl net.ipv4.ip_forward, оно должно быть равно 1.
Нужно ли каждый раз одобрять exit node вручную?
Этот переключатель настраивается один раз для каждой машины. Если вы часто пересоздаете VPS, добавьте блок autoApprovers в файл политики tailnet, содержащий "exitNode": ["tag:exit"], определите tag:exit в разделе tagOwners и запустите узел с помощью --advertise-tags=tag:exit. Устройство с тегом принадлежит tailnet, а не вашей учетной записи, поэтому правила доступа для него также меняются.
Какой DNS-сервер использует мой ноутбук при включенной exit node?
Саму exit node. Устройство, использующее exit node, отправляет все DNS-запросы туда, что переопределяет глобальные и разделенные DNS-серверы, установленные для tailnet. Это предотвращает утечку имен, которые вы запрашиваете, в локальную сеть. Чтобы сохранить применение одного DNS-сервера tailnet, включите опцию Use with exit node для него на странице DNS в панели администратора. Имена MagicDNS по-прежнему разрешаются, так как клиент Tailscale отвечает на них локально по адресу 100.100.100.100.
Может ли один VPS быть одновременно exit node и subnet router?
Да. sudo tailscale set --advertise-exit-node и sudo tailscale set --advertise-routes=10.0.0.0/24 независимы, и для каждой из них есть свой переключатель одобрения в разделе Edit route settings. Для обеих функций на VPS должен быть включен IP forwarding. Избегайте анонсирования диапазона, который совпадает с домашней сетью вашего ноутбука, так как анонсированный маршрут является более специфичным, чем маршрут по умолчанию, и ваши локальные устройства станут недоступны.
Скрывает ли exit node мой трафик от провайдера VPS?
Нет. Туннель заканчивается на VPS, поэтому трафик покидает сервер в том виде, который ожидает получатель, и ваш провайдер передает его в открытом виде везде, где сам сайт не использует шифрование. Exit node переносит точку выхода вашего трафика в интернет из сети, в которой вы находитесь, на арендованный вами сервер. Это скрывает ваш просмотр сайтов от Wi-Fi в кафе и от вашего домашнего провайдера, но при этом показывает ту же активность провайдеру вашего VPS вместе с привязанным именем вашей учетной записи.