SSH Bağlantısı Reddediliyor: Nedenleri ve Çözüm Yolları

SSH bağlantınız 'Connection refused' hatasıyla başarısız oluyor mu? Bu makalede bağlantı reddinin nedenlerini ve adım adım çözüm yollarını öğrenin.

I
ITWISE
1 görüntülenme
SSH Bağlantısı Reddediliyor: Nedenleri ve Çözüm Yolları

SSH Bağlantısı Neden Reddedilir?

SSH bağlantısı kurmaya çalışırken connect to host example.com port 22: Connection refused hatası alırsanız, bu durumun SSH kimlik doğrulamasından önce gerçekleştiğini unutmayın. Bu hata, hedef sunucuda ilgili portta dinleyen bir servisin olmadığını veya bir güvenlik duvarı/ag cihazının talebi aktif olarak reddettiğini gösterir.

Bağlantı reddedilmesiyle sonuçlanan yaygın nedenler şunlardır:

  1. SSH Sunucusunun Durmuş Olması: SSH servisi (sshd) çalışmıyor olabilir.
  2. Yanlış Host veya Port: Bağlantı kurmaya çalıştığınız hostname/port doğru olmayabilir.
  3. Dinleyici Ayarının Yanlışlığı: SSH servisi sadece localhost (127.0.0.1) gibi belirli bir arayüze bağlı olabilir.
  4. Güvenlik Duvarı Reddi: Güvenlik duvarı kuralları bağlantıyı engelliyor olabilir.
  5. Port Yönlendirmesinin Yanlışlığı: Yönlendirme yapılan makineye SSH bağlantısı kurulamıyor olabilir.

    Önemli Not: Eğer bağlantı reddedilme yerine zaman aşımı alıyorsanız, bu durum tamamen farklı bir sorundur (örneğin, ağdaki bir cihazın cevap vermemesi).

    Başlangıç Kontrolleri (İstemci Tarafından)

    SSH sunucusundaki ayarlara geçmeden önce, bağlantı kurmaya çalıştığınız host ve portun doğru olduğunu doğrulayın:

    1. Hostname’in Doğru Adrese Çözümlendiğinden Emin Olun

    getent ahosts example.com

    Bu komut, hostname’in hangi IP adreslerine çözümlendiğini gösterir. Eğer eski bir sunucuya veya yanlış bir adrese yönlendiriliyorsanız, DNS kaydını düzeltin veya doğrudan IP adresini kullanarak bağlanmayı deneyin.

    2. SSH Bağlantısını Ayrıntılı Olarak Test Edin

    ssh -vvv user@example.com

    Bu komut, bağlantı süreci hakkında ayrıntılı bilgi verir. Örnek çıktının nasıl görüneceği aşağıda verilmiştir:

    debug1: Connecting to example.com [203.0.113.10] port 22.
    ssh: connect to host example.com port 22: Connection refused

    Bu çıktı, hostname’in 203.0.113.10 adresine çözümlendiğini ve port 22’ye yapılan bağlantının reddedildiğini gösterir.

    3. Port’un Açık Olduğunu Doğrulayın

    SSH kimlik doğrulamasını başlatmadan önce TCP portunun açık olup olmadığını test edin:

    nc -vz example.com 22

    Eğer sunucu varsayılan port 22 yerine farklı bir port kullanıyorsa, o portu test edin:

    nc -vz example.com 2222
    ssh -p 2222 user@example.com

    4. IPv4 ve IPv6 Farklılıklarını Kontrol Edin

    Hostname’in hem IPv4 hem de IPv6 adresleri olabilir. Bir DNS kaydı yanlış sunucuya işaret ediyor olabilir. Her adres ailesini ayrı ayrı test edin:

    ssh -4 user@example.com
    ssh -6 user@example.com

    Sunucu Tarafındaki Kontroller

    Yukarıdaki kontrollerden sonra bağlantı sorunu devam ediyorsa, sorunun sunucu tarafında olduğunu varsayabiliriz. Bu durumda, sunucuya doğrudan erişim (bulut konsolu, sanal makine konsolu, fiziksel terminal vb.) gerekmektedir.

    1. SSH Sunucusunun Dinlediğinden Emin Olun

    Sunucuda SSH sunucusunun (sshd) port 22’de dinlediğinden emin olun:

    sudo ss -ltnp 'sport = :22'

    Bu komutun çıktısında herhangi bir sonuç dönüyorsa (örneğin, sshd veya systemd), SSH sunucusu port 22’de dinliyor demektir. Eğer boş sonuç dönerse, hiçbir işlem port 22’ye bağlantı kabul etmiyor demektir.

    2. SSH Sunucusunun Yapılandırma Dosyasını Kontrol Edin

    SSH sunucusunun hangi port ve adreslerde dinlediğini doğrulamak için:

    sudo sshd -T | grep -E '^(port|listenaddress) '

    Tipik bir çıktının görünümü şu şekilde olabilir:

    port 22
    listenaddress [::]:22
    listenaddress 0.0.0.0:22

    Bu çıktı, SSH sunucusunun hem IPv4 hem de IPv6 adreslerinde port 22’de dinlediğini gösterir. Eğer farklı bir port belirtilmişse, bağlantı kurarken -p seçeneğini kullanın ve güvenlik duvarının o portu açtığından emin olun.

    3. SSH Servisinin Durumunu Kontrol Edin

    Linux dağıtımları SSH servisi için farklı systemd birim adları kullanır:

    • Ubuntu ve Debian: ssh.service ve ssh.socket
    • Fedora, RHEL ve türevleri: sshd.service

    Ubuntu ve Debian için:

    sudo systemctl status ssh.service ssh.socket

    Ubuntu 22.10 ve sonraki sürümlerinde varsayılan olarak ssh.socket kullanılır. Bu durumda hem servisi hem de soketi kontrol etmek önemlidir:

    sudo systemctl status ssh.socket

    Eğer ssh.socket aktif ve port 22’yi yönetiyorsa, ssh.service henüz aktif olmayabilir. Bu durumda servisin durmuş olması sorun değildir. Eğer soket devre dışıysa, etkinleştirin ve başlatın:

    sudo systemctl enable --now ssh.socket

    Eğer sistemde ssh.socket kullanılmıyorsa, servisi doğrudan etkinleştirin:

    sudo systemctl enable --now ssh

    Fedora, RHEL ve türevleri için:

    sudo systemctl status sshd
    sudo systemctl enable --now sshd

    Eğer servis failed durumunda ise, yapılandırma dosyasını doğrulayın:

    sudo sshd -t

    Bu komut herhangi bir hata vermiyorsa, yapılandırma doğrudur. Hata alırsanız, belirtilen satırı düzeltin ve servisi yeniden başlatın.

    4. SSH Sunucusunu Yükleyin

    Bazı minimal Linux kurulumlarında sadece SSH istemcisi bulunur, sunucu bulunmaz. Bu durumda openssh-server paketini yükleyin:

    Ubuntu, Debian ve Türevleri

    sudo apt update
    sudo apt install openssh-server

    Paket kurulum sırasında genellikle SSH servisini otomatik olarak başlatır. Kurulumdan sonra port 22’de dinleyen bir işlem olup olmadığını ss komutuyla doğrulayın.

    Fedora, RHEL ve Türevleri

    sudo dnf install openssh-server
    sudo systemctl enable --now sshd

    5. Dinlenen Adresi Kontrol Edin

    SSH sunucusu normal çalışıyor olabilir, ancak sadece loopback arayüzünde (127.0.0.1) veya belirli bir özel adreste dinliyor olabilir. Bu durumda yerel bağlantı çalışırken uzaktan bağlantı reddedilir.

    sshd -T komutuyla listenaddress ayarlarını inceleyin. Örneğin, 127.0.0.1:22 sadece yerel IPv4 bağlantılarını kabul eder. Ana yapılandırma dosyası /etc/ssh/sshd_config olup, ayrıca /etc/ssh/sshd_config.d/ dizinindeki dosyalar da okunabilir.

    Yapılandırmayı değiştirmeden önce konsol erişiminizin açık olduğundan emin olun ve değişiklikleri sudo sshd -t komutuyla doğrulayın. Ubuntu’da socket aktivasyonu kullanılıyorsa, socket’in de yeniden yüklenmesi gerekir.

    Güvenlik Duvarı Kontrolleri

    Güvenlik duvarı, bağlantı reddedilmesinin en yaygın ikinci nedenidir. Genellikle bağlantı reddi yerine zaman aşımıyla sonuçlanan DROP kuralları bulunurken, REJECT kuralları bağlantı reddine neden olur.

    1. UFW (Uncomplicated Firewall) Kullanıyorsanız

    UFW kurallarını listeleyin:

    sudo ufw status numbered

    Eğer SSH portu 22 ise, OpenSSH profiline izin verin:

    sudo ufw allow OpenSSH

    Özel bir port kullanıyorsanız, doğrudan o portu açın:

    sudo ufw allow 2222/tcp

    2. firewalld Kullanıyorsanız

    Öncelikle aktif bölgedeki izin verilen servisleri listeleyin:

    sudo firewall-cmd --list-services

    Eğer SSH servisi eksikse, hem geçici hem de kalıcı olarak ekleyin:

    sudo firewall-cmd --add-service=ssh
    sudo firewall-cmd --permanent --add-service=ssh

    Özel bir port kullanıyorsanız, portu ekleyin:

    sudo firewall-cmd --add-port=2222/tcp
    sudo firewall-cmd --permanent --add-port=2222/tcp

    Port Yönlendirme ve Dış Güvenlik Duvarlarını Kontrol Edin

    Eğer SSH sunucuya yerel ağdan bağlanabiliyor ancak internetten bağlanamıyorsanız, sorun yönlendirme ayarlarında olabilir. Router, sanal makine platformu veya bulut sağlayıcısının port yönlendirme kurallarını kontrol edin:

    • Dış DNS kaydının doğru sunucuya işaret ettiğinden emin olun.
    • Yönlendirme yapılan portun, SSH sunucusunun dinlediği portla aynı olduğundan emin olun.
    • Bulut güvenlik duvarlarının bağlantıları DROP edip zaman aşımına neden olabileceğini unutmayın. Edge cihazları ise talebi reddedebilir veya yanlış makineye yönlendirebilir.

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

    SSH yapılandırması değiştirdikten sonra bağlantı reddediliyor:

    sudo sshd -t komutunu çalıştırın ve herhangi bir hatayı düzeltin. Ubuntu’da socket aktivasyonu kullanılıyorsa, Port veya ListenAddress değişikliğinden sonra systemd’yi yeniden yükleyin, ssh.socket servisini yeniden başlatın ve konsol erişimini kapatmadan önce ss komutuyla dinleyiciyi doğrulayın.

    Yerelhost’a bağlanabiliyor ancak sunucu adresine bağlanamıyorum:

    ListenAddress ayarlarını ve dış arayüz için güvenlik duvarı kurallarını kontrol edin. Eğer SSH sadece 127.0.0.1 veya ::1 adresinde dinliyorsa, uzaktan bağlantı kabul etmez.

    IPv4 çalışıyor ancak IPv6 reddediliyor:

    Sunucu, IPv6 adresi için AAAA kaydına sahip olabilir ancak dinleyici IPv6’da çalışmıyor olabilir. ssh -4 ve ssh -6 komutlarını karşılaştırın, ardından DNS kaydını düzeltin veya SSH’yi doğru IPv6 adresinde dinleyecek şekilde yapılandırın.

    Sadece belirli bir istemci adresi reddediliyor:

    Kaynak belirli bir güvenlik duvarı kuralı veya Fail2ban gibi bir araç, o adresi engelliyor olabilir. Güvenlik duvarı kurallarını inceleyin ve Fail2ban yüklüyse sudo fail2ban-client status sshd komutuyla SSH jail’ini kontrol edin.

    SSH sunucuya ulaşıyor ancak 'Permission denied' hatası alıyorum:

    Bu durumda ağ yolu ve dinleyici çalışıyor demektir, sorun kimlik doğrulamasındadır. Bu durumda SSH Permission denied (publickey) rehberini takip edin.

    Sonuç

    Port testi başarılı olduktan sonra SSH, anahtar doğrulamasına veya kimlik doğrulama aşamasına geçmelidir. Hizmeti internete açmadan önce SSH sertleştirme en iyi uygulamalarını inceleyin ve mümkünse güvenlik duvarı erişimini sınırlandırın.

    Ek Kaynaklar

Kaynak

Linuxize