psj-notes
~/home ~/series ~/archive

Часть 06. Tailscale — VPN-мост до домашнего сервера

01.01.1970 Серия: Руководство по настройке srv02-Helsinki 'tailscale' 'vpn' 'wireguard'

Часть 06. Tailscale — VPN-мост до домашнего сервера

«Есть места, куда можно попасть только по секретному ходу. В нашем случае секретный ход — это WireGuard, а ключ от него выдаёт Tailscale. Построим туннель между Хельсинки и домом.» — Воланд


Глава 1. Что такое Tailscale и зачем он нужен

Tailscale — это mesh VPN на основе протокола WireGuard. В переводе на человеческий: программа, которая соединяет ваши устройства в единую частную сеть, будто они стоят рядом и подключены к одному роутеру.

Как это работает:

  1. WireGuard — современный VPN-протокол, встроенный прямо в ядро Linux. Не нагружает процессор, не требует сложной конфигурации.
  2. Mesh-архитектура — каждое устройство соединяется с каждым напрямую (peer-to-peer). Нет центрального сервера, который решает, кому куда идти.
  3. CGNAT-адреса — каждое устройство получает IP из диапазона 100.x.x.x. Этот диапазон зарезервирован для операторов связи (Carrier-Grade NAT), но Tailscale использует его для своей сети.

Зачем нам это на VDS:

Задача Без Tailscale С Tailscale
Резервное копирование блога на домашний сервер Нужен публичный IP дома или DynDNS + открытые порты scp по 100.х.х.х — никаких открытых портов
Доступ к домашним сервисам с VDS Только если настроен VPN-сервер дома Просто ping 100.х.х.х
Мониторинг домашнего сервера с VDS Сложно, нужен туннель SSH по Tailscale — как локальный

Бегемот, разворачивая чертёж:
«Представьте: два дома. Один — в Хельсинки на облаке, другой — ваш, родной, где-то в Подмосковье. Между ними — интернет, файерволы провайдеров, NAT, угрозы. Tailscale прорывает туннель — прямо из гостиной в серверную. Соседи по этажу ничего не заметят.»


Глава 2. Установка Tailscale на VDS (srv02-Helsinki)

Начнём с удалённого сервера. Tailscale устанавливается через официальный скрипт установки:

curl -fsSL https://tailscale.com/install.sh | sudo sh

Разберём эту команду по частям:

  • curl — утилита для скачивания данных из интернета
  • -f (fail) — не скачивать мусор при HTTP-ошибке (404, 500 и т.д.)
  • -s (silent) — не показывать прогресс-бар
  • -S (show errors) — показывать ошибки, если они есть (без этого -s всё скрывает)
  • -L (location) — следовать за редиректами (если URL перенаправляет)
  • https://tailscale.com/install.sh — официальный установочный скрипт
  • | — символ пайпа (конвейера): вывод curl передаётся дальше
  • sudo sh — запустить полученный скрипт от имени root

Tailscale распознаёт операционную систему (Ubuntu 24.04 LTS), добавляет официальный APT-репозиторий и устанавливает пакет.

Ожидаемый вывод:

# Installing Tailscale ...
# Installing ...
Tailscale is installed.

  ...

tailscale-1.98.9-amd64.deb installed

После установки проверяем версию:

tailscale version

Ожидаемый вывод:

1.98.9
  tailscale commit: 4fb758c39ae5b208b974af14ba6bc896a250394c
  long version: 1.98.9-t4fb758c39-g200941d74
  other commit: 200941d74860e4e5843de3d7d22ef7191fcac6ef
  go version: go1.26.5

Установка завершена. Tailscale пока не активен — только установлен.

Коровьев, протирая монокль:
«Ключ вставлен в замок, но пока не повёрнут. Установить Tailscale — всё равно что положить лопату рядом с ямой. Копать будем в следующей главе.»


Глава 3. Подключение VDS к Tailscale-сети

Tailscale — это не просто программа, а облачная служба. Чтобы сервер попал в вашу частную сеть, его нужно авторизовать — «представить» хозяину.

Для авторизации используется одноразовый ключ (auth key), который генерируется в веб-консоли. Либо, если запустить без ключа, Tailscale покажет ссылку — откроете в браузере и авторизуетесь вручную.

Вариант A — с ключом (удобно для сервера):

sudo tailscale up --auth-key tskey-auth-xxxxxxxxx

Где tskey-auth-xxxxxxxxx — ключ, созданный на странице https://login.tailscale.com/admin/settings/keys.

Вариант B — интерактивная авторизация (подходит, если есть доступ к браузеру):

sudo tailscale up

Ожидаемый вывод:

To authenticate, visit:
    https://login.tailscale.com/a/XXXXXXXXX

Открываете ссылку в браузере на своём компьютере, входите в аккаунт Tailscale (через Google, GitHub или другого провайдера), подтверждаете подключение сервера.

После успешной авторизации терминал покажет:

Success.

Теперь сервер в вашей Tailscale-сети. Проверяем его IP:

tailscale ip -4

Ожидаемый вывод:

