Tailnet, в котором каждое устройство достаёт до любого другого, уже полезен сам по себе. Три дополнения превращают его из набора туннелей в настоящую сеть, и все три объединяет одна особенность, о которую спотыкаются: клиент анонсирует возможность, а сервер должен её одобрить. Маршрут, который анонсирован, но не одобрен, просто не существует — молча, без предупреждений, — и симптом такой: вы можете пропинговать роутер, но ничего за ним не отвечает.
Маршрутизатор подсети — выводит в tailnet целую локальную сеть. Одна машина в домашней или офисной сети анонсирует диапазон адресов этой сети; после этого любое другое устройство получает доступ к принтерам, NAS и интерфейсам управления за ней — без установки чего-либо ещё там же. Сначала включите форвардинг в ядре, иначе пакеты будут останавливаться на роутере без какого-либо сообщения об ошибке.
# On the machine that sits inside the LAN:
echo 'net.ipv4.ip_forward = 1' | sudo tee /etc/sysctl.d/99-ts.conf
echo 'net.ipv6.conf.all.forwarding = 1' | sudo tee -a /etc/sysctl.d/99-ts.conf
sudo sysctl -p /etc/sysctl.d/99-ts.conf
sudo tailscale up --login-server https://vpn.example.com \
--advertise-routes=192.168.1.0/24 --accept-routes
# On the control server — approve it, or it does not exist.
# The subcommand moved between releases; check `hs nodes --help` first.
hs nodes list
hs nodes approve-routes --identifier 3 --routes 192.168.1.0/24
Выходной узел — отправляет весь трафик наружу через VPS. Тот же механизм, только с более широким маршрутом: устройство, которое анонсирует себя как выходной узел, предлагает взять на себя весь интернет-трафик другого устройства целиком. В недоверенной сети кафе или отеля это именно то, что нужно, — и это ближайший аналог личного VPN во всём этом руководстве.
# On the VPS that will do the exiting (forwarding must be on, as above):
sudo tailscale up --login-server https://vpn.example.com --advertise-exit-node
# Approve it on the control server, then on the laptop:
tailscale set --exit-node=100.64.0.1 --exit-node-allow-lan-access
tailscale set --exit-node= # turn it off again
Выходной узел — это не коммерческий VPN, и не стоит убеждать себя в обратном. Его адрес принадлежит только вам и остаётся стабильным, что отлично работает против слежки в кафе с Wi-Fi, но бесполезно против долгосрочной корреляции активности на разных сайтах — этот компромисс подробно разобран в основном руководстве. Обратите также внимание, что выходной узел можно вынести на второй, более дешёвый VPS и полностью избавить координационный сервер от транзитного трафика.
Правила доступа — напишите их до того, как в сеть войдёт второй человек. Политика по умолчанию — «разрешено всё», и это правильно для tailnet из одного человека, но становится ошибкой, как только в нём появляется кто-то ещё. Политика — это небольшой документ в формате HuJSON: группы пользователей, теги для машин и список правил, которые определяют, какие источники могут достигать каких получателей на каких портах. Укажите в конфигурации путь к файлу, храните файл под системой контроля версий и перезагружайте сервис после каждой правки.
{
"groups": {
"group:admin": ["alice"],
"group:contractor":["bob"]
},
"tagOwners": {
"tag:server": ["group:admin"],
"tag:exit": ["group:admin"]
},
"acls": [
// Admins reach everything.
{ "action": "accept", "src": ["group:admin"], "dst": ["*:*"] },
// The contractor reaches one machine, on two ports, and nothing else.
{ "action": "accept", "src": ["group:contractor"],
"dst": ["tag:server:22,443"] }
],
"autoApprovers": {
"routes": { "192.168.1.0/24": ["tag:server"] },
"exitNode": ["tag:exit"]
}
}
Об этом файле стоит сказать ещё две вещи. Язык политики принадлежит Tailscale, а Headscale реализует лишь большое и постоянно растущее подмножество этого языка, а не весь целиком, — прежде чем полагаться на экзотическое правило, проверяйте документацию для своей версии. И место, где хранится политика, тоже переезжало: в старых релизах путь к ней указывался в конфигурации верхнего уровня, в новых — она сгруппирована в отдельной секции policy с режимом, который умеет хранить правила и в базе данных. Задокументированы оба варианта; важен тот, который поставляется вместе с закреплённой у вас версией.
MagicDNS — короткие имена и собственный резолвер повсюду. Когда MagicDNS включён, каждое устройство откликается на короткое имя внутри суффикса, который вы выбрали на шаге 02, так что ssh nas работает откуда угодно без файла hosts. Вторая половина — куда интереснее: координационный сервер также рассылает каждому клиенту список нейм-серверов, а это значит, что резолвер, который вы построили в руководстве по приватному DNS-резолверу, может обслуживать ваш телефон на мобильном интернете — фильтруя, кэшируя и ничего не логируя, — при этом слушая на адресе tailnet, который вообще не достижим из интернета.
dns:
magic_dns: true
base_domain: ts.example.com
override_local_dns: true # beat whatever DHCP handed the device
nameservers:
global:
- 100.64.0.5 # your resolver, on the tailnet