Newsletter 365tipů můžete číst zdarma. Placené předplatné je dobrovolná podpora, která pomáhá webu pokračovat.
Podpořit 365tipů

TIP#3308: Jak přes Tailscale zpřístupnit zvenku celou domácí síť, nejen jeden počítač? Sakra užitečná věc

Tailscale nemusí sloužit jen k připojení mezi zařízeními, na kterých je přímo nainstalovaný. Z jednoho domácího serveru/počítače můžete udělat „subnet router: a přes něj se z notebooku či telefonu dostat na prakticky celou domácí síť. A pomocí split DNS mohou dál fungovat i lokální názvy služeb místo IP adres.

POZNÁMKA: Tailscale jsem používal už kdysi, ale přišel čas to oživit. Takže jsem nechal Claude Code zprovoznit Tailscale na mini PC s Ubuntu a sám to zprovoznil i na iPhone/iPadu a MacBooku. Což vedlo k pár objevům zádrhelů. Claude pak sepsala podklad pro „skill“ ChatGPT a je tu další tip co sepsala AI. Opět to nešlo „napiš a hotovo“, čtyři iterace, čtení, kontroly, zpětné vazby, oprava jednoho nesmyslu, nápravy. Ale tohle už je dost dobré pro někoho kdo to bude dělat.

O Tailscale už je na 365tipech samostatný tip. Základní použití je jednoduché: Tailscale nainstalujete na dva stroje a ty se přes vytvořený tailnet navzájem uvidí.

Jenže co když chcete zvenku přistupovat i na tiskárnu, NAS, router, webové rozhraní nějakého IoT zařízení nebo další služby, na kterých Tailscale vůbec není?

K tomu slouží subnet router. Jeden stroj s Tailscale se stane bránou do celé domácí podsítě.

V konkrétním příkladu Ubuntu server v síti 192.168.1.0/24. Na něm už byl Nginx Proxy Manager obsluhující lokální webové služby a AdGuard Home jako DNS server. Cílem bylo dostat se z iPhonu nebo notebooku mimo domov nejen na server, ale také na všechno ostatní v domácí síti, a navíc dál používat názvy jako solidtime.home nebo testovací weby pod .test.

Nginx Proxy Manager ani AdGuard Home nejsou pro samotný subnet router podmínkou. Vlastní DNS potřebujete až tehdy, pokud chcete zvenku používat lokální DNS jména.

Instalace Tailscale na domácí server

Na Ubuntu lze použít oficiální instalační skript Tailscale:

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

Aby ale server mohl přeposílat provoz dál do domácí sítě, nestačí samotný Tailscale. Linux musí mít povolený IP forwarding:

echo 'net.ipv4.ip_forward = 1' | sudo tee /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.conf

Bez toho se přes Tailscale dostanete na samotný server, ale server nebude fungovat jako router k ostatním zařízením.

Potom lze server připojit do tailnetu a rovnou oznámit domácí síť:

sudo tailscale up --advertise-routes=192.168.1.0/24 --accept-dns=false --hostname=minis

Adresu sítě samozřejmě nahraďte vlastní. 192.168.1.0/24 v tomto případě znamená celou síť od 192.168.1.1 do 192.168.1.254.

--advertise-routes=192.168.1.0/24 oznamuje Tailscale, že se přes tento stroj lze dostat do této podsítě.

--hostname=minis nastaví jméno zařízení v Tailscale.

--accept-dns=false znamená, že samotný server nebude přebírat DNS konfiguraci z Tailscale a ponechá si své stávající DNS nastavení. Není to povinné pro každý subnet router. V tomto případě to bylo žádoucí právě proto, že server už měl vlastní DNS konfiguraci.

Při prvním spuštění dostanete přihlašovací adresu, kterou otevřete v prohlížeči a zařízení autorizujete.

Pozdější změnu nabízených sítí lze podle současné dokumentace provést například:

sudo tailscale set --advertise-routes=192.168.1.0/24

Nabídnutou síť ještě musíte schválit

Samotné --advertise-routes nestačí. Otevřete Machines v administraci Tailscale, najděte daný server a přes Edit route settings povolte nabídnutou síť, například 192.168.1.0/24.

Teprve potom ji Tailscale začne distribuovat klientům.

Pro běžný domácí tailnet je webová administrace nejsnazší cesta. Pokud byste subnet routerů spravovali více, Tailscale umí schvalování automatizovat pomocí autoApprovers, takže nejde o omezení, že by schválení bylo možné výhradně ručně ve webu.

Na serveru můžete stav ověřovat například:

tailscale status

nebo podrobněji:

sudo tailscale status --json

U serveru dává smysl vypnout expiraci klíče

Tailscale zařízení používají klíče a u nových tailnetů je standardní doba expirace 180 dní. Po expiraci zařízení přestane komunikovat, dokud se znovu neautorizuje.

U notebooku to nemusí být problém. U serveru schovaného doma, který má fungovat jako trvalá vstupní brána, je to dost nepříjemné.

V Machines proto u subnet routeru otevřete menu se třemi tečkami a použijte Disable Key Expiry.

Tailscale tuto možnost přímo doporučuje mimo jiné pro důvěryhodné servery a subnet routery. Znamená to samozřejmě, že zařízení už nebude pravidelnou reautorizaci vyžadovat, takže to dělejte pouze u stroje, který máte pod kontrolou.

Klienti musí subnet routes používat

Na iOS, Androidu, Windows a macOS Tailscale nabízené subnet routes standardně přijímá. Na Linuxu je to jinak a je potřeba je povolit:

sudo tailscale set --accept-routes

Pokud tedy z telefonu všechno funguje, ale linuxový notebook se na 192.168.1.x nedostane, je to jedna z prvních věcí ke kontrole.

V klientských aplikacích lze používání subnetů také vypnout, takže při hledání problémů zkontrolujte, zda není zakázané Use Tailscale subnets.

Jak zachovat lokální DNS názvy

Teď už fungují IP adresy. Pokud tedy doma otevřete třeba:

http://192.168.1.178:81

stejná adresa může fungovat i z telefonu na mobilních datech.

S názvem typu:

https://solidtime.home

je to složitější. Veřejné DNS samozřejmě netuší, co solidtime.home znamená. To ví pouze domácí DNS server.

Řešením je split DNS, kterému Tailscale říká také restricted nameserver.

V DNS nastavení Tailscale přidejte domácí DNS server, například:

192.168.1.178

a omezte ho pouze na konkrétní doménu.

Pro existující .home tedy:

home

a pro testovací služby případně další záznam:

test

Výsledek je jednoduchý. Dotaz na solidtime.home pošle Tailscale domácímu DNS serveru přes subnet router. Běžný dotaz například na www.google.com dál vyřeší normální DNS připojení zařízení.

Kvůli tomu není nutné zapínat Override DNS servers. Tato volba slouží k tomu, aby Tailscale globálně nahradil běžné DNS servery zařízení. Pro split DNS omezené jen na určitou doménu není potřeba.

Pozor také na klienty: Tailscale DNS settings musí mít zapnuté. Jestli lokální IP funguje, ale lokální jméno nikoliv, kontrola DNS nastavení klienta je první krok.

.home, .test a hlavně .local nejsou totéž

V popsané síti už byla dlouhodobě používaná doména .home, takže není důvod kvůli Tailscale všechno okamžitě předělávat. Pro úplně novou domácí síť bych ji ale nezaváděl.

IETF původně s .home pro domácí sítě počítalo, ale později použití nahradilo speciální doménou home.arpa právě kvůli konfliktům a unikání .home dotazů do veřejného DNS.

Pro nový setup je tedy lepší například:

solidtime.home.arpa
kuma.home.arpa
nas.home.arpa

Doména .test je naopak přímo rezervovaná pro testovací použití, takže pro lokální staging a podobné účely dává smysl.

A ještě jiná věc je .local. Ta je podle specifikace mDNS určena pro link-local Multicast DNS, tedy například Bonjour. Není to normální privátní DNS doména a Tailscale subnet router vám automaticky nepřenese mDNS broadcasty z domácí sítě někam do mobilního telefonu přes Internet.

.local proto nepřidávejte do split DNS jako náhradu za mDNS. Pro vlastní unicast DNS používejte raději home.arpa, vlastní skutečnou doménu nebo pro testování .test.

POZNÁMKA: Osobně fakt .home.arpa nebaví vypisovat, takže jsem prostě zůstal u .home

Jak ověřit, že opravdu přistupujete přes Tailscale

Test na telefonu může být překvapivě zrádný. iPhone se umí velmi ochotně znovu připojit ke známé domácí Wi-Fi a vy pak máte pocit, že jste ověřili vzdálený přístup, ačkoliv jste stále doma v LAN.

Nejspolehlivější je testovat mimo dosah domácí Wi-Fi. Případně u domácí sítě dočasně vypněte Auto-Join, Wi-Fi odpojte a zkontrolujte, že telefon skutečně používá mobilní data.

Nejdřív zkuste nějakou holou privátní IP adresu, která z veřejného Internetu určitě dostupná není:

http://192.168.1.178:81

Pokud se načte, subnet routing funguje.

Potom zkuste lokální DNS jméno:

https://solidtime.home

Pokud funguje IP, ale ne jméno, hledejte problém v split DNS. Pokud nefunguje ani IP, problém je v subnet route, jejím schválení, klientském přijímání route nebo případně firewallu.