100.XX.XX.XX

Этот адрес закреплён за сервером навсегда (пока вы не удалите устройство из консоли). Можно пинговать, слать файлы, подключаться по SSH.

Важно: tailscale up автоматически создаёт systemd-сервис, который запускает Tailscale при старте системы. Ничего дополнительно включать не нужно.

Проверим статус:

sudo systemctl status tailscaled --no-pager | head -10

Ожидаемый вывод:

● tailscaled.service - Tailscale Daemon
     Loaded: loaded (/lib/systemd/system/tailscaled.service; enabled; preset: enabled)
     Active: active (running) since ...

Строка enabled и active (running) — Tailscale будет запускаться автоматически.

Воланд, затягиваясь папиросой:
«Сервер представился, ключ принят, дверь открыта. Отныне у этого дома есть второй адрес — незаметный, но постоянный. Как тайная квартира в неприметном переулке.»


Глава 4. Настройка домашнего сервера (myserver)

Если домашний сервер уже в Tailscale — эту главу можно пропустить. Если нет — повторяем те же шаги, что и для VDS.

Подключаемся к домашнему серверу по SSH и устанавливаем Tailscale:

curl -fsSL https://tailscale.com/install.sh | sudo sh

Ожидаемый вывод:

tailscale-1.98.9-amd64.deb installed

Подключаемся к той же Tailscale-сети (аккаунт должен быть тот же):

sudo tailscale up

Авторизуемся по ссылке в браузере.

Проверяем IP домашнего сервера:

tailscale ip -4

Ожидаемый вывод:

100.XX.XX.XX

Записываем этот адрес. Он понадобится для резервного копирования и доступа к домашним сервисам.

Если домашний сервер уже был в Tailscale — просто проверяем статус:

tailscale status

Ожидаемый вывод:

100.92.60.38     srv02-helsinki  user@  linux  -
100.113.180.60   myserver        user@  linux  idle, tx 2244 rx 11996

Оба сервера видят друг друга — соединение установлено. Столбец idle означает, что серверы на связи, но активного трафика нет.

Бегемот, усаживаясь поудобнее:
«Два дома — два ключа. Туннель прорыт с обеих сторон. Теперь из Хельсинки можно крикнуть через подземный ход: «Эй, myserver, ты меня слышишь?» — и услышать ответ.»


Глава 5. Что скрывается за tailscale up — детальный разбор

Команда sudo tailscale up делает гораздо больше, чем кажется на первый взгляд. Разберём пошагово:

  1. Создание WireGuard-ключей. Tailscale генерирует пару ключей (приватный и публичный) для протокола WireGuard. Приватный ключ никогда не покидает сервер — хранится в /var/lib/tailscale/.

  2. Регистрация в координаторе. Сервер отправляет публичный ключ на серверы Tailscale (координатор). Координатор проверяет, авторизовано ли устройство (одноразовый ключ или ручное подтверждение), и записывает его в вашу сеть.

  3. Получение IP и маршрутов. Tailscale назначает серверу IP из диапазона 100.x.x.x и сообщает, какие ещё устройства есть в сети, с их публичными ключами.

  4. Создание интерфейса tailscale0. В системе появляется новый сетевой интерфейс. Проверить можно командой:

ip addr show tailscale0

Ожидаемый вывод:

3: tailscale0: <POINTOPOINT,MULTICAST,NOARP,UP,LOWER_UP> mtu 1280 qdisc fq_codel state UNKNOWN group default qlen 500
    link/none
    inet 100.XX.XX.XX/32 scope global tailscale0
       valid_lft forever preferred_lft forever
  1. Установка peer-to-peer соединений. Tailscale находит другие устройства в сети через координатор, но трафик между ними идёт напрямую, минуя серверы Tailscale (за исключением случаев, когда прямое соединение невозможно — тогда трафик идёт через релейные серверы Tailscale, это называется DERP).

  2. Шифрование. Весь трафик между устройствами шифруется WireGuard. Ключи шифрования ротируются каждые несколько часов.

Проверка прямого соединения с домашним сервером:

tailscale ping 100.113.180.60

Ожидаемый вывод:

pong from myserver (100.113.180.60) via DERP(somecity) in 45ms
pong from myserver (100.113.180.60) via DERP(somecity) in 42ms
pong from myserver (100.113.180.60) via DERP(somecity) in 44ms

Если в выводе via DERP — соединение идёт через релейный сервер (это нормально для первого раза). Если via <IP>: — прямое peer-to-peer.

Коровьев, накручивая ус:
«Координатор — как справочная служба. «Где живёт гражданин Myserver?» — «По адресу 100.113.180.60, подъезд WireGuard, квартира tailscale0.» А дальше вы уже сами — рукопожатие, ключи, шифрование. Никто не подслушает.»


Глава 6. Проверка связности: VDS → домашний сервер

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

С VDS (srv02-Helsinki) запускаем ping до домашнего сервера:

ping -c 4 100.113.180.60

Разберём флаги:

  • ping — утилита для проверки сетевой доступности
  • -c 4 (count) — отправить 4 пакета и остановиться

