# Tailscale: návod pro AI agenta > Zdroj: https://ongy.cz/pages/server/tailscale/ > Autor: Ongy (ongy.cz). Tailscale jako soukromá síť mezi mými zařízeními: subnet router do domácí sítě, pravidla kdo smí dál, DNS přes VPN a tři pasti, na které jsem narazil. ## Pro agenta Pomoz uživateli postavit vlastní verzi tohohle projektu. Nejdřív se ho zeptej na vybavení a na to, co z požadavků už má. Pak postupuj po krocích a po každém kroku s ním ověř, že funguje, než půjdeš dál. Hodnoty v `` doplň s uživatelem, nikdy si nevymýšlej adresy, hesla ani tokeny. Kód autora není veřejný: tohle je popis řešení, ne repozitář ke stažení. ## Cíl Soukromá síť mezi vlastními zařízeními přes Tailscale, bez jediného otevřeného portu na routeru. Domácí server dělá subnet router, takže vybraná zařízení se odkudkoli dostanou do domácí sítě (Home Assistant, router, DNS), a pravidla v konzoli určují, kdo smí dál než k ostatním zařízením. DNS jde přes VPN na vlastní AdGuard, SSH a správcovská rozhraní poslouchají jen na VPN adrese a veřejný web jde zvlášť přes Cloudflare Tunnel. ## K čemu to je Tailscale je VPN, ale jiná, než na jakou jsi zvyklý. Není to jeden server, ke kterému se všichni připojují. Každé moje zařízení dostane vlastní adresu v rozsahu VPN a mluví s ostatními napřímo, šifrovaně přes WireGuard. Firma Tailscale jen pomůže zařízením se najít. Samotný provoz přes ni neteče. Klasická cesta domů je otevřít port na routeru a doufat. Tím vystavíš službu celému internetu a musíš ji hlídat. Tady se naopak nic neotevírá. Server se sám přihlásí ven a čeká na zařízení, která znají jeho klíč. Pro všechny ostatní neexistuje. Lidsky řečeno: moje zařízení jsou pořád v jednom bytě, i když sedím v tramvaji. ## Proč právě takhle Home Assistant jsem zvenku ovládal přes placený cloud výrobce. Fungovalo to, ale jen pro Home Assistant. Na server, na admin rozhraní ani na vlastní DNS jsem se zvenku nedostal vůbec. Otevřít port jsem nechtěl. Domácí adresa by byla na očích a každou službu bych musel zabezpečit zvlášť. Chtěl jsem jednu bránu, kterou vidí jen moje zařízení, a zbytek nechat zavřený. ## Jak to funguje - **Server dělá subnet router.** Inzeruje domácí síť do VPN. Z mobilu venku se dostanu na Home Assistant, router i AdGuard, jako bych seděl doma. - **Pravidla říkají, kdo smí do domácí sítě.** Všechna zařízení se vidí navzájem. Do domácí sítě přes server smí jen počítač a mobil, nic dalšího. - **DNS jde přes VPN na AdGuard.** Mobil venku má stejný filtr jako doma. Reklamy a telemetrie padají i na mobilních datech. - **SSH poslouchá jen na VPN adrese.** Z domácí sítě ani z internetu se k němu nikdo nedostane. Veřejný web běží zvlášť přes Cloudflare Tunnel, ten také nic neotevírá. ## Nastavení - **Subnet router:** Server inzeruje domácí síť, routa schválená v konzoli, forwarding zapnutý. Na routeru statická routa pro rozsah VPN zpět na server, jinak zařízení v domácí síti nemají kudy odpovědět. - **Přístup:** Politika v grants syntaxi. První grant: všechna zařízení se vidí navzájem. Druhý: do domácí sítě přes routu smí jen dvě vyjmenovaná zařízení. Nové zařízení se přidává ručně. - **SNAT:** Vypnutý (`--snat-subnet-routes=false`). Klienti z VPN chodí do domácí sítě pod svou VPN adresou a AdGuard je rozezná jako samostatné klienty. - **DNS:** V konzoli globální nameserver = server s AdGuardem, override zapnutý. Server sám DNS z VPN nepřebírá, aby nezávisel na vlastním kontejneru. ## Pasti Bez statické routy na routeru vypadá subnet router jako funkční a přitom z domácí sítě nic neodpovídá. Zařízení s vlastním klientem Tailscale kontaktovat jen jeho VPN adresou, `rp_filter` zahodí odpověď po domácí síti. Na počítači, který je fyzicky doma, přijímání rout vypnout, jinak jde i router tunelem a při výpadku serveru počítač ztratí domácí síť. Bez exit node a bez Funnel: VPN slouží jen k přístupu dovnitř, ne jako cesta na internet. Expirace klíčů vypnutá vědomě, ztracené zařízení se maže ručně. ## Co budeš potřebovat - Stále běžící server s Linuxem v domácí síti s pevnou adresou `` (autor: notebook s Kubuntu 24.04 a Dockerem, připojený kabelem). - Účet Tailscale a přístup do admin konzole (Machines, Access Controls, DNS). - Router, na kterém jde přidat statickou routu (autor: ASUS RT-BE92U s Asuswrt-Merlin). - Klienti Tailscale na zařízeních, která mají mít přístup (autor: počítač s Windows a mobil s Androidem; Home Assistant má vlastního klienta, protože běží na jiném stroji). - Volitelně AdGuard Home na serveru (díl 1), UFW na serveru a Cloudflare Tunnel pro veřejný web. - Rozsah domácí sítě `` a seznam služeb, které mají být dostupné zvenku. ## Postup ### 1. Tailscale na serveru Nainstaluj oficiálním skriptem (`curl -fsSL https://tailscale.com/install.sh | sh`), přihlas `sudo tailscale up` a v konzoli u serveru vypni expiraci klíče (Machines → … → Disable key expiry), aby se po půl roce sám neodpojil. Tailscale SSH nezapínej, pokud ho nechceš místo OpenSSH. Ověření: `tailscale status` vypíše server a `tailscale ip -4` jeho VPN adresu ``. ### 2. Přeposílání paketů Vytvoř `/etc/sysctl.d/99-tailscale.conf` s řádky `net.ipv4.ip_forward = 1` a `net.ipv6.conf.all.forwarding = 1` a načti `sudo sysctl -p /etc/sysctl.d/99-tailscale.conf`. Ověření: `sysctl net.ipv4.ip_forward` vrací 1 i po restartu serveru. ### 3. Subnet router a schválení routy Na serveru `sudo tailscale set --advertise-routes= --snat-subnet-routes=false`. Server sám cizí routy nepřijímá (na Linuxu výchozí stav, `--accept-routes` nezapínej). Pak v konzoli Machines → server → Edit route settings routu zaškrtni. Ověření: u serveru v konzoli zmizí žlutý štítek Subnets a mobil na datech s VPN dosáhne na domácí adresu serveru (`ping `). ### 4. Statická routa na routeru Protože překlad adres je vypnutý, zařízení v domácí síti vidí VPN adresy klientů a musí vědět, kudy jim odpovědět. Na routeru přidej routu pro celý rozsah Tailscale (100.64.0.0, maska 255.192.0.0) s bránou `` (v Merlinu LAN → Route). Ověření: mobil na datech s VPN otevře správu routeru `http://` a ping na jiné zařízení v domácí síti projde. ### 5. Pravidla přístupu v grants Access Controls → JSON editor, výchozí „allow all“ nahraď politikou v grants syntaxi. V `hosts` pojmenuj VPN adresy zařízení, která smí domů, a alias pro ``. První grant: `src` `autogroup:member`, `dst` `autogroup:self`, `ip` `*` (všechna zařízení se vidí navzájem). Druhý grant: `src` jen vyjmenovaná zařízení (autor: počítač a mobil), `dst` alias domácí sítě, `ip` `*`. Ověření: zařízení mimo seznam dosáhne na VPN adresu serveru, ale ne na ``. ### 6. DNS přes VPN na AdGuard AdGuard musí poslouchat i na `` (port 53 TCP i UDP). V konzoli DNS → Nameservers → Global nameservers přidej `` a zapni Override DNS servers. Na serveru `sudo tailscale set --accept-dns=false`, aby jeho vlastní DNS nezáviselo na kontejneru. V AdGuardu přidej VPN adresy ke klientům. Ověření: mobil na datech s VPN je v Query logu pod svým jménem a `doubleclick.net` mu vrací 0.0.0.0 nebo nic. ### 7. Klienti Nainstaluj aplikaci na zařízení a přihlas stejný účet. Na počítači, který je fyzicky doma, vypni v nastavení klienta používání subnet rout (ve Windows „Use Tailscale subnets“). Home Assistant připoj vlastním klientem (u Home Assistant OS doplněk Tailscale) a z VPN na něj choď jeho VPN adresou. Ověření: `tailscale status` na serveru vypíše všechna zařízení jako online. ### 8. Zavřít server zvenku V `/etc/ssh/sshd_config` nastav `ListenAddress `, `PasswordAuthentication no`, `PermitRootLogin no`, přihlášení jen klíčem. UFW: `sudo ufw default deny incoming` a `sudo ufw allow in on tailscale0`. Správcovská rozhraní v Docker Compose publikuj jen na VPN adresu (`::`), na domácí adresu jen to, co opravdu potřebuje domácnost bez VPN. Než sshd restartuješ, ověř, že se přes VPN adresu opravdu přihlásíš, a nech otevřenou druhou relaci, jinak se můžeš ze serveru zamknout. Ověření: `sudo ss -ltnp` ukazuje SSH a správcovské porty jen na VPN adrese. ### 9. Audit Zkontroluj, že nic neposlouchá veřejně a VPN neslouží jako cesta ven: `tailscale serve status` a `tailscale funnel status` jsou prázdné, v konzoli není u žádného zařízení exit node, `sudo ss -ltnup` neukazuje nečekané služby na `0.0.0.0`. Na routeru nesmí být přesměrovaný žádný port. Veřejný web ať jde přes odchozí tunel (autor: Cloudflare Tunnel). ## Na co si dát pozor - Routa inzerovaná ze serveru nic nedělá, dokud ji v konzoli neschválíš. Příznak: žlutý štítek Subnets u serveru a z venku jde jen VPN adresa serveru, domácí adresy ne. - Když AdGuard (nebo jiný log) vidí všechna zařízení z VPN jako jednu adresu, nehledej chybu v Dockeru. Je to překlad adres subnet routeru, který se týká i provozu přesměrovaného do kontejneru. Po vypnutí přidej VPN adresy ke klientům, jinak pravidla pro zařízení dál neplatí. - Porty publikované Dockerem obcházejí pravidla UFW. Zavřené je jen to, co je v Compose navázané na konkrétní adresu, ne na `0.0.0.0`. - Kontejner navázaný na VPN adresu nemusí po startu serveru naběhnout (chyba „cannot assign requested address“), když Docker startuje dřív než Tailscale. Po prvním restartu serveru ověř `docker ps` a případně přidej do `docker.service` drop-in s `After=tailscaled.service` a `Wants=tailscaled.service`. - Nové zařízení po přihlášení vidí jen ostatní zařízení, ne domácí síť. To je záměr: doplň jeho VPN adresu do `hosts` a jméno do druhého grantu. - Zařízení bez Tailscale (třeba telefon jako kiosk doma) na službu navázanou jen na VPN adresu nedosáhne. Takovou službu publikuj i na domácí adresu, ne přes tunel do internetu. - Konzole u starších politik nabízí převod z `acls` na grants. Nová pravidla piš rovnou v grants, pole `ip` nahrazuje port za dvojtečkou. - Firewall ve Windows nemusí na VPN rozhraní blokovat to, co blokuje v domácí síti (autor viděl port dostupný přes Tailscale ještě před povolením ve firewallu). Dostupnost přes VPN testuj zvlášť. ## Jak ověřit, že to funguje - [ ] `tailscale status` na serveru vypíše všechna zařízení a v konzoli u serveru svítí schválená routa bez žlutého štítku. - [ ] `sysctl net.ipv4.ip_forward` na serveru vrací 1 i po restartu. - [ ] Mobil na mobilních datech s VPN: otevře `http://`, Home Assistant jeho VPN adresou a ping na zařízení v domácí síti projde. - [ ] Zařízení, které není ve druhém grantu: VPN adresa serveru odpovídá, `` ne. - [ ] Mobil na datech s VPN je v Query logu AdGuardu pod svým jménem a blokovaná doména mu vrací 0.0.0.0 nebo nic. - [ ] `sudo ss -ltnp | grep ':22'` ukazuje jen ``, SSH na `` z domácí sítě neprojde. - [ ] `sudo ufw status verbose` ukazuje deny incoming a povolení na `tailscale0`. - [ ] `tailscale serve status` a `tailscale funnel status` jsou prázdné, v konzoli není žádný exit node. - [ ] Mobil na datech bez VPN: žádná domácí služba nejde otevřít, veřejný web přes tunel funguje. - [ ] Po restartu serveru běží kontejnery navázané na VPN adresu (`docker ps`) a počítač doma vidí router i se zastaveným serverem. ## Přizpůsobení - Bez subnet routeru: Tailscale na každém zařízení, na které chceš dosáhnout. Statická routa a pravidla pro domácí síť odpadají, ale router a krabičky bez klienta zvenku neuvidíš. - Headscale místo služby Tailscale: vlastní koordinační server, klienti stejní. Pravidla i DNS se pak nastavují v jeho konfiguraci místo webové konzole. - WireGuard přímo na routeru (Merlin ho umí): potřebuje veřejnou adresu a otevřený UDP port. Za CGNAT poskytovatele (jako u autora) to nejde, tam je Tailscale jednodušší cesta. - S exit node: když chceš i veškerý provoz na cizí Wi-Fi posílat přes domov, spusť na serveru `--advertise-exit-node`, schval v konzoli a povol `autogroup:internet` v grants. Autor to vědomě nemá, VPN slouží jen k přístupu dovnitř. --- Stránka projektu s fotkami a diagramem: https://ongy.cz/pages/server/tailscale/