SSH Komutu: Güvenli Uzak Bağlantı Kurma Rehberi

Uzak sunuculara bağlanmak, dosya transferi yapmak, tünel açmak… Bunların hepsi günlük sysadmin hayatının vazgeçilmez parçaları. SSH de tam bu noktada devreye giriyor ve onlarca yıldır güvenli uzak erişimin temel taşı olmaya devam ediyor. Bu yazıda SSH komutunu her yönüyle ele alacağız; temel kullanımdan ileri seviye senaryolara kadar gerçek dünyada işe yarayacak pratik bilgiler paylaşacağım.

SSH Nedir ve Neden Bu Kadar Önemli?

SSH (Secure Shell), ağ üzerinden iki bilgisayar arasında şifreli ve güvenli iletişim kurmanı sağlayan bir protokoldür. 1995 yılında Telnet ve rlogin gibi güvensiz protokollerin yerini almak üzere geliştirildi. Bugün neredeyse her Linux sunucusunda, macOS’ta ve Windows 10/11’de standart olarak bulunuyor.

Neden SSH kullanıyoruz?

  • Tüm bağlantı trafiği şifrelenir, araya girme (man-in-the-middle) saldırılarına karşı korumalıdır
  • Parola yerine anahtar çifti (public/private key) ile kimlik doğrulama yapılabilir
  • Port yönlendirme ve tünel oluşturma gibi gelişmiş özellikler sunar
  • Dosya transferi (scp, sftp) için altyapı sağlar
  • Komut çalıştırma, dosya düzenleme, servis yönetimi gibi tüm uzak işlemleri kapsar

Temel SSH Kullanımı

En basit haliyle SSH kullanımı şu şekildedir:

ssh kullanici@sunucu_adresi

Örneğin bir web sunucusuna bağlanmak istiyorsun:

ssh [email protected]
ssh [email protected]

İlk kez bağlandığında SSH sana sunucunun parmak izini (fingerprint) gösterir ve onaylamak isteyip istemediğini sorar. Burada yes yazarak devam ettiğinde bu bilgi ~/.ssh/known_hosts dosyasına kaydedilir ve bir dahaki bağlantıda otomatik olarak doğrulanır.

Farklı Port Kullanımı

Sunucular genellikle güvenlik amacıyla SSH portunu varsayılan 22’den farklı bir porta alır. Bu durumda -p parametresini kullanırsın:

ssh -p 2222 [email protected]
ssh -p 22022 [email protected]

Bu arada eğer sunucunu yönetiyorsan, SSH portunu 22’den değiştirmek brute-force saldırılarını önemli ölçüde azaltır. Tam bir güvenlik çözümü değil ama güzel bir ek katman.

Farklı Kullanıcı Adıyla Bağlanma

Bazen yerel kullanıcı adın ile sunucudaki kullanıcı adın farklı olabilir:

ssh -l webadmin 192.168.1.100
# Veya eşdeğeri:
ssh [email protected]

SSH Anahtar Çifti Oluşturma ve Kullanma

Parola ile bağlanmak pratik değil ve güvenlik açısından riskli. Anahtar tabanlı kimlik doğrulama hem daha güvenli hem de çok daha kullanışlı. Bir kez kurarsın, onlarca sunucuya otomatik bağlanırsın.

Anahtar Oluşturma

ssh-keygen -t ed25519 -C "is-bilgisayarim-2024"

Modern sistemlerde ed25519 algoritmasını öneriyorum. RSA’dan hem daha hızlı hem de daha güvenli. Eski sistemlerle uyumluluk gerekiyorsa RSA 4096 de kullanabilirsin:

ssh-keygen -t rsa -b 4096 -C "eski-sistem-uyumluluk"

Komut çalıştığında birkaç soru sorar:

  • Anahtarın nereye kaydedileceği (varsayılan ~/.ssh/id_ed25519 genellikle uygundur)
  • Passphrase (şifre cümlesi) – bunu boş bırakabilirsin ama üretim ortamında kesinlikle bir passphrase koymanı öneririm

Bu işlem iki dosya oluşturur:

  • ~/.ssh/id_ed25519 – özel anahtar (kimseyle paylaşma!)
  • ~/.ssh/id_ed25519.pub – açık anahtar (sunuculara kopyalanacak olan)

Açık Anahtarı Sunucuya Kopyalama

ssh-copy-id -i ~/.ssh/id_ed25519.pub kullanici@sunucu_adresi

Bu komut açık anahtarını sunucudaki ~/.ssh/authorized_keys dosyasına ekler. Artık parola sormadan bağlanabilirsin.

