Seri · The Quiet Machine · Bölüm 6
Box ve Mac'i Simetrik Bir Sunucu Yapmak, macFUSE Olmadan
Finder’da box’tan tek bir paylaşılan klasör görünüyordu, haftalar önce kurduğum share. Altındaki D:\ sürücüsü değil — her projenin, her build’in yaşadığı yer — sadece o tek klasör. Oysa bütün sürücüyü Finder’da, yerel bir disk gibi sürükle-bırak yapabilmek istiyordum; box ile Mac’i simetrik bir sunucuya çevirme işinin bir parçası daha, ikisinin de birbirine tam anlamıyla erişebilmesi.
Box’ın geri kalanı zaten kilitliydi: RDP, SMB, SSH, hepsi özel bir WireGuard mesh üzerinden gidiyordu. Ayak uyduramayan tek şey file share’di.
Her forum gönderisinin verdiği cevap aynı: SSHFS. Zaten güvendiğin SSH bağlantısı üzerinden uzaktaki filesystem’i mount et. Kurmaya kalktım, doğruca Apple Silicon duvarına tosladım.
Bitirmediğim macFUSE Çilesi
macOS’ta SSHFS, bir kernel extension olan macFUSE istiyor. Intel bir Mac’te bu hafif can sıkıcı. Apple Silicon’da ise Recovery’e girmek, kernel-extension güvenlik politikasını düşürmek, kext’i onaylamak ve iki kez reboot etmek anlamına geliyor. Tekrar Recovery’e girip geri almadığın sürece de gevşek kalıyor.
Mac güvenilir beyin olarak kalsın diye günlerce uğraşıp box’ı su sızdırmaz hale getirmiştim. Şimdiyse “kullanışlı” bir filesystem mount’u, sırf bir config düzenlemesinden kurtulayım diye Mac’in kendi güvenlik duruşunu — bir Recovery-mode kernel politikası değişikliğiyle — düşürmemi istiyordu. İlk reboot’a varmadan vazgeçtim.
Daha Hafif Kazanım: Zaten Çalışanı Daha Fazla Paylaş
Fark edince neredeyse utandım. Zaten çalışan, kernel gerektirmeyen bir dosya yolum vardı: SMB. Box onun üzerinden bir klasörü zaten paylaşıyordu, bütün sürücüyü paylaşmama da engel yoktu. Mevcut share’i o tek klasörden bütün D: sürücüsüne genişlettim, tam erişimi ayrı bir share hesabına kilitledim, tailnet üzerinden Finder’da mount ettim.
Finder’da bütün sürücü, okuma/yazma: macFUSE yok, Recovery mode yok, reboot yok. C:\‘ye Finder’da neredeyse hiç ihtiyacım olmuyor; olduğunda da RDP zaten tam masaüstünü veriyor. Dev hayatı D:\‘de geçiyor, o yüzden mount edilen de D:\.
Aynı ağdaki iki makine arasında dosya taşıyordum; SMB tam da bunun için vardı. SSHFS ise bende olmayan bir problemi (SMB’siz, güvenilmeyen bir ağ) ödemek istemediğim bir bedelle çözüyordu: bir kernel extension.
Sonra Tersine Döndü: Mac de Aynı Muameleyi İstiyor
Buraya kadar bütün oklar tek yönü gösteriyordu: Mac’ten box’a. Ama hedef sessizce büyümüştü — Claude’u ve agent’ları telefondan da yönetmek, en sonunda bir chat uygulamasından: bir mesaj atmanın evdeki bir agent run’ını tetiklediği bir uygulamadan.
“Bir agent çalıştıran” bir chatbot, işin özünde, SSH’la girip bir komut çalıştırmaktan başka bir şey değil. Yani erişilebilir olması gereken box değil, Mac: Claude’la konuşan, agent’ları koordine eden makine.
Böylece Mac de aynı sunucu muamelesini gördü, bu kez içeriye dönük:
- Remote Login (SSH): telefon tailnet üzerinden Mac’e SSH’lar,
claude‘u çalıştırır. Bütün mesele tek satırda bu; chatbot da onun üstüne geçirilmiş ince bir wrapper’dan ibaret. - File Sharing (SMB): tek bir paylaşılan Mac klasörü iOS Files uygulamasında görünüyor. Bilerek tek tuttum: ortak alanı paylaş, makineyi ifşa etme.
- Screen Sharing (VNC): yalnızca bir GUI şart olduğunda Mac’in ekranını iPhone’dan görüp kontrol et.
Box’ta açtığım o üç yüzeyin aynısı, şimdi laptop’ta.
Laptop Problemi: Kapağını Kapattığında Uyuyor
Kapağı kapatınca MacBook uyur: tünel düşer, telefon ona ulaşamaz. macOS’ta bunun anahtarı var:
sudo pmset -c disablesleep 1
O -c önemli: yalnızca şarjdayken. Kapak kapalı, fişe takılı, harici ekran yok — laptop tıpkı bir masaüstü box gibi uyanık kalıyor.
Bunu her koşulda açmayı reddettim: batarya matematiği kötü. Bir laptop’ı kapağı kapalı, çantada, batarya moduyla şarjı %0’a inene kadar uyanık tutmak, hava akışı olmadığından ısıyı içeride hapsediyor ve tam bir drain-cycle’a zorluyor — bataryaya gerçek zarar. Onun için yalnızca AC’yle sınırladım; batarya modundayken hâlâ uyuyor, ihtiyaç anında elimde isteğe bağlı bir yol modu duruyor:
sudo pmset -b disablesleep 1 # battery too — for the road, then turn it back OFF
Bu, kayda değer bir fişsiz çalışma süresi kazandırıyor; seni kurtaracak bir timer da yok. Eve varınca geri kapattığım, bilinçli ve geçici bir tercih bu.
macOS’un Etrafından Dolaşmana İzin Vermediği Keychain Tuzağı
Telefonun SMB klasörü, login sırasında bir LaunchAgent üzerinden Mac’e şifresiz auto-mount olsun istiyordum. Sürekli başarısız oluyordu — ama yalnızca background agent olarak; Finder’da elle mount ettiğimde anında oluyordu.
Sebebi bir macOS güvenlik sınırı: login keychain GUI session’a aittir, macOS de onu bir background LaunchAgent’a vermez; agent da o yüzden saklı şifreyi okuyamıyor. Çözüm ya GUI session’da çalışan bir Login Item, ya da mount config’ine gömülü bir credential.
O inline credential’ı yazmak, tam da kendi tooling’imin beni yine durdurduğu yer oldu. Daha önce ~/.ssh/config‘i yazmayı reddeden aynı guardrail, şimdi bir share şifresini inline etmeyi reddetti. Bu build’de üçüncü kezdi; üçüncü kez de haklıydı.
Mac’i Tailnet’e Kilitlemek, ve Kanıtlamak
Günlük kullandığım laptop’ta SSH, SMB ve VNC açmak, bir dolapta duran headless bir box’ta açmaktan daha büyük mesele: kafedeki wifi’a bağlı herkes o portları yoklayabilir. O yüzden Mac’e de box’a yaptığımı yaptım: yalnızca tailnet, bir pf firewall anchor’ıyla.
# /etc/pf.anchors/tailnet-lock — pass the tailnet + localhost, block the rest
pass in quick proto tcp from <tailnet-range> to any port {22, 445, 5900}
pass in quick proto tcp from 127.0.0.1 to any port {22, 445, 5900}
block drop in quick proto tcp to any port {22, 445, 5900}
Yüklendi, boot’ta da kalıcı. Buna körü körüne güvenmedim. Box’tan Mac’e iki ayrı yoldan vurup kanıtladım: düz LAN üzerinden, Mac’in kendi subnet adresine, üç port da timeout verdi; tailnet üzerinden, Mac’in tailnet adresine, üçü de açık döndü.
Üç portta da LAN kapalı, tailnet açık. Tailnet üzerinden erişilebiliyor; aynı anda üstünde durduğu sıradan LAN adresinden değil.
Sırada, box’ı gerçek bir dev workstation’a çevirmek var — bir de herhangi bir install komutundan zor çıkan o “bir kez kur, herkes için kur” disiplini.