U HTTPS služby s vlastním či self-signed certifikátem samozřejmě můžete dostat stejné upozornění na certifikát jako doma. To s Tailscale routingem nesouvisí.

macOS: Tailscale můžete ovládat i bez ikonky v menu baru

Na MacBooku s výřezem v displeji se můžete dostat do poněkud absurdní situace: Tailscale běží, ale jeho ikonka skončí schovaná pod výřezem a není na ni možné kliknout.

Pomůže přesunutí ikonek v menu baru pomocí Cmd, odebrání nepotřebných položek z Control Center nebo větší pracovní plocha displeje.

Ještě praktičtější je ale CLI.

U současné Standalone verze Tailscale pro macOS už CLI integraci umí aplikace nainstalovat sama. V Settings -> CLI integration použijte Show me how -> Install Now. Do /usr/local/bin/tailscale se nainstaluje launcher a pak můžete normálně používat:

tailscale status
tailscale up
tailscale down

Pokud máte verzi z Mac App Store, CLI je součástí aplikace a lze ho spouštět přímo:

/Applications/Tailscale.app/Contents/MacOS/Tailscale status

Pro pohodlnější používání doporučuje dokumentace alias, například do ~/.zshrc:

alias tailscale="/Applications/Tailscale.app/Contents/MacOS/Tailscale"

Potom:

source ~/.zshrc

A pozor na jednu past. Nevytvářejte obyčejný symlink na binárku uvnitř aplikace:

sudo ln -s /Applications/Tailscale.app/Contents/MacOS/Tailscale /usr/local/bin/tailscale

Tailscale má zdokumentovaný problém, kdy takto spuštěná macOS aplikace nemusí správně rozpoznat svůj bundle identifier a skončí chybou podobnou:

Fatal error: The current bundleIdentifier is unknown to the registry

U Standalone verze tedy použijte vestavěnou CLI integration. U App Store verze alias.

Pozor, subnet router skutečně otevírá cestu do celé sítě

Tohle je největší praktický rozdíl proti běžnému Tailscale mezi dvěma zařízeními.

Když nabídnete:

192.168.1.0/24

zpřístupňujete přes subnet router celou tuto síť, ne jen jeden server.

Nově vytvořený tailnet má velmi volnou výchozí politiku umožňující komunikaci mezi zařízeními. Pokud máte v tailnetu jen vlastní důvěryhodná zařízení, může to být přesně to, co chcete. Pokud do něj přidáváte další lidi či zařízení, podívejte se na Tailscale Grants a omezení přístupu.

Můžete například povolit jednomu uživateli jen konkrétní servery či porty místo celé domácí sítě.

Výhodou oproti klasickému publikování služeb na Internet je, že kvůli tomuto řešení nemusíte na domácím routeru otevírat jednotlivé webové administrace, SSH, databáze a další služby směrem do Internetu.

Ještě pár věcí, na kterých se dá spálit

Subnet router musí být zapnutý. Když domácí server vypnete, zmizí s ním i cesta k ostatním zařízením. Pokud na vzdáleném přístupu opravdu závisíte, Tailscale umí více subnet routerů se stejnou route pro zálohu.

Na Linuxu Tailscale standardně nastavuje potřebná pravidla firewallu a provoz přes subnet router standardně maskuje pomocí SNAT. Zařízení v domácí síti tedy typicky vidí přístup jako provoz přicházející ze subnet routeru. Pro běžný homelab je to žádoucí, protože nemusíte na každém domácím stroji přidávat zpětné routy.

Máte-li vlastní komplikovanější iptables, nftables, UFW nebo jiné firewallové nastavení, může forwarding blokovat vaše vlastní konfigurace. Pokud route existuje a z klienta je aktivní, ale nic přes ni neprojde, firewall na subnet routeru je další místo ke kontrole.

A nakonec pozor na velmi běžné domácí rozsahy jako 192.168.1.0/24. Můžete se připojit k cizí Wi-Fi, která používá úplně stejnou síť. Pak existují dvě různé sítě se stejnými adresami a routing se může začít chovat překvapivě. Pokud domácí síť teprve navrhujete, méně obvyklý privátní rozsah může podobným kolizím do budoucna předejít.

A co nové služby?

Tady je na celé konfiguraci příjemná věc.

Jakmile subnet router nabízí celou 192.168.1.0/24 a split DNS posílá například celou zónu home.arpa nebo test na domácí DNS, nemusíte při přidání další domácí služby nic měnit v Tailscale.

Přidáte nový DNS záznam, případně nový reverse proxy host, a služba je dostupná stejně doma i přes Tailscale.

Z telefonu na mobilních datech se tak můžete dostat nejen na jeden počítač s Tailscale, ale prakticky se chovat, jako byste byli připojení do vlastní domácí sítě. A bez otevírání jednotlivých domácích služeb do veřejného Internetu.