Manuel olarak da yapabilirsin:

cat ~/.ssh/id_ed25519.pub | ssh kullanici@sunucu_adresi "mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

SSH Config Dosyası ile Hayatı Kolaylaştırma

Her seferinde uzun SSH komutları yazmak yorucu. ~/.ssh/config dosyası bu sorunu tamamen çözüyor. Bu dosyaya bağlantı profillerini tanımlıyorsun ve kısa takma adlarla bağlanıyorsun.

nano ~/.ssh/config

Örnek bir config dosyası:

# Genel ayarlar
Host *
    ServerAliveInterval 60
    ServerAliveCountMax 3
    AddKeysToAgent yes

# Production web sunucusu
Host prod-web
    HostName 203.0.113.10
    User deploy
    Port 22022
    IdentityFile ~/.ssh/id_ed25519_prod

# Staging sunucusu
Host staging
    HostName 192.168.10.50
    User ubuntu
    Port 22
    IdentityFile ~/.ssh/id_ed25519

# Veritabani sunucusu (sadece iç ağdan erişim)
Host db-server
    HostName 10.0.0.20
    User dbadmin
    ProxyJump prod-web

Artık şu kadar kısa komutla bağlanabilirsin:

ssh prod-web
ssh staging
ssh db-server

ServerAliveInterval ve ServerAliveCountMax parametreleri bağlantının boşta kalırken kesilmesini önler. Uzun işlemler yaparken veya ağ kararsızsa çok işe yarıyor.

Uzaktan Komut Çalıştırma

SSH sadece interaktif oturum açmak için değil, uzaktan tek seferlik komut çalıştırmak için de kullanılabilir. Otomasyon scriptlerinde çok işe yarıyor:

# Disk kullanımını kontrol et
ssh [email protected] "df -h"

# Servisi yeniden başlat
ssh deploy@prod-web "sudo systemctl restart nginx"

# Birden fazla komut çalıştır
ssh [email protected] "uptime && free -m && df -h"

Bash scriptlerinde kullanımı:

#!/bin/bash
SUNUCULAR=("web1.sirket.com" "web2.sirket.com" "web3.sirket.com")

for sunucu in "${SUNUCULAR[@]}"; do
    echo "=== $sunucu ==="
    ssh deploy@$sunucu "sudo systemctl status nginx | grep Active"
done

Bu tip scriptler için anahtar tabanlı kimlik doğrulama zorunlu, çünkü parola girişi otomasyonu bozar.

SSH Tünelleme ve Port Yönlendirme

Bu konu biraz karmaşık görünebilir ama bir kez anlayınca çok güçlü bir araç olduğunu fark edeceksin.

Yerel Port Yönlendirme (Local Port Forwarding)

Diyelim ki production veritabanına direkt bağlanamıyorsun ama SSH erişimin olan bir sunucu üzerinden ulaşabiliyorsun. Yerel port yönlendirme tam bu işe yarıyor:

ssh -L 5432:db-server:5432 admin@jumper-host

Bu komut sonrası localhost:5432‘ye bağlandığında aslında db-server:5432‘ye erişmiş olursun. DBeaver veya pgAdmin ile sanki veritabanı lokaldeymiş gibi çalışabilirsin.

Daha gerçekçi bir senaryo:

# Sadece dahili ağdan erişilebilen bir web uygulamasını localhost'ta açmak
ssh -L 8080:internal-app:80 admin@vpn-server
# Artık tarayıcıda http://localhost:8080 ile uygulamaya erişebilirsin

Uzak Port Yönlendirme (Remote Port Forwarding)

Bu sefer yön tersine döner. Yerel makinendeki bir servisi uzak sunucu üzerinden erişilebilir yapmak için kullanılır:

ssh -R 8080:localhost:3000 admin@public-server

Geliştirme ortamında çalışan bir uygulamayı müşteriye göstermek için kullanışlı. Localhost:3000’deki uygulamana public-server:8080 üzerinden erişilebilir hale gelir. Ngrok gibi servislerin yaptığını SSH ile kendin yapabilirsin.

Dinamik Port Yönlendirme (SOCKS Proxy)

Tüm trafiği SSH tüneli üzerinden geçirmek istersen:

ssh -D 1080 admin@proxy-server

Tarayıcını SOCKS5 proxy olarak localhost:1080 kullanacak şekilde ayarladığında tüm web trafiğin şifreli SSH tünelinden geçer. Güvenilmez ağlarda (kafeler, havalimanları) çok işe yarıyor.

X11 Forwarding ile Grafiksel Uygulama Çalıştırma

Uzak sunucuda grafiksel bir uygulama çalıştırman gerekebilir. SSH bunu da destekliyor:

ssh -X kullanici@sunucu
# Veya daha iyi performans için:
ssh -Y kullanici@sunucu

Bağlandıktan sonra uzak sunucudaki grafiksel uygulamaları doğrudan yerel ekranında açabilirsin:

# Bağlandıktan sonra
firefox &
gedit /etc/nginx/nginx.conf &

-X güvenli mod, -Y güvenilir mod. Güvenlik açısından -X daha iyi ama bazı uygulamalar -Y gerektirebilir.

SSH Agent Kullanımı

Passphrase korumalı anahtarlarla çalışıyorsan her bağlantıda passphrase girmek can sıkıcı olabilir. SSH Agent bu sorunu çözüyor:

# Agent'ı başlat
eval $(ssh-agent -s)

# Anahtarı agent'a ekle (bir kez passphrase girersin)
ssh-add ~/.ssh/id_ed25519

# Artık passphrase sormadan bağlanabilirsin
ssh prod-web
ssh staging
ssh db-server

macOS’ta Keychain ile entegre çalışır ve sistem yeniden başlatılsa bile anahtarlar hatırlanır. Config dosyasına AddKeysToAgent yes eklemek de otomatik ekleme yapar.

SSH Güvenlik Ayarları

Sunucu tarafında (/etc/ssh/sshd_config) yapabileceğin güvenlik geliştirmeleri:

# Root ile direkt girişi engelle
PermitRootLogin no

# Parola ile girişi devre dışı bırak (sadece anahtar kullan)
PasswordAuthentication no

# Sadece belirli kullanıcılara izin ver
AllowUsers deploy admin

# Boşta kalma süresi
ClientAliveInterval 300
ClientAliveCountMax 2

# SSH protokolü 2 zorunlu (zaten varsayılan ama belirtmekte fayda var)
Protocol 2

Değişiklik sonrası servisi yeniden yükle:

sudo systemctl reload sshd
# veya
sudo service ssh reload

Önemli uyarı: sshd_config dosyasını değiştirirken mevcut oturumu kapatma. Önce yeni bir terminal sekmesinde test et, her şey yolundaysa eski oturumu kapat. Kendini kilitlemek gerçekten can sıkıcı.

SSH ile Dosya Transferi

SCP Kullanımı

# Yerel dosyayı uzak sunucuya kopyala
scp dosya.txt [email protected]:/home/admin/

# Uzak sunucudan yerel makineye kopyala
scp [email protected]:/var/log/nginx/access.log ./

# Dizin kopyalama (-r recursive)
scp -r ./proje/ deploy@prod-web:/var/www/html/

# Config dosyasındaki takma adı kullanarak
scp -P 22022 rapor.pdf admin@prod-web:/home/admin/

SFTP Kullanımı

sftp [email protected]

# SFTP komutları:
# ls, cd, pwd - uzak dizin işlemleri
# lls, lcd, lpwd - yerel dizin işlemleri
# get dosya - indir
# put dosya - gönder
# mget *.log - çoklu indirme
# bye - çıkış

ProxyJump ile Atlama Sunucuları (Jump Hosts)

Kurumsal ortamlarda direkt SSH erişimi genellikle kısıtlıdır. Önce bir jump host’a bağlanıp oradan iç sunuculara geçmen gerekir. Eski yöntem zahmetliydi ama modern SSH’da çok basit:

# Tek satırda iki sunucu üzerinden geç
ssh -J kullanici@jump-host kullanici@internal-server

# Birden fazla atlama noktası
ssh -J user@jump1,user@jump2 user@final-server

Config dosyasında tanımlamak daha pratik:

Host internal-*
    ProxyJump bastion
    User internal-admin

Host bastion
    HostName bastion.sirket.com
    User bastion-user
    IdentityFile ~/.ssh/bastion_key

Artık ssh internal-db veya ssh internal-app gibi direkt bağlanabilirsin, atlama işlemi otomatik gerçekleşir.

Verbose Mod ile Sorun Giderme

Bağlantı sorunlarında nerede takıldığını anlamak için verbose mod kullanırsın:

# Bir seviye detay
ssh -v admin@sunucu

# Daha fazla detay
ssh -vv admin@sunucu

# Maksimum detay
ssh -vvv admin@sunucu

Çıktıda hangi anahtar dosyasının denendiği, kimlik doğrulama aşamaları, ağ bağlantısı detayları gibi bilgileri görebilirsin. Sorun gidermede altın değerinde.

Sık Karşılaşılan Sorunlar ve Çözümleri

