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:
- SSH Sunucusunun Durmuş Olması: SSH servisi (sshd) çalışmıyor olabilir.
- Yanlış Host veya Port: Bağlantı kurmaya çalıştığınız hostname/port doğru olmayabilir.
- Dinleyici Ayarının Yanlışlığı: SSH servisi sadece localhost (127.0.0.1) gibi belirli bir arayüze bağlı olabilir.
- Güvenlik Duvarı Reddi: Güvenlik duvarı kuralları bağlantıyı engelliyor olabilir.
- 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.comBu 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.comBu 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 refusedBu çıktı, hostname’in
203.0.113.10adresine çö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 22Eğ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.com4. 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.comSunucu 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,
sshdveyasystemd), 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:22Bu çı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
-pseç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.servicevessh.socket - Fedora, RHEL ve türevleri:
sshd.service
Ubuntu ve Debian için:
sudo systemctl status ssh.service ssh.socketUbuntu 22.10 ve sonraki sürümlerinde varsayılan olarak
ssh.socketkullanılır. Bu durumda hem servisi hem de soketi kontrol etmek önemlidir:sudo systemctl status ssh.socketEğer
ssh.socketaktif ve port 22’yi yönetiyorsa,ssh.servicehenü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.socketEğer sistemde
ssh.socketkullanılmıyorsa, servisi doğrudan etkinleştirin:sudo systemctl enable --now sshFedora, RHEL ve türevleri için:
sudo systemctl status sshd sudo systemctl enable --now sshdEğer servis
faileddurumunda ise, yapılandırma dosyasını doğrulayın:sudo sshd -tBu 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-serverpaketini yükleyin:Ubuntu, Debian ve Türevleri
sudo apt update sudo apt install openssh-serverPaket kurulum sırasında genellikle SSH servisini otomatik olarak başlatır. Kurulumdan sonra port 22’de dinleyen bir işlem olup olmadığını
sskomutuyla doğrulayın.Fedora, RHEL ve Türevleri
sudo dnf install openssh-server sudo systemctl enable --now sshd5. 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 -Tkomutuylalistenaddressayarlarını inceleyin. Örneğin,127.0.0.1:22sadece yerel IPv4 bağlantılarını kabul eder. Ana yapılandırma dosyası/etc/ssh/sshd_configolup, 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 -tkomutuyla 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
DROPkuralları bulunurken,REJECTkuralları bağlantı reddine neden olur.1. UFW (Uncomplicated Firewall) Kullanıyorsanız
UFW kurallarını listeleyin:
sudo ufw status numberedEğ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/tcp2. firewalld Kullanıyorsanız
Öncelikle aktif bölgedeki izin verilen servisleri listeleyin:
sudo firewall-cmd --list-servicesEğ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/tcpPort 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ı
DROPedip 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 -tkomutunu çalıştırın ve herhangi bir hatayı düzeltin. Ubuntu’da socket aktivasyonu kullanılıyorsa,PortveyaListenAddressdeğişikliğinden sonra systemd’yi yeniden yükleyin,ssh.socketservisini yeniden başlatın ve konsol erişimini kapatmadan öncesskomutuyla dinleyiciyi doğrulayın.Yerelhost’a bağlanabiliyor ancak sunucu adresine bağlanamıyorum:
ListenAddressayarlarını ve dış arayüz için güvenlik duvarı kurallarını kontrol edin. Eğer SSH sadece127.0.0.1veya::1adresinde 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 -4vessh -6komutları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 sshdkomutuyla 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
- Ubuntu ve Debian:


