Seri · The Quiet Machine · Bölüm 4

Tailscale ile Ev Sunucusuna Her Yerden Ulaşmak

Tailscale sayesinde box’a Mac’ten ulaşır oldum: ne port forward var, ne de internetten geçen bir şifre.

Buraya kadarki her şey — BIOS’ta ölçülü davranmam, SSH’ı sıkılaştırmam — LAN’da olduğum için yürüyordu. Box’a evin dışından, üstelik o “internete hiç açılmama” duruşunu bozmadan ulaşmak içinse Tailscale gerekiyordu. Felsefe değişmiyor: en geniş erişim, ama yine de kapalı bir ağ.

Sunucu çalıştırmadan WireGuard

Tailscale, koordinasyon işini senin yerine üstlenen bir WireGuard mesh’i. VPS kiralamana ya da key’leri elle yönetmene gerek yok. Oturum açtığın her cihaz, özel bir ağda — bir “tailnet”te — bir peer oluyor ve diğerlerini doğrudan buluyor. Kişisel birkaç makine için ücretsiz; para ödemeye ancak iş bir team boyutuna geldiğinde başlıyorsun.

Hosted bir control plane istemiyorsan self-hosted alternatif Headscale var, ama o da çalıştırman gereken bir sunucu demek — kaçmaya çalıştığım şey tam olarak buydu.

Gerçekte iki tuzak çıktı.

Tuzak 1: açılmayan browser

Tailscale’in varsayılan oturum açma akışı, OAuth için yerel bir browser bekliyor. Box ise headless, baştan sona SSH üzerinden sürülüyor; makinenin üzerinde açılacak bir browser yok. tailscale up orada öylece durmuş, bir auth URL basıp bekliyordu.

O URL’i herhangi bir cihaza kopyalayınca sorunsuz açılıyor — telefon, Mac, neredeysen: aç, izin ver, bitti. Ama daha temiz yol browser adımını tamamen atlamak: admin console’da önceden yetkilendirilmiş bir auth key üretip doğrudan daemon’a vermek.

tailscale up --authkey=tskey-auth-xxxxxxxxxxxx

Browser yok, elle uğraşma yok — bu key bu katılım için bir kez üretildi, sonrasında da saklanmadı.

Tuzak 2: “Tags” tuzağı

O key’i üretirken admin console karşına bir Tags toggle’ı çıkarıyor. Zararsız görünüyor — tag’ler, access-control kuralları için cihazları etiketleme yöntemin — ben de açtım. İşe yaramadı.

İşin püf noktası: bir tag’i bir auth key uygulayabilsin diye, o tag’in önce ACL policy dosyandaki tagOwners‘da tanımlanmış olması gerekiyor. Gerçek bir fleet’te bunu bilerek kurarsın. Ama kendi iki cihazımı birleştiren kişisel bir key için tag’ler tam bir yük, o kadar. Tags’i kapalı bıraktım — düz, tag’siz bir key ürettiğim anda box ilk denemede join oldu.

Hiçbir bedeli olmadığının kanıtı

Beni asıl kaygılandıran şuydu: bunun gibi hosted bir servis trafiğimi kendi sunucularından geçirebilir; bu da latency ekler, üstüne free plan’da bir bandwidth sınırı bile koyabilir — her SSH tuş vuruşu, her dosya kopyası oradan gidip gelseydi bu ciddi bir vergi olurdu.

Öyle olmuyor. Tailscale’in relay’leri (DERP) yalnızca iki peer doğrudan bir yol açamadığında devreye giren bir fallback. Evdeyken Mac’imle box aynı LAN’da, Tailscale de bunu görüyor: relay üzerinden değil, doğrudan LAN’dan, beş milisaniyede, kendi switch’imin üzerinden bir yol kuruyor. WireGuard şifrelemesi yine üstte gidiyor ama paketler evden hiç çıkmıyor; yani aynı ağdayken ne relay’e sapma var, ne de ölçülen bir bandwidth. Ancak dışarıdayken, iki NAT’ın arasından doğrudan bir yol kurulamadığında bir relay’e düşüyor.

Bir firewall ayrıntısı çelme taktı. sshd’yi sıkılaştırırken LocalSubnet‘e kilitlemiştim: yalnızca LAN. Tailnet üzerindeyse Mac’im, local subnet’imde olmayan bir tailnet adresiyle görünüyor; bağlantı da sessizce reddedildi. SSH’ın kapsamını, LAN’ın yanı sıra tailnet’i de kapsayacak biçimde genişlettim.

Sonraki bir denetimde fark ettim: Windows’un varsayılan SSH kuralı — kutudan etkin çıkan, her adrese açık olan o kural — sertleştirdiğim kuralın hemen yanında hâlâ duruyordu. Onu da devre dışı bıraktım. Açık internetten yine de hiçbir yol yok.

Tailscale’in kendisi çöktüğü güne hazırlanmak

Tailscale ben neredeysem orada çökebilir; o yüzden fallback’i katman katman kurdum:

  • Evdeyken Tailscale’i tamamen atla. SSH config’deki düz bir LAN alias’ı box’a static IP’sinden ulaşıyor, hiçbir mesh’e bağımlı değil. En alttaki katman bu: Tailscale çalışsa da çalışmasa da iş görüyor.
  • Kendi kendini onarsın. Bir Windows Scheduled Task, Tailscale ya da sshd’den biri durduğunda yeniden başlatıyor; amaç, çoğu geçici kesintiyi ben fark etmeden yakalamak.
  • Evde kimse yokken elektrik kesintisini atlatsın. SSH’ı sıkılaştırmamın ve BIOS’ta ölçülü davranmamın karşılığını aldığım yer burası: sshd boot seviyesinde bir servis, AC Back Always On’a ayarlı, box da kablolu Ethernet’te. Yani bir kesintiden sonra kendi kendine açılıyor, ağı ayağa kaldırıyor ve kimse dokunmadan SSH’a cevap veriyor. Tailscale de aynı şekilde geri gelir diye varsaymıştım.

Dürüst sınır

Dışarıdaysam ve Tailscale tümüyle çökmüşse, box tasarımı gereği ulaşılamaz. Geri düşebileceğim bir inbound port yok, açmaya da niyetim yok. O noktadaki çözüm dokümanda vardı ama kurulmamıştı: free-tier bir VPS’e (Oracle) ya da bir Cloudflare Tunnel’a doğru bir reverse SSH tunnel — box’ın dışarı arayıp yalnızca outbound kaldığı bir yapı. Evde dinleyen bir port hiçbir zaman açılmıyor. Sessizce açıkta olmaktansa dürüstçe ulaşılamaz olmayı yeğlerim.

Son parça sıradan ama sürekli kullandığım bir şey: box’taki bir Windows SMB share, Mac’e mount edilmiş, LAN ya da tailnet üzerinden erişilebilir, kendine ait düşük yetkili bir hesabın arkasında. Böylece iki makine de aynı klasörü görüyor.

Sırada: bütün bu ayarların ardından gelen ilk reboot ve bozulan tek şey — kusursuz açılan bir servisin yanında, biri giriş yapana dek sessizce başlamayı reddeden bir başkası.