Как настроить VPS как exit node в Tailscale
Пошаговое руководство по превращению VPS в выходной узел Tailscale. Разберем включение IP forwarding, настройку маршрутов и устранение проблем с DNS и IPv6 для стабильной работы.
Что делает exit node в Tailscale
Exit node в Tailscale — это устройство в вашей tailnet, которое передает весь интернет-трафик для других ваших устройств. VPS (виртуальный выделенный сервер) хорошо подходит для этой роли, так как он имеет фиксированный публичный адрес и постоянно находится в сети. Настройка состоит из пяти шагов: установка Tailscale на сервер, объявление exit node, включение IP forwarding, одобрение маршрута в панели администратора и выбор узла на вашем ноутбуке. Четвертый шаг выполняется через флажок на веб-странице, а не через команду, и именно на этом этапе у большинства пользователей возникают сложности.
После включения ваш ноутбук шифрует каждый пакет и отправляет его на VPS. VPS применяет source NAT (трансляцию сетевых адресов) и отправляет пакет дальше, используя свой собственный публичный IP-адрес. Веб-сайты видят VPS. Wi-Fi в кафе видит только один зашифрованный UDP-поток к VPS и ничего больше. Без exit node Tailscale передает трафик только между вашими собственными устройствами, и каждый веб-сайт по-прежнему видит ваш реальный адрес. В этом заключается различие, стоящее за вопросом считается ли Tailscale VPN-ом вообще.
Tailscale — это WireGuard для передачи данных плюс координационный сервер, который распределяет ключи и помогает двум машинам найти друг друга через NAT. Этот координационный сервер — причина, по которой ниже не требуется копирование ключей. Чтобы ознакомиться с компромиссами, прочитайте сравнение Tailscale и обычного WireGuard. Если вы предпочитаете полностью контролировать все части туннеля самостоятельно, разверните обычный WireGuard VPN на своем VPS.
Приведенные ниже шаги предполагают, что Tailscale уже запущен на вашем ноутбуке и обе машины авторизованы в одной и той же tailnet. Tailnet — это ваша частная сеть Tailscale, и если администратор не отключил для нее IPv4, каждое устройство в ней получает стабильный адрес внутри 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, у которого теперь должен отображаться значок Exit Node. Откройте меню этого устройства, выберите Edit exit node, установите флажок Use as exit node и нажмите Save.
Пока этот флажок не установлен и настройки не сохранены, control plane удерживает предложение и не передает его никому. Команда tailscale exit-node list на вашем ноутбуке ничего не показывает, а ваш трафик продолжает идти по обычному маршруту. Сообщения об ошибке не появляются ни на одной из машин. Exit node просто не отображается.
Вы можете одобрять exit node автоматически с помощью записи в файле политик tailnet:
"autoApprovers": {
"exitNode": ["tag:exit"],
}Устройство, запущенное с флагом --advertise-tags=tag:exit, одобряется автоматически, если в том же файле политик для tagOwners определен параметр tag:exit. Тегирование меняет владельца: помеченное устройство принадлежит 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-пути наружу. Если вместо этого curl сообщает "Could not resolve host", проблема заключается в разрешении имен, а не в IPv6, поэтому исправьте DNS на VPS и запустите тест снова. Веб-сайты с поддержкой dual stack обычно всё равно загружаются, так как клиенты, реализующие алгоритм Happy Eyeballs (включая curl), параллельно начинают попытку подключения по IPv4, если IPv6-соединение не установилось после короткой задержки, и используют то, которое ответит первым. По умолчанию curl ждет 200 миллисекунд, поэтому ожидание добавляет задержку при установке новых соединений, а не ошибку. Ресурсы, доступные только по 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 находится в одной частной сети с другими серверами, к которым вы хотите обращаться по их частным адресам. Подтвердите это в отдельном диалоговом окне, отличном от окна для exit node: на странице Machines выберите VPS, перейдите в раздел Subnets, выберите Edit, чтобы открыть Edit subnet routes, выберите маршрут и нажмите Save. Клиенты на Linux будут игнорировать анонсированный маршрут, пока вы не передадите --accept-routes, что является одним из различий, подробно описанных в руководстве по настройке маршрутизатора подсетей.
Тщательно выбирайте диапазон. После того как маршрут подтвержден, ноутбук, принимающий его (Windows, macOS, iOS и Android делают это по умолчанию, 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-трафика
Каждый пакет, который клиент отправляет через exit node, выходит в сеть с публичным IP-адресом вашего VPS, поэтому ответственность за него несет ваш аккаунт. Жалобы на злоупотребления, такие как уведомления об авторских правах или сообщения о сканировании портов, будут приходить на ваш адрес. Ознакомьтесь с AUP (политикой допустимого использования) вашего провайдера, прежде чем направлять через сервер трафик всей семьи или команды, и не открывайте доступ к exit node людям, в которых вы не уверены.
Учитывается только исходящий трафик. Каждый байт, проходящий через exit node, пересекает VPS дважды: входит с одной стороны и выходит с другой. В большинстве тарифных планов VPS тарифицируется только исходящая часть. По состоянию на октябрь 2026 года SSD Nodes указывает лимиты для всех KVM-планов как исходящий трафик (от 4TB до 48TB в месяц), а документация Vultr гласит, что входящий трафик не тарифицируется. При скачивании файла тарифицируемым участком является путь от VPS через туннель к вашему ноутбуку. При загрузке файла — путь от VPS в интернет. В любом случае все, что вы пропускаете через exit node, расходует лимит один раз. Видеопоток, просмотренный через exit node, потребляет больше трафика, чем кажется на первый взгляд. Проверьте условия вашего тарифа, так как хостинг-провайдеры, учитывающие трафик в обоих направлениях, посчитают этот поток дважды.
Диапазоны IP-адресов дата-центров также имеют свою репутацию. Некоторые сайты чаще показывают пользователям таких сетей CAPTCHA, а некоторые стриминговые сервисы блокируют их полностью. Никакие изменения в конфигурации не исправят это, так как это свойство блока адресов, принадлежащего вашему провайдеру.
Почему трафик по-прежнему уходит через локальное соединение
Exit node анонсирована, но не одобрена. tailscale exit-node list на клиенте ничего не выводит, и ни на одной из машин нет ошибок в логах. Перейдите на страницу Machines, выберите Edit exit node в меню VPS, установите флажок Use as exit node и нажмите Save.
Клиент не выбрал узел. Одобрение делает узел доступным в 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 или через ретрансляторы DERP от Tailscale, если прямое соединение установить невозможно. Координационный сервер не передает ваш трафик, но определяет, кто может присоединиться к tailnet и к каким ресурсам имеет доступ каждое устройство. Цена редко является причиной для перехода, так как бесплатный тарифный план включает шесть пользователей с неограниченным количеством собственных устройств, поэтому оценивайте саму зависимость, а не стоимость. Ситуация меняется при появлении седьмого пользователя. Поскольку Tailscale взимает плату за пользователя, а не за устройство, рассчитайте сколько на самом деле платят домохозяйство или команда из пяти человек, прежде чем принимать решение на основе затрат. Честная оценка рисков означает понимание того, к чему может получить доступ злоумышленник в случае компрометации координационного сервера или кражи учетной записи, что подробно описано в модели доверия Tailscale. Если вы хотите устранить эту зависимость, запустите Headscale в качестве собственного сервера управления Tailscale и укажите его в настройках обоих клиентов. После этого шаги по настройке exit node останутся прежними, а подтверждение маршрутов будет выполняться через командную строку Headscale вместо веб-консоли. Headscale заменяет плоскость управления, но позволяет использовать клиенты Tailscale. Если же вы предпочитаете полностью контролировать весь стек, NetBird предоставляет собственный координационный сервер и клиенты, которые вы размещаете на одном VPS.
FAQ
Почему мой трафик продолжает использовать локальное подключение после выбора exit node?
Существует две распространенные причины. Exit node была анонсирована, но не одобрена: откройте страницу Machines в консоли администратора, найдите VPS, выберите Edit exit node в меню устройства, установите флажок Use as exit node и нажмите Save. Одобрение выполняется в консоли, ни одна команда на сервере не выполняет это действие. Вторая причина выглядит иначе: 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 независимы, и каждый из них одобряется в своем диалоговом окне: exit node — через Edit exit node в меню устройства на странице Machines, а подсеть — через Edit в разделе Subnets устройства, который открывает Edit subnet routes. Для обоих случаев на VPS должен быть включен IP forwarding. Избегайте анонсирования диапазона, который совпадает с домашней сетью вашего ноутбука, так как после одобрения этого маршрута и его принятия ноутбуком, он может перехватить эти адреса у вашей локальной сети, и ваши локальные устройства станут недоступны.
Скрывает ли exit node мой трафик от провайдера моего VPS?
Нет. Туннель заканчивается на VPS, поэтому трафик покидает сервер в том виде, в котором его ожидает получатель, и ваш провайдер передает его в открытом виде везде, где сам сайт не зашифрован. Exit node перемещает точку выхода вашего трафика в интернет из сети, в которой вы находитесь, на арендованный вами сервер. Это скрывает ваш просмотр сайтов от Wi-Fi в кафе и от вашего домашнего интернет-провайдера, но при этом показывает тот же просмотр провайдеру вашего VPS с привязкой к имени вашей учетной записи.