Ubuntu Server üzerinde SSH erişimini kapatmak çoğu zaman yalnızca ssh.service servisini durdurmak kadar basit görünür. Ancak bazı Ubuntu sürümlerinde ve OpenSSH yapılandırmalarında systemd socket activation mekanizması devrede olabilir.
Bu durumda SSH servisini durdurmuş olsanız bile sistem 22 numaralı portu dinlemeye devam edebilir ve yeni bir bağlantı geldiğinde SSH servisini tekrar başlatabilir.
Bu nedenle SSH erişimini gerçekten tamamen kapatmak için yalnızca ssh.service değil ssh.socket biriminin de kontrol edilmesi gerekir.
Bu makalemde ssh.service ile ssh.socket arasındaki farkı, karşılaşılan uyarıların nedenini ve SSH erişiminin güvenli şekilde nasıl tamamen devre dışı bırakılacağını ele alacağız.
Karşılaşılan Durum
SSH servisini kapatmak için aşağıdaki komutları çalıştırdığımızı düşünelim.
sudo systemctl stop ssh
sudo systemctl disable ssh.service
Bu işlemler sonrasında aşağıdaki uyarıyla karşılaşabiliriz:
Stopping 'ssh.service', but its triggering units are still active:
ssh.socket
Benzer şekilde:
sudo systemctl stop sshd
komutunda da şu mesaj görülebilir:
Stopping 'sshd.service', but its triggering units are still active:
ssh.socket
Bu mesajın anlamı oldukça nettir. SSH servisi durdurulmuştur ancak onu yeniden başlatabilecek olan ssh.socket hâlâ aktiftir. Yani yeni bir SSH bağlantısı geldiğinde systemd, ssh.service servisini yeniden devreye alabilir.
ssh.service ve ssh.socket Arasındaki Fark Nedir?
SSH erişimini doğru şekilde yönetebilmek için öncelikle bu iki systemd biriminin görevini anlamak gerekir.
ssh.service
ssh.service OpenSSH sunucusunun asıl servisidir.
Durumunu kontrol etmek için:
systemctl status ssh.service
Servisi durdurmak için:
sudo systemctl stop ssh.service
komutu kullanılabilir. Ancak sistemde socket activation aktifse yalnızca ssh.service servisini durdurmak yeterli değildir.
ssh.socket
ssh.socket, SSH bağlantılarını dinleyen systemd socket birimidir.
Durumunu görmek için:
systemctl status ssh.socket
Eğer aşağıdakine benzer bir durum görüyorsanız:
Active: active (listening)
sistem SSH bağlantılarını hâlâ dinliyor demektir.
Yeni bir SSH bağlantısı geldiğinde ssh.socket, gerekli olması durumunda ssh.service servisini otomatik olarak başlatabilir. Bu nedenle yalnızca SSH servisini durdurup socket birimini açık bırakmak SSH erişimini tamamen kapatmak anlamına gelmez.
SSH Erişimini Tamamen Kapatma
SSH’nin hem mevcut durumda durdurulmasını hem de yeniden başlatılmasının engellenmesini istiyorsak en etkili yöntem şudur:
sudo systemctl mask --now ssh.socket ssh.service
Bu komutta iki önemli işlem gerçekleştirilir:
--nowparametresi aktif olan servisi ve socket birimini hemen durdurur.maskişlemi ise bu birimlerin systemd tarafından tekrar başlatılmasını engeller.
İşlem sonrasında durumu kontrol edebiliriz:
systemctl status ssh.socket ssh.service
Beklenen durum genel olarak şu şekilde olmalıdır:
Loaded: masked
Active: inactive (dead)
Bu durumda SSH hem durdurulmuş hem de yeniden başlatılması engellenmiş olur.
TCP 22 Portunun Gerçekten Kapandığını Kontrol Etme
SSH servisini kapattıktan sonra yapılması gereken en önemli kontrollerden biri, TCP 22 portunun gerçekten dinlenmediğini doğrulamaktır.
Bunun için:
sudo ss -lntp | grep ':22'
komutunu kullanabiliriz.
SSH tamamen kapalıysa bu komutun herhangi bir çıktı üretmemesi gerekir. Tüm dinlenen TCP portlarını görmek için ise:
sudo ss -lntp
komutu kullanılabilir. Eğer aşağıdakine benzer bir satır görüyorsanız:
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:*
TCP 22 portu hâlâ dinleniyor demektir. Bu durumda 22 numaralı portu hangi process’in kullandığını ayrıca incelemek gerekir.
Mevcut SSH Oturumları Devam Edebilir
ssh.service ve ssh.socket kapatılmış olsa bile daha önceden kurulmuş bazı SSH oturumları açık kalabilir.
Aktif SSH process’lerini görmek için:
ps -ef | grep sshd
veya daha temiz bir çıktı için:
pgrep -a sshd
komutunu kullanabiliriz. Eğer mevcut SSH oturumlarının da tamamen kapatılması isteniyorsa:
sudo pkill -KILL sshd
komutu kullanılabilir.
Kritik Uyarı
Bu komut mevcut SSH bağlantılarını anında sonlandırır. Eğer sunucuya o anda SSH üzerinden bağlıysanız, kendi bağlantınız da kesilecektir. Ayrıca SSH servisini öncesinde mask ettiyseniz tekrar SSH bağlantısı kuramazsınız. Bu nedenle böyle bir işlem yapılacaksa sunucuya alternatif bir erişim yöntemi bulunması önerilir.
Örneğin:
- VMware Console
- Hyper-V Console
- Proxmox Console
- iLO
- iDRAC
- IPMI
- Fiziksel konsol
- Cloud Provider Console
Önerilen Güvenli Kapatma Sırası
SSH erişimini tamamen kapatmak için aşağıdaki işlem sırası uygulanabilir.
Öncelikle socket ve servis maskelenir:
sudo systemctl mask --now ssh.socket
sudo systemctl mask --now ssh.service
Ardından durum kontrol edilir:
systemctl status ssh.socket
systemctl status ssh.service
Sonrasında TCP 22 portunun dinlenip dinlenmediği kontrol edilir:
sudo ss -lntp | grep ':22'
Mevcut SSH oturumlarının da kapatılması gerekiyorsa:
sudo pkill -KILL sshd
Son olarak port tekrar doğrulanabilir:
sudo ss -lntp | grep ':22'
Komut herhangi bir çıktı üretmiyorsa TCP 22 portunda dinleyen bir SSH servisi bulunmuyor demektir.
stop, disable ve mask Arasındaki Fark
Systemd tarafında en çok karıştırılan konulardan biri stop, disable ve mask komutlarının farkıdır.
systemctl stop
sudo systemctl stop ssh.service
Bu komut servisi o anda durdurur.
Ancak servisin daha sonra başka bir servis, socket veya yönetici tarafından yeniden başlatılmasını engellemez.
Örneğin ssh.socket aktifse SSH yeniden devreye girebilir.
systemctl disable
sudo systemctl disable ssh.service
Bu işlem SSH servisinin normal sistem açılışında otomatik olarak başlamasını engeller. Ancak servis yine manuel olarak veya başka bir systemd unit tarafından başlatılabilir. Bu nedenle;
systemctl disable ssh.service
komutu tek başına SSH erişimini tamamen kapatmak için yeterli değildir.
systemctl mask
sudo systemctl mask ssh.service
mask, servisin systemd tarafından başlatılmasını engelleyen daha güçlü bir işlemdir.
Maskelenmiş bir servis doğrudan:
sudo systemctl start ssh.service
komutuyla dahi normal şekilde başlatılamaz. Bu nedenle bir servisin güvenlik gereksinimleri nedeniyle kesin olarak devre dışı bırakılması gerekiyorsa mask kullanımı daha uygun bir yöntemdir.
Neden ssh.services Komutu Çalışmadı?
Aşağıdaki gibi bir komut kullanıldığında:
sudo systemctl disable ssh.services
şu hata alınabilir:
Failed to disable unit: Unit ssh.services.service does not exist
Buradaki problem servis adının yanlış yazılmasıdır.
Doğru systemd unit adı:
ssh.service
şeklindedir.
Dolayısıyla doğru kullanım:
sudo systemctl disable ssh.service
olmalıdır.
Systemd servislerinde .service ifadesi tekil olarak kullanılır. Standart olarak ssh.services isimli bir unit bulunmaz.
SSH’yi Tekrar Aktif Etme
SSH erişimine daha sonra yeniden ihtiyaç duyulursa önce servis ve socket üzerindeki mask kaldırılmalıdır.
sudo systemctl unmask ssh.service ssh.socket
Ardından SSH servisi tekrar aktif edilebilir:
sudo systemctl enable --now ssh.service
Durumu doğrulamak için:
systemctl status ssh.service
ve port kontrolü için:
sudo ss -lntp | grep ':22'
komutları kullanılabilir.
SSH tekrar dinlemeye başladıysa aşağıdakine benzer bir çıktı görülebilir:
LISTEN 0 4096 0.0.0.0:22 0.0.0.0:*
SSH Socket Activation Kullanılıyor mu?
Sunucuda SSH ile ilişkili systemd birimlerini görmek için:
systemctl list-units --all | grep -E 'ssh|sshd'
komutu kullanılabilir.
Socket birimlerini ayrıca kontrol etmek için:
systemctl list-sockets | grep ssh
komutu kullanılabilir. Eğer çıktıda:
ssh.socket
görülüyorsa SSH tarafında socket activation mekanizması kullanılabiliyor demektir.
Güvenlik Açısından Değerlendirme
Bir sunucuda SSH erişimine ihtiyaç bulunmuyorsa servisin tamamen kapatılması saldırı yüzeyini azaltmak açısından doğru bir yaklaşım olabilir.
Ancak her durumda SSH’yi tamamen kapatmak zorunlu değildir.
Bazı ortamlarda daha uygun yaklaşım, SSH erişimini yalnızca belirli yönetim ağlarıyla sınırlandırmaktır.
Örneğin yalnızca 10.10.10.0/24 yönetim ağından SSH erişimine izin vermek için UFW üzerinde şu şekilde bir kural uygulanabilir:
sudo ufw allow from 10.10.10.0/24 to any port 22 proto tcp
Bu senaryoda SSH servisi çalışmaya devam eder ancak yalnızca yetkilendirilmiş ağlardan bağlantı kabul edilir.
Dolayısıyla uygulanacak yöntem, kurumun güvenlik politikasına ve sunucunun kullanım amacına göre belirlenmelidir.
| Gereksinim | Kullanılabilecek yöntem |
|---|---|
| SSH geçici olarak durdurulsun | systemctl stop ssh.service |
| Sistem açılışında SSH başlamasın | systemctl disable ssh.service |
| SSH’nin başlatılması tamamen engellensin | systemctl mask ssh.service |
| Socket activation kapatılsın | systemctl mask ssh.socket |
| SSH tamamen kapatılsın | systemctl mask --now ssh.socket ssh.service |
| Yalnızca belirli ağlardan erişim olsun | Firewall kuralı |
| Mevcut SSH oturumları da kapatılsın | pkill -KILL sshd |
Ubuntu Server üzerinde SSH erişimini tamamen kapatmak istediğimizde yalnızca:
sudo systemctl stop ssh
komutunu çalıştırmak her zaman yeterli değildir.
Bunun temel nedeni, ssh.socket biriminin aktif kalabilmesi ve yeni bir bağlantı geldiğinde SSH servisini yeniden başlatabilmesidir.
SSH’nin hem çalışmasını hem de otomatik olarak yeniden başlatılmasını engellemek için kullanılabilecek en net yöntem:
sudo systemctl mask --now ssh.socket ssh.service
komutudur.
İşlem sonrasında mutlaka TCP 22 portunun gerçekten kapanıp kapanmadığı doğrulanmalıdır:
sudo ss -lntp | grep ':22'
Herhangi bir çıktı alınmıyorsa SSH artık TCP 22 portunda dinlemiyor demektir.
Özellikle CIS hardening, güvenlik sıkılaştırma, saldırı yüzeyinin azaltılması ve kullanılmayan servislerin kapatılması gibi çalışmalarda yalnızca servisin durumuna bakmak yerine, ilgili socket birimlerinin ve dinlenen ağ portlarının da kontrol edilmesi önemlidir.
![[TR] Ubuntu Server’da SSH Servisini Tamamen Kapatmak](https://kadirkozan.com/wp-content/uploads/2026/03/27ce25e0-1b0e-475e-9233-d088f6756076-1024x683.png)
![[EN] Completely Disabling SSH on Ubuntu Serve](https://kadirkozan.com/wp-content/uploads/2026/03/27ce25e0-1b0e-475e-9233-d088f6756076-150x150.png)