Yalnızca SOCKS konuşan bir uygulamanın sıradan bir VPN'de konuşacak bir şeyi yoktur, çünkü tünel paket taşır ve uygulama bir proxy uç noktası ister. OpenSSH bu uç noktayı erişim sahibi izin verdiğinde sağlayabilir, çünkü dinamik yönlendirme bir SSH oturumunu yerel bir proxy'ye dönüştürür. Ardından ayrı tutulması gereken iki atlama vardır: SSH ana bilgisayarına ulaşan tünel ve o ana bilgisayarın daha sonra açtığı bağlantı. Bunları ayırmak hem düzenin neden çalıştığını hem de neyi asla yapmayacağını açıklar.

SSH dinleyicisinin neye dönüştüğü ve dönüşmediği

Dinamik yönlendirme, SSH istemcisini yerelde dinlemeye ve bağlanan her şeyle SOCKS4 veya SOCKS5 konuşmaya zorlar. Her istek bir hedef adlandırır ve SSH sunucusu sonraki bağlantıyı açar, bu yüzden hedef araması karşı tarafta gerçekleşebilir. Bu, uygulama düzeyinde TCP yönlendirmedir, tüm cihaz için bir VPN değildir. Ne bir UDP ilişkilendirmesi, ne ICMP, ne de proxy ayarlarını tamamen yok sayan uygulamalar için bir şey taşır. SSH sunucusundan uygulamaya atlama da tünelinizin içinde değildir; hedef yalnızca bilinen ağlardan trafik kabul ettiğinde bu önemlidir.

Önkoşullar gerçektir: SSH ana bilgisayarına bir yol, yetkili bir hesap, doğrulanmış bir sunucu ana bilgisayar anahtarı ve yönlendirme izni. Hiçbirini proxy oluşturmaz ve sonuncusu genellikle ilk eksik olanıdır. Başka bir şeyi hata ayıklamadan önce dördünü de doğrulayın, çünkü istemci tarafından hata aynı görünür, hangisi eksik olursa olsun.

Onu loopback üzerinde açık bir bağlantı noktasıyla başlatın

Kullanılmayan bir yerel bağlantı noktası seçin ve adresi boş bırakmak yerine onu açıkça loopback'e bağlayın. Aşağıdaki üç seçenek her biri bir nedenle vardır.

ssh -D 127.0.0.1:1080 -NT -o ControlPath=none -o ExitOnForwardFailure=yes \
  [email protected]

-N uzak komutu atlar ve -T sözde terminali atlar, böylece oturum yalnızca yönlendirme için vardır. ExitOnForwardFailure dinleyici oluşturulamadığında istemcinin çıkmasını sağlar, istediğiniz yönlendirme olmadan çalışmak yerine. ControlPath=none oturumu kendi yönlendirmelerini ekleyebilecek mevcut bir çoklanmış bağlantının dışında tutar. Loopback dinleyiciyi LAN dışında tutar, ancak paylaşılan bir makinede bu bir yetkilendirme sınırı değildir, çünkü diğer yerel süreçler de ona ulaşabilir. OpenSSH istemci başvurusu tüm bu bayrakları belgeler ve loopback uyarısı dinleyen soketin ne olduğundan kaynaklanır.

Adları proxy'nin içinden gönderin, çevresinden değil

Bir SOCKS5 istemcisi hedefi kendisi çözebilir veya proxy'den çözmesini isteyebilir ve bu seçim hangi çözümleyicinin yanıt vereceğini belirler. socks5h ile curl ana bilgisayar adını proxy üzerinden gönderir, böylece arama SSH sunucusunda gerçekleşir. Düz socks5 ile dizüstü bilgisayar önce çözer ve yalnızca bağlantı yolculuk eder; bu, ad içsel olduğunda amacı sessizce boşa çıkarır. Aşağıdaki istek ayrıca proxy'siz listeyi boşaltır, böylece devralınan bir NO_PROXY değeri onu proxy'nin çevresinden geçiremez.

curl -sS --noproxy '' --proxy socks5h://127.0.0.1:1080 https://app.corp.example/health

Sertifika doğrulaması ve uygulamanın kendi oturum açması hâlâ geçerlidir, çünkü proxy ikisinin de yerini almaz. İki arama kalır: dizüstü bilgisayar izin verilen VPN ve DNS yoluyla SSH ana bilgisayarına ulaşmalıdır ve SSH sunucusu uygulama adını kendisi çözmelidir. İkincisi herhangi bir trafik proxy'den geçmeden önce tek başına test edilebilir.

ssh [email protected] getent hosts app.corp.example

İzin verilen bir hedefi kanıtlayın, sonra oturumu kapatın

Politikanın izin verdiği bir hedefi ve reddetmesi gereken bir hedefi test edin, çünkü çalışan bir yönlendirme yalnızca dinleyicinin çalıştığını kanıtlar ve fazlasını değil. Uygulama SSH sunucusunun seçtiği kaynak adresi görür ve bu dizüstü bilgisayarınızın tünel adresi değildir. Uzak ucun bağlantıları kaynağa göre günlüğe kaydettiği yerde, bir istek reddedildiğinde ilk bakılacak şey bu farktır.

Oturumu, onu sahiplenen süreç aracılığıyla durdurun, ilgisiz bir kabuğu öldürerek değil. Sonra dinleyicinin gittiğini doğrulayın, çünkü hâlâ yanıt veren bir bağlantı noktası gerçekten kapatmadığınız bir oturumdur. Yalnızca bu alıştırmanın getirdiği proxy ayarını kaldırın ve uygulama yapılandırmasının geri kalanını olduğu gibi bırakın. Bir yönlendirme kuralı taşıyan gözetimsiz terminal bir hizmet değildir ve kalıcı bir proxy onaylanmış bir yaşam döngüsüne ihtiyaç duyar, unutulmuş bir pencereye değil.

ss -ltn | grep 1080

Bu düzenin düzeltemeyeceği arızalar

Bazı belirtiler doğrudan yukarıdaki sınırlara işaret eder ve onları erken tanımak bir öğleden sonra proxy hata ayıklamasından tasarruf ettirir. Tablo, gördüklerinizi genellikle ne anlama geldiğiyle eşler. Son sütundaki her şey bir tasarım sorusudur, yapılandırma hatası değildir.

What you seeWhat it usually meansWhere to look
The app connects and nothing followsIt ignores proxy settings entirelyIts own network settings, not the SSH session
A name resolution error for the destinationThe SSH server cannot resolve itServer resolver and search domains
A UDP-only application failsDynamic forwarding carries TCP onlyThis arrangement cannot serve it
curl works, the browser does notThe browser is not using the socks5h endpointBrowser proxy configuration
The listener answers after the session endedAnother process owns port 1080The ss output, then the owning process

İlk üç satır, insanların yanlış teşhis ettiği satırlardır, çünkü her biri proxy'nin kendisiyle ilgili bir hata yerine bir bağlantı denemesi üretir. Dizüstü bilgisayarda çözülen bir ad, sunucunun çözümleyicisi hakkında hiçbir şey söylemez ve arıza bunun yerine sertifika ya da zaman aşımı sorunu olarak okunur. Yalnızca UDP kullanan uygulamalar tasarımın dışında durur, içinde bozuk değildir ve hiçbir ek ssh seçeneği bunu değiştirmez. Tarayıcı satırı, proxy ayarlarının uygulama başına olduğunu hatırlatan olağan nottur. Son satır, kapatma kontrolünün neden var olduğunu gösterir: hâlâ dinleyen bir bağlantı noktası artık ona başka bir şeyin sahip olduğu anlamına gelir.

İlgili makaleler