Ana içeriğe geç
SSH ile Sunucunuza Doğru Şekilde Bağlanın
  1. Posts/

SSH ile Sunucunuza Doğru Şekilde Bağlanın

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

🧠 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/config iç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/config dosyası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. :)

Related