Başlangıç Seviyesi Rehber + İleri Seviye İpuçları #
Bir VPS kuruyorsanız, bir uygulama dağıtıyorsanız veya bir bulut sunucusunu yönetiyorsanız, sunucunuza SSH ile bağlanmanız gerekir. Bu, DevOps ve backend geliştirmede en temel becerilerden biridir, ancak aynı zamanda en çok yanlış anlaşılan becerilerden biridir.
Bu kılavuz, SSH’nin ne olduğunu, nasıl güvenli bir şekilde kullanılacağını ve sizi deneyimli bir sistem yöneticisi gibi hissettirecek birkaç zaman kazandıran püf noktası hakkında bilgi verecektir.

🧠 SSH Nedir? #
SSH (Secure Shell), bir sunucuya uzaktan güvenli şekilde bağlanmanızı sağlayan şifreli bir protokoldür. Bunu, bilgisayarınızdan komutlar yazdığınız ve bu komutların başka bir yerdeki sunucuda güvenli bir şekilde yürütüldüğü güvenli bir uzak terminal olarak düşünün.
SSH arka planda şunları yapar: #
- Kimliğinizi doğrular (şifre veya anahtar aracılığıyla)
- Gönderdiğiniz her şeyi şifreler
- Gözetleme, tahrifat veya ortadaki adam saldırılarını önler
🛠️ SSH İstemcisi Yüklü Değilse Nasıl Yüklenir? #
Ubuntu / Debian (APT) #
sudo apt update
sudo apt install openssh-client
Sunucu tarafı için:
sudo apt install openssh-server
Fedora (DNF) #
sudo dnf install openssh-clients
Sunucu için:
sudo dnf install openssh-server
sudo systemctl enable --now sshd
Arch Linux (Pacman) (Manjaro, EndeavourOS vb.) #
sudo pacman -S openssh
Sunucu servisini başlatmak için:
sudo systemctl enable --now sshd
Kurulum Kontrolü #
ssh -V
Çıktı örneği:
┌──(aom㉿pc)-[~]
└─$ ssh -V
OpenSSH_9.9p1 Debian-3, OpenSSL 3.4.0 22 Oct 2024
İlk kez bağlanıyorsanız, ana bilgisayara güvenip güvenmediğinizi soran bir mesaj göreceksiniz. “yes” diyerek onaylayın, SSH bunu gelecekteki bağlantılar için hatırlayacaktır.
🔧 1. SSH Temel Bağlantı Şekli #
Linux / macOS #
Bağlanmak için:
ssh kullanici@sunucu_ip_adresi
Windows (PowerShell) #
Windows 10+ ile SSH dahili olarak gelir:
ssh kullanici@sunucu_ip_adresi
🔑 2. SSH Anahtar Eşleştirmesi Oluşturma (PASSWORDLESS Login) #
Şifre ile Giriş Yapmak Neden Kötü Bir Fikirdir? #
SSH üzerinden şifre kullanmak işe yarar, ancak bu yöntem artık modası geçmiş ve en önemlisi güvensizdir. Herkes özellikle kullanılan zayıf bir şifre ise brute force saldırısı ile kırmaya çalışabilir veya tahmin edebilir. Daha iyi bir yöntem, daha hızlı, daha güvenli ve otomatik olan SSH anahtar kimlik doğrulamasıdır.
SSH Anahtar Kimlik Doğrulamasını Ayarlama (En İyi Yöntem): #
Adım 1: SSH Anahtar Eşleştirmenizi Oluşturun #
Önerilen ‘ed25519’ (modern, hızlı, güvenli). İhtiyaca göre RSA 4096 da kullanılabilir. Makinenizde şunu çalıştırın :
# ed25519 (önerilen)
ssh-keygen -t ed25519 -C "[email protected]"
# veya RSA 4096
ssh-keygen -t rsa -b 4096 -C "[email protected]"
Örnek çıktı şu şekilde olacaktır.
┌──(aom㉿onder-pc)-[~]
└─$ ssh-keygen -t ed25519 -C "[email protected]"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/home/aom/.ssh/id_ed25519):
Enter passphrase for "/home/aom/.ssh/id_ed25519" (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/aom/.ssh/id_ed25519
Your public key has been saved in /home/aom/.ssh/id_ed25519.pub
The key fingerprint is:
SHA256:hN9nilJEkQm7hNWsc/CC0JwQ55+lXKgo5oa37oaHFA8 [email protected]
The key's randomart image is:
+--[ED25519 256]--+
| o=..o+o+ |
| .o+o.== |
| .o.=+= |
| E ..=+Xo. |
|..= . *+S . o |
|+o . . . + |
|o=. . . . |
|+.o. . |
| =+ |
+----[SHA256]-----+
Bu işlem iki dosya oluşturur:
-Özel anahtar: ~/.ssh/id_ed25519: bunu asla paylaşmayın.
-Genel anahtar: ~/.ssh/id_ed25519.pub : bu dosya sunucuya yüklenir.
┌──(aom㉿pc)-[~]
└─$ ls -l .ssh/
total 32
-rw------- 1 aom aom 399 Nov 18 12:14 id_ed25519
-rw-r--r-- 1 aom aom 95 Nov 18 12:14 id_ed25519.pub
-rw------- 1 aom aom 3381 Nov 18 11:36 id_rsa
-rw-r--r-- 1 aom aom 739 Nov 18 11:36 id_rsa.pub
-rw------- 1 aom aom 6010 Jul 18 17:17 known_hosts
-rw------- 1 aom aom 5174 Jul 18 17:17 known_hosts.old
Uygun izinleri ayarlayın:
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519
chmod 644 ~/.ssh/id_ed25519.pub
Adım 2: Public Key Sunucuya Kopyalayın #
En kolay yöntem:
ssh-copy-id -i ~/.ssh/id_ed25519.pub kullanıcı@sunucu-ip
Manuel yöntem (ssh-copy-id mevcut değilse):
# Local üzerinde
cat ~/.ssh/id_ed25519.pub
# çıktıyı kopyala
# daha sonra sunucuda, authorized_keys (yetkili_anahtarlara) ekle
mkdir -p ~/.ssh && chmod 700 ~/.ssh
echo "kopyaladığınız-public-key-satırını-buraya-yapıştırın" >> ~/.ssh/authorized_keys
chmod 600 ~/.ssh/authorized_keys
Şimdi giriş yapmayı deneyin:
ssh kullanıcıadı@sunucu_ip
Şifre sorulmaz. Sorunsuz. Anında, güvenli erişim.
🔒 3. SSH Yapılandırma Dosyası ile Kolay Bağlantı #
Bilgisayarınızda ~/.ssh/config dosyası oluşturun:
# Tercih ettiğiniz editor hangisi ise:
nano ~/.ssh/config
Host sunucum
HostName <sunucu_ip_adresi>
User <kullanıcı_adı>
IdentityFile ~/.ssh/id_ed25519
Port 22 # port değiştirmek güvenlik açısından faydalı olabilir.
Artık sadece kullanacağınız komut :
ssh sunucum
Arka Planda Neler Oluyor? #
SSH ile bağlandığınızda gerçekte neler oluyor?
Key Exchange (Anahtar Değişimi): SSH şifreleme algoritmalarını belirler.
Authentication (Kimlik Doğrulama): Açık/özel anahtar çiftiniz kimliğinizi doğrular.
Encryption (Şifreleme): Her komut ve yanıt güvenli bir şekilde şifrelenir.
Bu nedenle SSH, bağımsız geliştiricilerden kurumsal sistem yöneticilerine kadar herkes tarafından güvenilir bir protokol olarak kabul edilmektedir.
🛡️ 4. SSH Güvenlik En İyi Uygulamaları #
1) Parola ile girişleri kapatın #
Sunucuda /etc/ssh/sshd_config dosyasında:
PasswordAuthentication no
Olarak bulunduğundan emin olun ve ardından SSH servisini yeniden başlatın:
sudo systemctl restart ssh
2) Root ile SSH bağlantısını kapatın #
PermitRootLogin no
3) SSH portunu değiştirmeniz tavsiye edilir. (opsiyonel) #
Port 2222
4) Fail2Ban ile brute-force koruması sağlayın. #
sudo apt install fail2ban
🔐 5. SSH ile Dosya Transferi #
scp ile dosya yükleme
#
scp dosya.txt kullanici@sunucu:/hedef/klasor
scp ile dosya indirme
#
scp kullanici@sunucu:/klasor/log.txt .
rsync ile gelişmiş transfer
#
rsync -avzP dosya/ kullanici@sunucu:/var/www/
📁 6. SSH Tünelleme (Port Forwarding) #
Uzak bir sunucudaki bir servise, güvenli bir şekilde ve sanki kendi bilgisayarında çalışıyormuş gibi bağlanmanı sağlar. Bunu SSH üzerinden şifrelenmiş bir tünel açarak yapar.
🛡️ Güvenlik İçin Servisleri Dış Dünyaya Açmamak #
Üretim sunucularında (prod) çoğu servis güvenlik nedeniyle dışarı açılmaz: -MySQL -PostgreSQL -Redis -Kibana -Admin panelleri -ElasticSearch -Prometheus
Bu servisler sadece localhost üzerinden erişilebilsin diye ayarlanır. Ama sen geliştirici ya da admin olarak erişmek istersin. İşte SSH tüneli burada devreye girer 🔽
Örnek:
ssh -L 3306:localhost:3306 user@sunucu
Artık kendi bilgisayarındaki 3306, uzak sunucudaki 3306’ya bağlanır. Sanki MySQL lokalinde çalışıyormuş gibi işlerinizi halledebilirsiniz!
🧱 Firewall veya NAT Arkasındaki Sunuculara Erişim #
Sunucu 10.0.0.x gibi özel bir ağdaysa internetten erişemezsin. Ama aynı ağa erişebilen bir ara sistem (jump host) varsa şunu yapabilirsin:
ssh -L 8080:10.0.0.15:80 jumphost
→ Artık 10.0.0.15’in 80 portuna ulaşırsın, hem de dış dünyaya açmadan.
🧩 Sadece Sunucudan Erişilebilen Web Uygulamalarını Görmek #
Örn: -Admin dashboard -Jenkins -Grafana -PhpMyAdmin -Local intranet uygulaması
Bu uygulamalar 127.0.0.1’de çalışır, dışarı açılamaz. SSH tünelleme = bunları tarayıcında görmek
ssh -L 8080:localhost:3000 user@sunucu
Tarayıcıda aç:
http://localhost:8080
🔄 Reverse Tunnel (Uzak Makinenin Yerel Makineye Bağlanması) #
Tam tersi senaryo. Mesela bir IoT cihazı NAT arkasında. Sen ona bağlanamazsın ama o sana bağlanabilir. Reverse tunnel ile cihaz sana doğru tünel açar:
ssh -R 9000:localhost:22 user@sunucu
Bu sayede o makineye sen bağlanırsın.
🔐 Şifreli Trafik İhtiyacı Olan Durumlar (Ek Güvenlik) #
Bazı servislerin trafiği şifresizdir: -VNC -Redis -MySQL -PostgreSQL (opsiyonel)
Bu servisleri direkt internetten kullanırsan şifreler, veriler, her şey açık gider. SSH tüneli trafiklerini otomatik olarak şifreler.
🔍 Dışarı Açılmaması Gereken Servisleri Test Etmek #
Test / QA aşamalarında: -Sunucuya erişim açmak istenmez -Güvenlik politikası izin vermez -Firewall ile uğraşmak istemezsin -Tünel ile anında erişirsin.
####🚀 VPN’e Alternatif Basit Bağlantı
Tünelleme mini bir “şifreli VPN” gibi davranır.Küçük işler için VPN kurmaya gerek kalmaz.
####🧪 Geliştiriciler İçin Lokalde Test Ama Sunucudaki Veriyi Kullanma
Örnek: Geliştirici kendi bilgisayarındaki backend uygulamasını test ediyor ama gerçek veritabanı prod/stage sunucusunda.
ssh -L 5432:localhost:5432 user@sunucu
Uygulama prod DB’ye, sanki lokalmiş gibi bağlanır.
🧷 Kısacası SSH Tünelleme Kullanırsan: #
| Senaryo | Kullanılır mı? |
|---|---|
| Güvenli uzaktan servis erişimi | ✔ |
| Firewall / NAT arkasına erişim | ✔ |
| Localhost’ta çalışan servislere erişim | ✔ |
| Portu dışarı açmadan erişim | ✔ |
| Trafiği şifrelemek | ✔ |
| Mini VPN gibi kullanmak | ✔ |
🧪 7. SSH Agent Kullanımı (Anahtar Yöneticisi) #
SSH Agent, SSH anahtarlarını güvenli bir şekilde RAM’de tutan ve bağlantı sırasında otomatik olarak kullanan küçük bir arka plan programıdır. Kısacası:
👉 SSH ile bağlanırken her seferinde anahtar parolası girmemek için kullanılır.
📌 Ama olay sadece bu kadar değil — aslında SSH Agent çok daha güçlüdür. SSH Agent:
👌 Şifreyi tek sefer girersin
🚀 Sonraki tüm SSH bağlantıları otomatik yapılır
🔐 Özel anahtar hiçbir zaman sunucuya kopyalanmaz
🧠 Çoklu sunucu yönetenler ve geliştiriciler için vazgeçilmezdir
🔗 Git işlemlerini çok hızlandırır
🛡 Jump host senaryosunda en güvenli çözümdür
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
| Senaryo | Kullanılır mı? |
|---|---|
| Çok sayıda sunucuya bağlanırken şifre tekrar tekrar girilmesin | ✔ |
| GitHub / GitLab / Bitbucket SSH işlemlerinde parolasız kullanım | ✔ |
| SSH anahtarlarını daha güvenli yönetmek gerektiğinde | ✔ |
| Jump host/bastion üzerinden iç sunuculara geçiş sırasında | ✔ |
| Tek seferlik değil sürekli SSH bağlantısı kullanılan işlerde | ✔ |
| Özel anahtarları uzak sunuculara kopyalamadan kimlik doğrulama gerektiğinde | ✔ |
🚀 8. Profesyonel İpuçları #
- Sürekli bağlantı düşüyorsanız
~/.ssh/configiçerisine:
# İstemci her 60 saniyede bir sunucuya “hala orada mısın?” paketi yollar.
ServerAliveInterval 60
# 2 kez yanıt alamazsa bağlantıyı koparır. Böylece "boşta kalmış ama donmuş" SSH oturumu bekletmez.
ServerAliveCountMax 2
Tüm kullanıcılar için sistem genelinde ayarlamak istersen:
Linux’ta: /etc/ssh/ssh_config dosyasına aynı satırları ekleyebilirsin fakat bu tüm SSH bağlantılarını etkiler.
- Komutları uzaktan çalıştırma ihtiyacınız var ise:
ssh kullanici@sunucu "systemctl status nginx"
- Sunuclar için çoklu alias tanımlayabilirsiniz.
~/.ssh/configdosyasını örnekte ki gibi düzenleyebilirsiniz:
Host prod-server
HostName 10.10.0.10
User admin
IdentityFile ~/.ssh/prodkey
Host staging-server
HostName 10.10.0.20
User ubuntu
IdentityFile ~/.ssh/stagekey
Host dev-server
HostName 10.10.0.30
User admin
IdentityFile ~/.ssh/devkey
🚀 9. Sık Karşılaşılan Sorunların Giderilmesi #
Permission Denied (İzin Reddedildi) (publickey) → Anahtar izinlerinizi kontrol edin:
chmod 600 ~/.ssh/id_rsa
chmod 700 ~/.ssh
Zaman Aşımı veya Bağlantı Reddedildi → SSH’nin sunucuda çalıştığından emin olun:
sudo systemctl status ssh
Sunucu IP’si Değişti mi? → Eski fingerprint (parmak izini) kaldırın:
ssh-keygen -R server_ip
Bunları da elinizin altında bulundurun, zaman kazanmanızı sağlayacaktır.
🏁 Sonuç #
Bu rehber ile SSH’ı yalnızca “bağlanmak” için değil; daha güvenli, hızlı ve profesyonel şekilde kullanmak için de gerekli temelleri aktarmaya çalıştık. Faydalı olmuştur umarım. :)