Poradnik po odcinku

Zamykam serwer na świat.
I dalej mam do niego dostęp.

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.

⏱ ok. 30 minut 🧑‍💻 zero programowania 7 faz robi agent 🔓 klient open source · konto darmowe
Nie chcesz czytać? Zjedź do Kroku 2, skopiuj prompt i wklej go w Claude Code.
Nie masz jeszcze serwera? Ja korzystam z VPS-ów od Hostingera (partner technologiczny kanału) - kod ROBERTHOST daje dodatkowy rabat.
ZANIM ZACZNIESZ

Czego potrzebujesz

⚠️

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.

O CO CHODZI

Trzy rzeczy, które robi Tailscale

1

Tunel (WireGuard)

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.

2

Recepcja (serwer koordynacyjny)

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.

3

Kurier (DERP)

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.

KROK 1 / 3

Otwórz Claude Code w pustym folderze

Nowy folder, żeby agent miał czyste biurko. Wpisz w terminalu na swoim komputerze (nie na serwerze):

Twój komputer · terminal
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.

KROK 2 / 3

Wklej agentowi ten prompt

Cały, w jednej wiadomości. Agent sklonuje repo z wizardem, zapyta o dane serwera i poprowadzi Cię fazami F0-F6.

Claude Code · wiadomość do agenta
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.

KROK 3 / 3

Co się będzie działo (i gdzie masz coś do powiedzenia)

Siedem faz. Agent robi komendy, Ty klikasz tam, gdzie jest znaczek Twój klik.

F0

Dane 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.

F1

Audyt PRZED, skan portów i aktualizacja systemu

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).

F2

Tailscale na serwerze Twój klik

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.

F3

Test nowego mostu z DWÓCH urządzeń Twój klik

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.

F4

Key expiry OFF Twój klik

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.

F5

Zamknięcie publicznego SSH Twój klik

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.

F6

Audyt PO + zestawienie

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ś.

CZERWONE MA BYĆ ZIELONE

Skan z internetu przed i po

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.

PRZED · bash portscan.sh 31.97.47.125
  OPEN   22
  closed 2222
  closed 80
  closed 443
  closed 8080
  ...
Otwarte z internetu: 1
PO · bash portscan.sh 31.97.47.125
  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
CoPrzedPo
Port SSH z internetuOPENclosed
Wejście z komputerassh user@IPssh user@100.x.y.z
Wejście z telefonuklucze na telefonieaplikacja + 100.x
Publiczne WWW / webhooki (80/443)działadziała
Klucz urządzenia serwerawygasa po 180 dniachnie wygasa
Prób logowania obcych / dobęsetki0
Zgubiony laptopwymiana kluczy na serwerachRemove w panelu

Co dalej: ładniejszy adres niż http://100.x.y.z:8000

Masz 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:

Serwer · opcjonalnie
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.

ZJEDZONE ZA CIEBIE

Pułapki, które wizard już zna

1Docker omija ufw

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".

2Konsola web Hostingera nie jest planem B

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.

3Po kilku miesiącach serwer znika z tailnetu

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.

4tailscale ping mówi via DERP i nie przechodzi w direct

UDP 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.

5"Tailscale nie jest open source, widzi mój ruch"

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.

6"Przecież WireGuard to pięć linijek"

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.

7Agent mówi "BLOCKED: sudo is not allowed"

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.

8"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.

Nie masz jeszcze VPS-a?

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.

Postaw serwer →