deniz.in

Piyasalar

Hava durumu

Hava durumu yükleniyor

· kaynak Hacker News – Front Page (native)

Vincent Bernat'ın rehberi yalnızca OpenSSH ve Nginx ile HTTP tünelleri kuruyor

Hacker News'e ulaşan bir blog yazısı, kendi sunucunuz üzerinden bir localhost servisini ortaya çıkarmayı — ticari bir tünel servisi yerine imzalı ve süreli URL'lerle — OpenSSH remote forward'ları, wildcard DNS ve Nginx kullanarak anlatıyor.

Vincent Bernat'ın rehberi yalnızca OpenSSH ve Nginx ile HTTP tünelleri kuruyor

Rehberin kapsadığı konular

Hacker News'in ana sayfasına ulaşan Vincent Bernat'ın blog yazısı, çoğu sunucuda zaten çalışan yalnızca iki bileşenle — OpenSSH ve Nginx ile — ngrok'a benzer bir tünel servisi kurmayı adım adım anlatıyor. İhtiyaç duyulan senaryo tanıdıktır: localhost:8080'de çalışan, yarım kalmış bir önizlemeyi başka bir yerdeki bir çalışma arkadaşının görmesi gerekir.

Bernat mevcut seçenekleri üç gruba ayırıyor: ngrok veya Cloudflare Quick Tunnels gibi barındırılan ticari servisler; frp veya localtunnel gibi kendi istemcilerini gerektiren self-hosted araçlar; ve standart bir SSH istemcisini kabul eden ama karşı tarafta özel bir SSH sunucusu gerektiren sish gibi projeler. Onun kurulumu bu bağımlılıkların hiçbirine ihtiyaç duymuyor.

Tünel nasıl çalışıyor

Temel mekanizma SSH'nin remote port forwarding özelliği. ssh -N -R 0:localhost:8080 server komutunu çalıştırmak, uzak sunucudan bir dinleme portu açmasını ve bağlantıları yerel servise aktarmasını ister. Port olarak 0 vermek sunucunun boş bir port seçmesine izin verir; bu çakışmaları önler ama istemcinin numarayı önceden bilmemesi anlamına gelir — rehber bu sorunu daha sonra çözüyor.

Sunucuda Nginx, tünel başına bir alt alan adını o porta eşler. Düzenli ifadeli bir server_name, p41535.ssh.example.com gibi host adlarındaki port rakamlarını yakalar ve istekleri eşleşen loopback portuna proxy'ler. Yardımcı kadro ise sunucuyu işaret eden bir wildcard DNS kaydı ve Let's Encrypt'ten bir wildcard TLS sertifikası. Bernat sertifikaları ayrı bir Route 53 bölgesi tarafından yönetilen DNS-01 challenge'ları ile üretiyor ve yenilemeyi NixOS otomatikleştiriyor; ancak herhangi bir ACME kurulumu işe yarardı.

Sonuç şimdiden işlevsel, ama yazının da belirttiği gibi, genel internet ile tüneldeki içerik arasındaki tek şey port numarası ve portlar basitçe numaralandırılabilir. Diğer araçlar bunu, host adına tahmin edilemez bir dizgi gömerek engeller.

İmzalı, süreli URL'ler

Bu boşluğu kapatmak için rehber, Nginx'in yerleşik ngx_http_secure_link modülüne yöneliyor. Bu modül, sona erme zaman damgası, port numarası ve paylaşılan bir gizli anahtar üzerinden bir hash hesaplar ve hash'i eşleşmeyen her isteği reddeder. Hash base64 kodludur ve alan adları büyük/küçük harfe duyarsız olduğu için alt alan adında yerleştirilemez; bunun yerine URL'nin userinfo alanına, yani @ işaretinden önceki bölüme konur. Tarayıcılar ve curl gibi istemciler bunu HTTP Basic authentication kimlik bilgileri olarak iletir, Nginx bunu $remote_user değişkeni üzerinden açığa çıkarır ve bir map yönergesi hash'i ve zaman damgasını ayıklar.

Hata yönetimi açıktır: eksik veya yanlış hash 401 döndürür ve yanında kimlik bilgisi isteyen bir WWW-Authenticate başlığı bulunur; geçerli ama süresi dolmuş bir bağlantı ise 410 döndürür. Yapılandırma ayrıca proxy'lemeden önce Authorization başlığını kaldırır ve WebSocket bağlantılarının gerektirdiği upgrade başlıklarını ayarlar.

Bir bağlantı üretmek tek satırlıktır: zaman damgasını, portu ve gizli anahtarı openssl md5 üzerinden geçirin, özeti base64 ile kodlayın ve karakterleri URL-güvenli bir alfabeye çevirin.

Kullanılabilir kılan bir sarmalayıcı

Kalan zahmet, OpenSSH'nin hangi portu seçtiğini öğrenmektir; çünkü bu hiçbir ortam değişkeninde açığa çıkmaz. Bernat'ın sunucuya http-over-ssh adıyla kurulan yardımcı betiği, kendi süreç soyağacında yürüyerek ilgili sshd-session süreçlerini bulur, sonra ss komutunu etkileşimsiz sudo ile kullanarak bu süreçlerin dinlediği portları listeler. Her port için 24 saat geçerli bir token hesaplar, tam paylaşılabilir URL'yi yazdırır ve SSH oturumu açık kalsın diye uyur.

RemoteCommand kullanan kısa bir ~/.ssh/config girdisi her şeyi birleştirir; böylece tek bir komut — http-over-ssh alias'ına remote forwarding yapan ssh — portu tahsis eder ve bir hakemciye verilmeye hazır bir URL yazdırır. Düz betiğin yanında bir NixOS modülü sürümü de sunuluyor.

Neden önemli

Ticari tünel servisleri kullanışlıdır, ama potansiyel olarak özel trafiği üçüncü bir taraf üzerinden yönlendirir ve şartları ile paketleri değişebilen harici bir bağımlılık eklerler. Yazı, eşdeğer bir yeteneğin birçok operatörün zaten elinde tuttuğu altyapının içinde olduğunu gösteriyor: OpenSSH ve Nginx çalışan bir VPS, artı bir wildcard DNS kaydı ve sertifika. Temeldeki desen — geçici remote forward'lar, regex tabanlı virtual host'lar ve süre dolan imzalı bağlantılar — blog önizlemelerinin çok ötesinde, webhook testinden geçici demolara kadar yeniden kullanılabilir. Ödünler de gerçektir: bir sunucuya, kontrol ettiğiniz bir alan adına ve Nginx yapılandırmasına dair bir rahatlığa ihtiyacınız var. Her iki yazılımı zaten çalıştıran herkes için bu, bir SaaS aboneliğini daha bırakmak için bir şablondur.

  • #ssh
  • #nginx
  • #self-hosting
  • #tunneling
  • #devops