Twój VPS ma dwa rodzaje drzwi. Od ulicy - strona, webhooki, bot na 80/443 - te muszą być otwarte. I dla Ciebie - SSH, panele, bazy - te dziś też stoją od ulicy, a boty z całego świata pukają do nich od pierwszej godziny. Tailscale buduje prywatny korytarz z Twojego laptopa i telefonu prosto do serwera. Drzwi od ulicy do zaplecza zamurowujesz.
Zamiast wykładu o VPN-ach dostajesz jedną wklejkę do Claude Code. Agent instaluje Tailscale, każe Ci wejść z komputera i z telefonu, a dopiero potem zamyka publiczne SSH. Ty klikasz dwa linki i mówisz, co ma zostać publiczne.
ufw na serwerze i powie Ci o pułapce z Dockerem.Złota zasada: najpierw budujesz nowy most, sprawdzasz, że przenosi ciężar, i dopiero potem rozbierasz stary. Publiczne SSH znika w Fazie 5 wyłącznie po dwóch udanych wejściach przez tailnet (komputer + telefon) w Fazie 3. Wizard ma to wbudowane jako bramkę, nie jako sugestię.
Krok zero. Ten poradnik nie robi hardeningu (użytkownik zamiast roota, klucze, fail2ban). Na produkcji przejdź najpierw vps-security (ok. 9 minut, też jedną wklejką). Na testowej maszynie, jak w odcinku, można od razu - jako root.
Ile to kosztuje? Nic poza serwerem. Klient Tailscale jest open source (tailscale/tailscale, BSD-3), konto Personal jest darmowe i użytkownicy z 20 maszynami nie widzieli limitu. Kto nie chce chmury Tailscale, ma Headscale - ale to kolejny serwer do utrzymania.
Opancerzony kabel między dwoma Twoimi urządzeniami. Szyfrowanie na kluczach, jak SSH,
tylko na poziomie całej sieci. Każde urządzenie dostaje prywatny adres
100.x.y.z, którego internet nie zna.
Swatka. Zna klucze publiczne i aktualne adresy Twoich urządzeń, mówi laptopowi "serwer jest tam". Nie widzi ruchu - rozmowa idzie bezpośrednio laptop ↔ serwer.
Gdy tunelu nie da się wykopać bezpośrednio (hotelowy firewall, internet mobilny bez
publicznego IP), ruch idzie przez przekaźnik. Nadal zaszyfrowany, tylko wolniej.
tailscale ping powie Ci, którą drogą jedziesz.
Dlaczego nie trzeba otwierać portów na routerze? Firewall wypuszcza to, co wychodzi, i wpuszcza odpowiedź od tego samego adresata. Obie strony "wychodzą" jednocześnie w to samo miejsce i tunel się zestawia. Dlatego działa nawet za CGNAT operatora komórkowego.
Nowy folder, żeby agent miał czyste biurko. Wpisz w terminalu na swoim komputerze (nie na serwerze):
mkdir tailscale-vps && cd tailscale-vps && claude
Pracujesz w aplikacji desktopowej Claude Code? Terminal nie jest Ci potrzebny: utwórz pusty folder, otwórz go w apce jako nową sesję lokalną i przejdź do Kroku 2.
Cały, w jednej wiadomości. Agent sklonuje repo z wizardem, zapyta o dane serwera i poprowadzi Cię fazami F0-F6.
Sklonuj repozytorium https://github.com/Szewowsky/tailscale-vps.git do bieżącego katalogu, przeczytaj plik .claude/commands/tailscale-setup.md i przeprowadź mnie przez opisany tam wizard schowania mojego serwera VPS za prywatną siecią Tailscale - dokładnie według jego zasad bezpieczeństwa i kolejności faz od F0 do F6. Idź krok po kroku: czekaj na wynik każdej komendy i nie przechodź dalej, jeśli test fazy nie przeszedł. Zacznij od zebrania danych (Faza 0), potem audyt PRZED przez scripts/check.sh --before i skan portów z mojego komputera przez scripts/portscan.sh, instalacja Tailscale, test dostępu przez tailnet z DWÓCH urządzeń, dopiero potem zamknięcie publicznego SSH w firewallu - i na końcu audyt PO oraz zestawienie: co było na czerwono, a co jest teraz na zielono. Złota zasada: nie zamykaj starego wejścia, dopóki nie udowodnisz, że nowe działa. Komendy z sudo buduj heredokiem zapisywanym do pliku i uruchamianym przez ssh, nie wpisuj sudo w komendzie inline. Linki autoryzacji Tailscale i kliknięcia w panelu wykonuję sam - Ty mi mówisz, gdzie kliknąć.
Masz Codex zamiast Claude Code? Ten sam prompt działa - Codex czyta
AGENTS.md z repo, który wskazuje na ten sam wizard.
Siedem faz. Agent robi komendy, Ty klikasz tam, gdzie jest znaczek Twój klik.
IP, użytkownik, port SSH, dostawca (Hostinger / inny), drugie urządzenie, co ma zostać publiczne, nazwa serwera w tailnecie. Agent sprawdza też, czy Twój komputer już jest w tailnecie.
check.sh --before na serwerze, portscan.sh
z Twojego komputera. Port SSH świeci na czerwono jako OPEN - to jest "przed". Bonus: liczba prób
logowania obcych z ostatniej doby. Na koniec fazy apt-get update &&
apt-get upgrade i sprawdzenie /var/run/reboot-required -
restart tylko za Twoją zgodą (sesja SSH padnie na ok. minutę, wracasz po publicznym IP, bo
Tailscale'a jeszcze nie ma).
Oficjalny install.sh, potem tailscale up.
Agent wyciąga link autoryzacji, Ty otwierasz go w przeglądarce i klikasz Connect. Serwer dostaje
adres 100.x.y.z.
SSH przez prywatny adres z komputera, potem z telefonu na LTE (aplikacja SSH albo strona testowa, która słucha tylko na adresie Tailscale). Dwa dowody = bramka do Fazy 5 otwarta.
Klucz urządzenia domyślnie wygasa po 180 dniach - serwer wypadłby z sieci w środku nocy. Konsola → Machines → Disable key expiry. Opcjonalnie Tailscale SSH: logowanie bez kluczy.
Bramka: dwa dowody z F3, key expiry off, Twój plan B (gdzie wyłączysz firewall z telefonu), lista publicznych portów. Hostinger: skrypt tworzy grupę w firewallu panelu przez API (token eksportujesz sam, nie wklejasz do czatu). Inni: ufw. Potem skan: SSH closed, a Ty dalej wchodzisz przez tailnet.
Tabela przed/po. Port SSH nie istnieje dla internetu, wejście z komputera i telefonu działa, klucz nie wygasa, 80/443 dalej publiczne, jeśli tak chciałeś.
To jest cały film w dwóch wynikach. Skan robisz ze swojego komputera, bo tylko tak widzisz to, co widzi internet - audyt na serwerze nie zobaczy firewalla dostawcy.
OPEN 22 closed 2222 closed 80 closed 443 closed 8080 ... Otwarte z internetu: 1
closed 22 closed 2222 closed 80 closed 443 closed 8080 ... Z internetu nie widać żadnego z tych portów. $ ssh root@100.103.126.35 "echo STILL_IN_VIA_TAILNET" STILL_IN_VIA_TAILNET
| Co | Przed | Po |
|---|---|---|
| Port SSH z internetu | OPEN | closed |
| Wejście z komputera | ssh user@IP | ssh user@100.x.y.z |
| Wejście z telefonu | klucze na telefonie | aplikacja + 100.x |
| Publiczne WWW / webhooki (80/443) | działa | działa |
| Klucz urządzenia serwera | wygasa po 180 dniach | nie wygasa |
| Prób logowania obcych / dobę | setki | 0 |
| Zgubiony laptop | wymiana kluczy na serwerach | Remove w panelu |
http://100.x.y.z:8000Masz na serwerze panel (n8n, Grafana, stronę testową z Fazy 3)? Jedna komenda daje mu adres
https://NAZWA.TAILNET.ts.net z prawdziwym certyfikatem,
widoczny tylko dla Twoich urządzeń w tailnecie:
sudo tailscale serve --bg 8000 # port usługi, która już działa lokalnie tailscale serve status # co jest wystawione tailscale serve reset # sprzątanie
--bg znaczy "trwale": konfiguracja przeżywa restart serwera. Bez tej
flagi komenda trzyma terminal i gaśnie razem z sesją.
serve to moja sieć, funnel to
cały świat. tailscale funnel wygląda prawie tak samo, ale
publikuje usługę w publicznym internecie - czyli odwraca dokładnie to, co zrobiłeś w Fazie 5.
Wizard funnela nie konfiguruje.
Kontener z -p 8080:8080 publikuje port przez iptables
przed ufw i jest widoczny z internetu mimo deny. Dlatego na
Hostingerze wizard używa firewalla w panelu (działa przed serwerem). Przy ufw: porty wewnętrzne
bindujesz na adres Tailscale - "100.x.y.z:8080:8080" zamiast
"8080:8080".
Konsola (noVNC) loguje jako root. Po vps-security root ma zablokowane logowanie, więc konsola nie wejdzie. Planem B jest przełącznik firewalla w panelu - działa z telefonu. Wizard pyta o Twój plan B, zanim cokolwiek zamknie.
Key expiry. Laptop odnawia klucz przy logowaniu, serwer nie. Faza 4 wyłącza to w konsoli,
a check.sh świeci na czerwono, dopóki nie wyłączysz. Jeśli już
wpadłeś: plan B, sudo tailscale up --force-reauth, klik, tym razem
Disable key expiry.
tailscale ping mówi via DERP i nie przechodzi w directUDP 41641 zablokowane po drodze. Działa, tylko przez przekaźnik. Wizard zostawia accept UDP 41641 w firewallu właśnie po to. Sprawdź regułę, odczekaj minutę, pinguj ponownie.
Klient jest open source. Serwer koordynacyjny (chmura Tailscale) zna klucze publiczne, adresy i nazwy urządzeń - kojarzy pary. Sam ruch idzie bezpośrednio między Twoimi urządzeniami, zaszyfrowany WireGuardem; przez ich przekaźnik przechodzi tylko w trybie DERP i nadal zaszyfrowany. Kto chce mieć wszystko u siebie: Headscale. Kolejny serwer do utrzymania.
Dla admina pięć linijek, dla mnie pięć wieczorów. Tailscale robi za Ciebie wymianę kluczy, przebijanie NAT, przekaźnik, nazwy zamiast adresów i unieważnianie urządzeń. Jeśli lubisz konfigurować WireGuard ręcznie - ten poradnik nie jest dla Ciebie i to jest OK.
Bash-guard w Claude Code blokuje sudo i
curl | sh w komendzie inline, nawet zdalnej. Wizard buduje takie kroki
heredokiem do pliku, kopiuje przez scp i uruchamia na serwerze. Jeśli agent mimo to utknie, prompt
z Kroku 2 mu to przypomina.
6.8.0 to przecież stare jądro"Ubuntu łata starą linię jądra bez zmiany głównego numeru: w 6.8.0-124
rośnie tylko N (124 = kolejne łatane wydanie tej samej linii). Samo
6.8.0 nie mówi więc nic o tym, czy serwer jest załatany - mówi to
N i data pakietu.
Niezależnie od tego: chowanie SSH za tailnetem nie łata pakietów, to dwie różne
warstwy. Dlatego Faza 1 kończy się na apt-get update && apt-get upgrade
i sprawdzeniu /var/run/reboot-required. Ten plik znaczy, że nowe jądro
już jest, ale działa jeszcze stare - trzeba zrestartować. unattended-upgrades
sam serwera nie restartuje, więc taki plik potrafi wisieć tygodniami.
Cały ten poradnik zaczyna się od serwera. Ja swoje trzymam u Hostingera - to partner technologiczny kanału, więc z kodem ROBERTHOST dostajesz dodatkowy rabat, a ja małą prowizję. Sprzęt bez zmian, cena niższa.