“Host key verification failed” hatası: Sunucunun SSH anahtarı değişmiş olabilir (yeniden kurulum, IP değişikliği). Eski kaydı sil:

ssh-keygen -R 192.168.1.100
# veya
ssh-keygen -R sunucu_adi

“Permission denied (publickey)” hatası: Birkaç nedeni olabilir. Önce izinleri kontrol et:

# Uzak sunucuda
chmod 700 ~/.ssh
chmod 600 ~/.ssh/authorized_keys

Bağlantı çok yavaş veya gecikmeli açılıyor: DNS çözümleme sorunu olabilir. Sunucu tarafında sshd_config dosyasına şunu ekle:

UseDNS no

“Connection refused” hatası: SSH servisi çalışmıyor ya da firewall engelliyor olabilir:

# Karşı tarafta servisi kontrol et
sudo systemctl status sshd

# Firewall kuralını kontrol et
sudo ufw status
sudo firewall-cmd --list-all

Faydalı SSH Parametreleri Özeti

-p port: Bağlantı portunu belirtir -i dosya: Kullanılacak kimlik (anahtar) dosyasını belirtir -l kullanici: Bağlanılacak kullanıcı adını belirtir -L yerel:uzak_host:uzak_port: Yerel port yönlendirme yapar -R uzak:yerel_host:yerel_port: Uzak port yönlendirme yapar -D port: Dinamik SOCKS proxy oluşturur -J atlama_sunucusu: ProxyJump ile atlama sunucusu belirtir -X: X11 yönlendirmeyi etkinleştirir -N: Uzaktan komut çalıştırmaz, sadece tünel için kullanılır -f: Arka planda çalışır (genellikle -N ile birlikte) -v / -vv / -vvv: Verbose (ayrıntılı) mod, sorun gidermede kullanılır -o secenek=deger: Tek seferlik config seçeneği belirtir -A: Agent yönlendirmeyi etkinleştirir -C: Bağlantıyı sıkıştırır (yavaş bağlantılarda faydalı) -q: Sessiz mod, uyarı mesajlarını gizler -t: Pseudo-terminal zorla tahsis eder (sudo gerektiren komutlar için)

Gerçek Dünya Senaryosu: Production Deploy Scripti

#!/bin/bash
# Basit bir production deploy scripti

PROD_SERVER="deploy@prod-web"
APP_DIR="/var/www/html/uygulama"
LOCAL_BUILD="./dist"

echo "Deploy basliyor..."

# Eski yedek al
ssh $PROD_SERVER "cp -r $APP_DIR ${APP_DIR}_backup_$(date +%Y%m%d_%H%M%S)"

# Yeni dosyaları kopyala
scp -r $LOCAL_BUILD/* $PROD_SERVER:$APP_DIR/

# Servisi yeniden başlat ve durumu kontrol et
ssh $PROD_SERVER "sudo systemctl restart nginx && sleep 2 && systemctl is-active nginx"

if [ $? -eq 0 ]; then
    echo "Deploy basarili! Nginx calisiyor."
else
    echo "HATA! Nginx baslatılamadi. Rollback yapiliyor..."
    ssh $PROD_SERVER "sudo cp -r ${APP_DIR}_backup_* $APP_DIR && sudo systemctl restart nginx"
fi

Bu script gerçek iş hayatında kullandığım basit ama etkili bir örnektir. CI/CD pipeline kurmanın mümkün olmadığı küçük projelerde hayat kurtarıyor.

Sonuç

SSH, bir sysadmin’in en temel ve en çok kullandığı araçlardan biri. Temel bağlantıdan anahtar yönetimine, port tünellemeden jump host kullanımına kadar çok geniş bir yelpazede iş görüyor. Bu yazıda ele aldığım konuların büyük çoğunluğunu günlük işlerinde kullanacaksın.

En önemli tavsiyem şu: Anahtar tabanlı kimlik doğrulamayı bir an önce benimseyip parola tabanlı girişi devre dışı bırak. Bu tek adım bile güvenlik seviyeni dramatik ölçüde artırır. Sonra ~/.ssh/config dosyasını düzenli tutmayı alışkanlık haline getir, hangi sunucunun hangi anahtar ve kullanıcıyla bağlandığını not düşmek ilerleyen zamanlarda çok işine yarayacak.

SSH’ı ne kadar çok kullanırsan o kadar çok özelliğini keşfedeceksin. Tünelleme özelliği başlı başına birçok aracın yerini tutabiliyor. Güvenli, hızlı ve evrensel bir araç olarak SSH, sysadmin araç kutusunun merkezinde olmaya uzun yıllar daha devam edecek.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir