SSH Tunneling ile Sunucudan Localhost’a Güvenli Erişim Rehberi
SSH tunnel ile uzak sunucudan kendi localhost’unuza güvenli erişim kurun. Local port, bastion, firewall ve doğrulama adımlarını net şekilde görün.
Bir VDS/VPS/Dedicated sunucudan kendi bilgisayarınızdaki localhost hizmetine erişmeniz gerektiğinde klasik yöntemler (port açma, yönlendirme) hem risklidir hem de her zaman mümkün değildir. SSH tunnel (tünel) ise trafiği şifreleyerek uzak sunucudan yereldeki porta güvenli bir yol oluşturur. Bu rehberde; "sunucu localhost’uma nasıl bağlanır?" sorusunun net, uygulanabilir cevabını; port planlaması, güvenlik kontrolleri ve doğrulama testleriyle birlikte anlatacağız.
SSH Tunneling Ne Sağlar? (Neden localhost erişimi için tercih edilir?)
SSH tunneling, SSH bağlantısı üzerinden belirli bir port trafiğini başka bir noktaya taşıyabilir. En pratik senaryo şudur:
- Sizde bir servis çalışır:
http://localhost:3000veyalocalhost:5432 - Uzak sunucuda (VDS/VPS) bunun doğrudan ağ erişimi yoktur
- SSH ile tünel kurarsınız: Uzak sunucunun bir portu, sizin yerel servisinizin yanıtlarını getirir
Bu sayede: - Yerel makinenizde port açmadan (veya sadece SSH portunu açık tutarak) erişim sağlanır - Trafik şifrelenir (üstelik uygulama katmanı genelde internete hiç çıkmaz) - Güvenlik duvarı (firewall) ve yönlendirme karmaşası azalır
İki temel mod: Local forward ve Remote forward
Genelde iki yaklaşım karşınıza çıkar:
- Local forwarding (
ssh -L): Uzak sunucu değil, sizin lokal makinenizden gelen isteklerin uzak tarafta başka porta taşınması. - Remote forwarding (
ssh -R): Uzak sunucuda açılan portun, sizin lokalinizdeki porta bağlanması.
"Uzak sunucudan localhost’a erişmek" hedefinde çoğu zaman -R (remote forward) doğru seçimdir. Ancak bazı mimarilerde -L daha mantıklı olabilir; bu rehberde iki yaklaşımın farkını somut örneklerle anlatacağız.
Kurulum Öncesi Net Kontrol Listesi
Tunnel kurmadan önce şu maddeleri netleştirin. Bu kontroller olmadan kurulum "çalışmıyor" hissine dönüşür.
1) Uzak sunucuda SSH erişimi ve yetki
- Uzak sunucuda SSH erişiminiz olmalı
- Kullanıcı hesabınızın
sshkomutunu çalıştırması yeterli olmalı - Eğer SSH anahtarı (key) kullanıyorsanız, anahtarınız uzak sunucuda ekli olmalı (
~/.ssh/authorized_keys)
2) Yerel (localhost) servisin gerçekten ayağa kalktığından emin olun
Örnek: Yerelde web uygulamanız localhost:3000 dinliyorsa:
- http://localhost:3000 adresi kendi makinenizde tarayıcıyla yanıt vermeli
- Servis 127.0.0.1 veya ::1 üzerinde dinliyor olmalı (varsayılan çoğu geliştirme sunucusunda budur)
3) SSH sunucusunda GatewayPorts ve AllowTcpForwarding
Tünelin nasıl görünür olacağını belirler.
- Uzak sunucunun SSH daemon ayarlarında AllowTcpForwarding genellikle yes olmalı
- GatewayPorts ayarı remote forward için kritik olabilir
Uzak sunucuda yönetici değilseniz bu ayarları değiştiremeyebilirsiniz. Bu durumda alternatif yaklaşım olarak yerelde -L ile gidiş-geliş yapılır.
Senaryo A: Uzak sunucudan sizin localhost’unuza erişim (Remote forward -R)
Bu senaryoda amaç:
- Siz lokal makinenizde localhost:3000 çalıştırıyorsunuz
- Uzak sunucuda bir port açıyorsunuz (örnek 127.0.0.1:9001)
- Uzak sunucu üzerinden http://127.0.0.1:9001 çağrıldığında istek lokal makinenizdeki localhost:3000 servisine gider
Komut şablonu
Yerel makinenizde (kendi bilgisayarınız) şu mantıkla çalışırsınız:
ssh -N -R 127.0.0.1:9001:127.0.0.1:3000 user@VDS_IP
Komutun parçaları:
- -N: komut çalıştırma, sadece tünel aç
- -R [bind_address:]remote_port:local_host:local_port
- 127.0.0.1:9001: Uzak sunucuda sadece loopback üzerinden erişilebilir kısım
- 127.0.0.1:3000: Yerel makinenizdeki hedef servis
Uzak sunucuda test
Uzak sunucuya SSH ile bağlanıp test edin:
- Aynı makinede çalışan tünel portu:
curl http://127.0.0.1:9001(web ise HTML döner)
Burada kritik nokta: 127.0.0.1 kullandığınızda tünel sadece sunucunun kendi içinde erişilebilir olur. Böylece internetten rastgele erişim riski düşer.
Güvenlik notu: Neden 0.0.0.0 yerine 127.0.0.1?
-R 0.0.0.0:9001:... gibi bir kullanım, tünel portunu sunucunun dış arayüzlerine açabilir. Bu çoğu durumda istenmez.
Net yaklaşım:
- Önce 127.0.0.1 ile açın
- Gerekirse kontrollü şekilde açın
Senaryo B: Yerelde erişim, uygulamayı uzak sunucuda test etme (Local forward -L)
Bazı ekiplerde şu hedef olur: - Siz uzak sunucuda geliştirme/test yapıyorsunuz - Uzak sunucudaki komutlar lokal servisle konuşmalı
Bu senaryoda çoğu zaman -L ile tünel açmak daha pratik olur. Mantık tersine döner:
- Yerelde bir port açarsınız
- Uzak sunucu üzerinden bu portu kullanmak için ayrıca bir yaklaşım gerekebilir (ör. SSH üzerinden ikinci adım)
En temel -L şablonu:
ssh -N -L 9001:127.0.0.1:3000 user@VDS_IP
Bu komut:
- Yerel makinenizde localhost:9001 üzerinden gelen isteği
- Uzak SSH sunucusu üzerinden değil, tünelin karşı ucuyla yerel hedefe bağlar
Bu yüzden "tek bir komutla" uzak sunucunun doğrudan yerel servise ulaşması için genelde -R daha doğrudur. Ancak ortamlar farklıysa -L de kullanılabilir. Karar verirken şu soruyu net sorun:
- Tüneli kimin oluşturması gerekiyor? (yerel mi uzak mı)
- Ulaşım hangi yönde? (uzak sunucu → yerel mi, yerel → uzak mı)
Port planlama: Çakışma ve dinleme davranışı
Tunnel komutlarında port seçimi sık hata kaynağıdır.
Hedef portu çakıştırmayın
- Yerelde servis portunuz
3000 - Uzak sunucuda tünel portunuz
9001gibi ayrı bir sayı olmalı - Hem yerelde hem uzakta çalışan servisler ile çakışmamalı
Port kontrolü komutları
- Yerelde:
ss -lntp | grep 3000- Uzak sunucuda:
ss -lntp | grep 9001
SSH Tünelini Arka Planda Çalıştırma
ssh -N komutu terminali kilitler. Süreklilik gerekiyorsa arka planda çalıştırmak gerekir.
Basit arka plan
ssh -N -R 127.0.0.1:9001:127.0.0.1:3000 user@VDS_IP &
Doğrulanabilir yöntem: autossh
Sürekli tünel gereksiniminde yeniden bağlanmayı otomatikleştiren araçlar tercih edilir. autossh, bağlantı kopunca tüneli toparlar. Kurulum dağıtıma göre değişir; hedef her zaman şudur:
- Tünel kesilince manuel iş bırakmamak
Net kullanım hedefi, tüneli "gün içinde bozulup sonra unutma" durumundan kurtarmaktır.
Doğrulama ve Hata Ayıklama (Çalışmıyor ise)
Aşağıdaki testler, tünelin hangi katmanda kırıldığını anlamanıza yardımcı olur.
1) SSH bağlantısı hatasız mı?
Önce basit doğrulama yapın:
- ssh user@VDS_IP ile oturum açın
- Sonra tüneli ekleyin
2) Uzak sunucuda port dinliyor mu?
Tünel açıldıktan sonra uzak sunucuda:
- ss -lntp | grep 9001
Dinleme yoksa:
- SSH daemon ayarları (örn. AllowTcpForwarding) kısıtlıyor olabilir
- Komut satırında yanlış hedef var olabilir
3) Yerel servis gerçekten yanıt veriyor mu?
Yerelde:
- curl http://127.0.0.1:3000 (web servis ise)
- psql gibi protokollerde uygun istemci ile test
4) Firewall engelliyor mu?
Genelde 127.0.0.1 bağlaması firewall ihtiyacını azaltır ama yine de:
- Uzak sunucuda güvenlik grupları (SG) veya OS firewall kuralı loopback dışına taşan senaryolarda devreye girebilir
5) Sunucu SSH ayarı: GatewayPorts
Şu hedef var:
- Tüneli sadece loopback ile tutmak
Bu yüzden çoğu örnekte 127.0.0.1 özellikle kullanıldı.
Veri tabanı gibi servislerde dikkat: TCP davranışı ve kimlik doğrulama
Web servisleri tünelle genellikle sorunsuz çalışır. Ama veritabanı (MySQL/PostgreSQL) gibi servislerde ekstra noktalar vardır.
Örnek: Yerel PostgreSQL ile uzak sunucudan bağlanma
Yerelde PostgreSQL localhost:5432 dinliyorsa:
- Tünel:
ssh -N -R 127.0.0.1:15432:127.0.0.1:5432 user@VDS_IP
- Uzak sunucuda
psqlile bağlantı: psql -h 127.0.0.1 -p 15432 -U dbuser dbname
Burada kritik olan:
- PostgreSQL kullanıcınızın yetkileri
- pg_hba.conf ayarlarının kimlik doğrulama politikasını bozup bozmadığı
Sık yapılan 7 hata ve net düzeltme
- Yanlış yön (L yerine R kullanmak): Hedef "uzak → yerel" ise
-Rtercih edin. - Port çakışması: Uzak ve yerel portları birbirinden farklı seçin.
- Servis
localhostyerine başka arayüzde dinlemiyor: Yerelde127.0.0.1dinliyorsa tünelde aynı IP’yi hedefleyin. 0.0.0.0ile açıp herkese maruz kalmak: Varsayılan olarak127.0.0.1kullanın.- SSH daemon kısıtları:
AllowTcpForwardingkapalı olabilir; kontrol edin. - Hedef portu yanlış yazmak: Komutta
local_portveremote_portyerlerini karıştırmayın. - Tünel açıldı sanıp doğrulamayı atlamak: Uzak sunucuda
ssvecurl/istemci testiyle portun gerçekten aktif olduğunu görün.
Hızlı karar tablosu: Hangi tünel tipi ne zaman?
| Hedef | En uygun seçenek | Örnek komut mantığı |
|---|---|---|
| Uzak sunucu, sizin yerel localhost’unuza bağlansın | Remote forward (-R) | ssh -R 127.0.0.1:remotePort:127.0.0.1:localPort |
| Siz yerelde uzaktaki servise ulaşmak istiyorsunuz | Local forward (-L) | ssh -L localPort:127.0.0.1:remotePort |
| Sadece test, kısa süreli erişim | ssh -N ... |
Terminalde açık ya da arka plan |
| Sürekli çalışma ve kopma durumunda toparlama | autossh | otomatik yeniden bağlanma |
Sonuç: İlk denemeyi doğru kurun, sonra kilitleyin
Önce en basit hedefi belirleyin: "Uzak sunucu mu yerel servise ulaşacak?" Bu sorunun cevabına göre -R veya -L seçin. Sonra tüneli loopback (127.0.0.1) üzerinden açın, port çakışmasını giderin ve uzak sunucuda ss ile dinleme olup olmadığını doğrulayın. Kurulum çalıştıktan sonra tüneli arka plana alın (gerekirse autossh) ve sadece test süresi kadar açık tutun.
İlk adım olarak, yerel bir web servisi (ör. localhost:3000) ile yukarıdaki -R örneğini uygulayıp uzak sunucuda curl http://127.0.0.1:9001 sonucunu görün. Bu doğrulama geçmeden veritabanı gibi daha kritik servisleri tünelle bağlamayın.
Hosting karşılaştırması yapmaya hazır mısın?
100+ firmanın fiyatlarını tek tıkla karşılaştır, en uygun paketi bul.
Hosting Karşılaştır →İlgili Yazılar
SSH Key ile Şifreli Girişi Devre Dışı Bırakma Rehberi
SSH key ile giriş yapıp şifre tabanlı oturumu kapatın: adım adım yetkilendirme, güvenli test ve kilitlenmeyi önleme kontrolleri.
WP-CLI ile sunucudan WordPress yönetimi: Rehber
WP-CLI ile WordPress eklenti kurma, güncelleme, yedek alma ve sorun giderme adımlarını komut seviyesinde öğrenin. Hata azaltın.
2FA (Çift Doğrulama) Hosting Hesabı Neden Zorunlu?
Hosting hesabında 2FA, şifre çalınması ve yetkisiz giriş riskini ciddi azaltır. Hangi senaryolarda zorunlu olduğunu net anlatıyoruz.
Hosting’de Inode limiti nedir, neden önemli? (Net rehber)
Hosting’de inode limiti nedir, ne zaman sorun çıkarır? Dosya sayısı yüksek siteler için inode limitinin etkisini ve çözüm adımlarını öğrenin.