Ожидаемый вывод:

PING 100.113.180.60 (100.113.180.60) 56(84) bytes of data.
64 bytes from 100.113.180.60: icmp_seq=1 ttl=64 time=12.3 ms
64 bytes from 100.113.180.60: icmp_seq=2 ttl=64 time=11.8 ms
64 bytes from 100.113.180.60: icmp_seq=3 ttl=64 time=12.1 ms
64 bytes from 100.113.180.60: icmp_seq=4 ttl=64 time=12.0 ms

--- 100.113.180.60 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3004ms
rtt min/avg/max/mdev = 11.8/12.05/12.3/0.19 ms

Цифры:

  • time=12.3 ms — время прохождения пакета туда и обратно. 12 миллисекунд между Хельсинки и домом — отлично.
  • 0% packet loss — ни один пакет не потерян. Туннель стабилен.
  • ttl=64 — Time To Live: пакет прошёл ровно один маршрутизатор (сам сервер).

Копирование файла через Tailscale (проверка, что TCP тоже работает): создадим тестовый файл и скопируем его на домашний сервер:

echo "Привет из Хельсинки!" > /tmp/test.txt
scp /tmp/test.txt user01@100.113.180.60:/tmp/

Ожидаемый вывод:

test.txt 100%   28     0.1KB/s   00:00

Tailscale никак не ограничивает скорость — она зависит только от каналов интернета с обеих сторон.

Воланд, разглядывая пинг:
«Двенадцать миллисекунд. Пакет летит из Хельсинки в Подмосковье быстрее, чем официант несёт кофе. Никаких открытых портов, никаких публичных IP — просто два шепота в туннеле.»


Глава 7. Tailscale SSH (опционально, на сервере не включено)

Tailscale предлагает собственную замену OpenSSH. Вместо того чтобы полагаться на SSH-ключи или пароли, Tailscale SSH использует аутентификацию самого Tailscale: кто прошёл авторизацию в вашей Tailscale-сети — тот может подключиться по SSH, предъявив свой профиль.

На данном сервере эта функция не включена — используется стандартный OpenSSH (настроенный в части 02). Но если захотите попробовать, вот как это делается.

Включение на сервере:

sudo tailscale up --ssh

Ожидаемый вывод:

Success.

Теперь с любого устройства в вашей Tailscale-сети можно подключиться к серверу без ключей и паролей:

ssh user01@100.XX.XX.XX

Tailscale сам проверит, что вы — это вы. Если захотите отключить:

sudo tailscale up --ssh=false

Бегемот, примеряя шляпу-невидимку:
«Tailscale SSH — это пропуск без билетёра. Никаких ключей, никаких паролей. Хозяин сети — он и есть пропуск. Но наш дом пока использует старый добрый замок (OpenSSH). Если захотите — смените на кодовый замок Tailscale.»


Глава 8. Tailscale и UFW — как они дружат

Tailscale использует виртуальный сетевой интерфейс tailscale0. Трафик внутри Tailscale-сети не проходит через обычные сетевые правила UFW, потому что:

  1. Пакет приходит на физический интерфейс (eth0) — он зашифрован WireGuard
  2. Демон tailscaled расшифровывает его и передаёт на виртуальный интерфейс tailscale0
  3. Приложение получает пакет уже с Tailscale-адреса

UFW видит только то, что приходит на eth0, — зашифрованный трафик на порт UDP 41641 (порт Tailscale). Если порт 41641 вдруг закроется — Tailscale перестанет работать.

Проверяем, что UFW не блокирует порт Tailscale:

sudo ufw status | grep 41641

Ожидаемый вывод: пусто (порт не указан, значит не заблокирован).

Но на всякий случай можно разрешить Tailscale-подсеть явно (это не повредит):

sudo ufw allow from 100.64.0.0/10

Ожидаемый вывод:

Rule added

Подсеть 100.64.0.0/10 — это весь диапазон CGNAT, который использует Tailscale. Если какой-то внутренний трафик всё же пойдёт через UFW — он будет пропущен.

Коровьев, разводя руками:
«Tailscale — как призрак. Сквозь стены (UFW) проходит, не задевая их. Но лучше не испытывать судьбу — открыть для него калитку.»


Финал части: Резюме Воланда

Параметр Статус
Tailscale установлен на VDS
VDS подключён к Tailscale-сети
Tailscale IP получен
Tailscale установлен на домашнем сервере
Домашний сервер подключён к Tailscale-сети
Прямая связь между VDS и домашним сервером
Ping ~12 мс, 0% потерь
Копирование файлов через Tailscale (SCP)
Tailscale в автозагрузке (systemd)
Tailscale SSH (опционально)

Воланд подводит итог шестой части:
«Туннель прорыт от Хельсинки до самого дома. Два сервера стали соседями по лестничной клетке CGNAT. Пакеты летят за 12 миллисекунд, файлы копируются без паролей, а внешний мир даже не догадывается о существовании этого прохода. Пора ставить веб-сервер — публичное лицо нашего предприятия.»

Комментарии

Комментарии пока не подключены.