Ubuntu Sunucu Güvenliği: SSH Anahtarı, Root Girişini Kapatma, UFW ve Fail2ban
Yeni Linux VDS'inizi ilk gün sıkılaştırın: SSH anahtarıyla giriş, root ve şifre girişini kapatma, UFW güvenlik duvarı ve Fail2ban. Ubuntu 24.04 ve Debian 13 için kendinizi kilitlemeden adım adım.

Yeni bir Linux VDS açıldığı dakikadan itibaren internetteki otomatik tarayıcılar onu bulur ve SSH portuna şifre denemeye başlar. Bu denemeler kişisel değildir; tüm IP aralıkları sırayla taranır. Şifreniz güçlü olsa bile sunucuyu ilk gün sıkılaştırmak, ileride yaşanabilecek bir ele geçirilmenin önüne geçmenin en ucuz yoludur. Bu rehberde Ubuntu 24.04 ve Debian 13 bir VDS'te SSH anahtarıyla girişi, root girişini kapatmayı, UFW güvenlik duvarını ve Fail2ban'ı adım adım kuruyoruz. Toplam süre yaklaşık 20 dakikadır.
Komutlar Ubuntu 24.04 ve Debian 13 için yazıldı; Ubuntu 20.04'te de büyük ölçüde aynı çalışır. Örneklerdeki 203.0.113.10 adresini kendi VDS IP adresinizle, yonetici kullanıcı adını kendi seçtiğiniz adla değiştirin.
Başlamadan Önce: Kendinizi Kilitlememe Kuralları
Güvenlik ayarlarında en sık yaşanan sorun, saldırgan yerine sunucu sahibinin dışarıda kalmasıdır. Şu üç kurala uyarsanız bu neredeyse imkânsız hâle gelir:
- Açık SSH oturumunu kapatmayın. Her değişiklikten sonra ikinci bir terminal açıp yeni ayarla bağlanmayı deneyin. Yeni bağlantı çalışana kadar ilk oturum açık kalsın.
- Web konsolun yerini bilin. Müşteri panelinizde VDS hizmetinizin içindeki Konsol düğmesi sunucunun ekranını tarayıcıda açar. Konsol SSH'tan ve güvenlik duvarından bağımsızdır; bir ayarı yanlış yaparsanız oradan root şifrenizle girip geri alırsınız.
- Önce izin, sonra yasak. Güvenlik duvarını açmadan önce SSH portuna izin verin; şifre girişini kapatmadan önce anahtarla girişin çalıştığını görün.
Bağlantı aşamasında takılırsanız VDS'e Uzak Masaüstü ve SSH ile bağlanamıyorum rehberimiz en sık nedenleri sırayla anlatır.

1. Adım: Sistemi Güncelleyin
İlk bağlantıyı root kullanıcısıyla yapın ve paketleri güncelleyin:
ssh root@203.0.113.10
apt update && apt full-upgrade -y
Güncelleme çekirdek (kernel) paketini yenilediyse reboot ile sunucuyu yeniden başlatın. Ardından güvenlik güncellemelerinin kendiliğinden kurulması için otomatik güncellemeyi açın:
apt install -y unattended-upgrades
dpkg-reconfigure -plow unattended-upgrades
Açılan soruya Yes deyin. Ubuntu'da paket genellikle zaten kuruludur; Debian 13'te bu komutla kurulur. Otomatik güncelleme yalnız güvenlik yamalarını alır, büyük sürüm yükseltmesi yapmaz. Dağıtım dışı depolardan (PPA, NodeSource gibi) kurduğunuz PHP ya da Node.js sürümlerini ayrıca takip edin; yamalı sürümler ve kontrol komutları için PHP, Node.js ve Next.js güvenlik güncelleme rehberimize bakın.
2. Adım: Sudo Yetkili Bir Kullanıcı Oluşturun
Root ile doğrudan çalışmak, tek bir yanlış komutun bütün sistemi etkilemesi demektir. Kendinize günlük kullanım için bir kullanıcı açın ve ona yönetici (sudo) yetkisi verin:
adduser yonetici
usermod -aG sudo yonetici
adduser sizden şifre ister; bu şifre ileride sudo komutlarında sorulacak, güçlü bir şifre seçin. Diğer sorular (ad soyad, oda numarası) boş geçilebilir. Debian 13'te sudo paketi kurulu değilse önce apt install -y sudo çalıştırın.
Yetkiyi denemek için yeni kullanıcıya geçin:
su - yonetici
sudo whoami
Çıktı root ise kullanıcı hazırdır. exit ile root oturumuna dönün.
3. Adım: SSH Anahtarı Oluşturun ve Sunucuya Kopyalayın
SSH anahtarı iki parçadan oluşur: bilgisayarınızda kalan özel anahtar (kimseyle paylaşılmaz) ve sunucuya koyduğunuz açık anahtar. Şifre tahmin edilebilir; ed25519 anahtarı pratikte tahmin edilemez.
Windows 10 / 11'de
Windows'ta OpenSSH istemcisi yerleşik gelir. PowerShell'i açın (sunucuda değil, kendi bilgisayarınızda):
ssh-keygen -t ed25519 -C "dizustu-2026"
Dosya yolu sorusunda Enter'a basın, ardından anahtar için bir parola (passphrase) belirleyin. Parola, anahtar dosyanız çalınırsa ikinci bir kilit görevi görür.
Açık anahtarı sunucudaki yeni kullanıcıya kopyalayın:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh yonetici@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

macOS ve Linux'ta
ssh-keygen -t ed25519 -C "dizustu-2026"
ssh-copy-id yonetici@203.0.113.10
Anahtarla girişi deneyin
Yeni bir terminal açın ve bağlanın:
ssh yonetici@203.0.113.10
Bu sefer kullanıcı şifresi değil, anahtar parolası sorulmalı (parola koymadıysanız doğrudan bağlanırsınız). Sorulan şey hâlâ yonetici@203.0.113.10's password: ise anahtar devreye girmemiştir; dosya izinlerini (~/.ssh 700, authorized_keys 600) ve kopyaladığınız satırın eksiksiz olduğunu kontrol edin. Anahtarla giriş çalışmadan bir sonraki adıma geçmeyin.
PuTTY kullanıyorsanız anahtarı PuTTYgen ile oluşturup .ppk biçiminde saklayabilirsiniz; Windows'un yerleşik ssh komutu ise ek programa gerek bırakmaz.
4. Adım: Root Girişini ve Şifreyle Girişi Kapatın
SSH ayarları /etc/ssh/sshd_config dosyasındadır. Ubuntu 24.04 ve Debian 13'te bu dosyanın başında Include /etc/ssh/sshd_config.d/*.conf satırı vardır ve bir ayar için ilk okunan değer geçerlidir. Bu yüzden ana dosyayı düzenlemek yerine, alfabetik olarak en önce okunacak ayrı bir dosya oluşturmak daha güvenlidir:
sudo nano /etc/ssh/sshd_config.d/00-guvenlik.conf
İçine şunları yazın:
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
MaxAuthTries 3
LoginGraceTime 30
AllowUsers yonetici
PermitRootLogin noroot kullanıcısıyla SSH girişini tamamen kapatır.PasswordAuthentication noveKbdInteractiveAuthentication noşifreyle girişi kapatır; yalnız anahtar kabul edilir.AllowUsersyalnız listelediğiniz kullanıcıların SSH ile girmesine izin verir. Birden fazla kullanıcıyı boşlukla ayırın.
Dosyayı kaydedin (Ctrl+O, Enter, Ctrl+X), sözdizimini kontrol edin ve SSH servisini yeniden başlatın:
sudo sshd -t && sudo systemctl restart ssh
sudo sshd -T | grep -E "permitrootlogin|passwordauthentication|kbdinteractive"
sshd -t hiçbir şey yazmıyorsa dosya hatasızdır. İkinci komutun çıktısında üç ayarın da no görünmesi gerekir.

Şimdi ilk oturumu kapatmadan yeni bir terminalden ssh yonetici@203.0.113.10 ile bağlanmayı deneyin. Ardından ssh root@203.0.113.10 denemesinin Permission denied (publickey) ile reddedildiğini görün. İkisi de beklendiği gibiyse eski oturumu kapatabilirsiniz.
Root girişini kapatmak paneldeki işlemleri etkilemez: web konsoldan root şifrenizle girmeye devam edebilirsiniz, çünkü konsol SSH üzerinden çalışmaz.
İsteğe bağlı: SSH portunu değiştirmek
SSH'ı 22 yerine örneğin 2222 numaralı porta taşımak log kalabalığını azaltır ama tek başına güvenlik önlemi değildir; anahtar girişi ve Fail2ban asıl korumadır. Port değiştirecekseniz sırayı bozmayın: önce yeni porta güvenlik duvarında izin verin, sonra 00-guvenlik.conf dosyasına Port 2222 satırını ekleyin. Ubuntu 24.04'te SSH soket etkinleştirmeyle çalıştığı için port değişikliğinden sonra şunları da çalıştırın:
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket
Debian 13'te sudo systemctl restart ssh yeterlidir. Bağlanırken ssh -p 2222 yonetici@203.0.113.10 yazmanız gerekir.
5. Adım: UFW ile Güvenlik Duvarını Açın
UFW (Uncomplicated Firewall), Linux'un paket filtresini birkaç sade komutla yönetmenizi sağlar. Ubuntu'da genellikle kuruludur ama kapalıdır; Debian 13'te ayrıca kurulur:
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw limit 22/tcp
default deny incoming: açıkça izin vermediğiniz hiçbir gelen bağlantı kabul edilmez.limit 22/tcp: SSH'a izin verir ama aynı IP'den 30 saniyede 6'dan fazla bağlantı denemesini keser. SSH portunu değiştirdiyseniz 22 yerine yeni portu yazın.
Web sunucusu çalıştıracaksanız 80 ve 443'ü de açın, ardından güvenlik duvarını etkinleştirin:
sudo ufw allow 80/tcp
sudo ufw allow 443/tcp
sudo ufw enable
sudo ufw status verbose
ufw enable "mevcut SSH bağlantıları kesilebilir" uyarısı verir; SSH portuna izin verdiyseniz y ile onaylayın.

Sık kullanılan UFW komutları:
| İşlem | Komut |
|---|---|
| Kuralları numaralı listele | sudo ufw status numbered |
| Numaraya göre kural sil | sudo ufw delete 3 |
| Yalnız tek bir IP'ye port aç | sudo ufw allow from 198.51.100.25 to any port 3306 proto tcp |
| UDP port aç (ör. oyun, VPN) | sudo ufw allow 51820/udp |
| Güvenlik duvarını kapat | sudo ufw disable |
Veritabanı (3306), Redis (6379) gibi servisleri internete açmayın. Uzaktan erişmeniz gerekiyorsa yukarıdaki gibi yalnız kendi sabit IP adresinize izin verin ya da WireGuard VPN üzerinden bağlanın.
Paneldeki Güvenlik Duvarı ile birlikte kullanmak
AnkSOFT VDS'lerinde müşteri panelinde ayrıca bir Güvenlik Duvarı sekmesi vardır. Buradan gelen bağlantılar için kural ekler, "Web sunucusu", "Uzak erişim" gibi hazır profilleri seçersiniz; kurallar birkaç saniyede sunucunuza uygulanır. Panel kuralları sunucunun içinde UFW'den ayrı bir kural tablosu olarak çalışır. Bu yüzden:
- Panelde güvenlik duvarını Engelle politikasıyla açtıysanız, bir portun dışarıdan erişilebilmesi için o portun hem panelde hem UFW'de izinli olması gerekir.
- SSH portunu değiştirdiyseniz yeni portu panele de ekleyin; yoksa panel kuralı bağlantınızı keser.
- İki katmanı da aynı anda yönetmek istemiyorsanız birini seçin: basit kurulumlar için panel, sunucuya özel ayrıntılı kurallar için UFW.
6. Adım: Fail2ban ile Kaba Kuvvet Denemelerini Engelleyin
Fail2ban, log kayıtlarını izler; kısa sürede çok sayıda hatalı giriş deneyen IP adresini belirli bir süre engeller. Şifre girişini kapatmış olsanız bile denemeleri erkenden kesmek logları temiz tutar ve sunucuyu gereksiz yükten kurtarır.
sudo apt install -y fail2ban
Debian 13'te SSH kayıtları klasik /var/log/auth.log dosyasına değil sistem günlüğüne (journald) yazılır. Bu yüzden Debian'da şu paketi de kurun:
sudo apt install -y python3-systemd
Ayarları ana dosyaya değil, güncellemede ezilmeyen jail.local dosyasına yazın:
sudo nano /etc/fail2ban/jail.local
[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
ignoreip = 127.0.0.1/8 ::1
[sshd]
enabled = true
port = ssh
bantime: engelleme süresi. Tekrarlayan saldırganlar içinbantime.increment = truesatırını ekleyerek süreyi her seferinde katlayabilirsiniz.ignoreip: asla engellenmeyecek adresler. Sabit bir ofis IP'niz varsa buraya ekleyin.- SSH portunu değiştirdiyseniz
port = 2222yazın. - Debian 13'te
[sshd]bölümünebackend = systemdsatırını da ekleyin.
Servisi başlatın ve durumunu kontrol edin:
sudo systemctl enable --now fail2ban
sudo systemctl restart fail2ban
sudo fail2ban-client status sshd

Çıktıda Total failed sayısı zamanla artıyor ve Banned IP list doluyorsa Fail2ban çalışıyordur. Birkaç saat sonra hâlâ Total failed: 0 görüyorsanız log kaynağı okunmuyor olabilir; Debian'da backend = systemd satırını ve python3-systemd paketini kontrol edin.
Kendi IP'nizi yanlışlıkla engellediyseniz başka bir bağlantıdan ya da web konsoldan şu komutla kaldırın:
sudo fail2ban-client set sshd unbanip 198.51.100.25
Kontrol Listesi: Her Şey Yerinde mi?
| Kontrol | Komut | Beklenen |
|---|---|---|
| Root SSH kapalı | sudo sshd -T | grep permitrootlogin |
permitrootlogin no |
| Şifre girişi kapalı | sudo sshd -T | grep passwordauthentication |
passwordauthentication no |
| Güvenlik duvarı açık | sudo ufw status |
Status: active |
| Fail2ban çalışıyor | sudo fail2ban-client status sshd |
jail listeleniyor |
| Otomatik güncelleme | systemctl is-enabled unattended-upgrades |
enabled |
| Dinleyen portlar | sudo ss -tulpn |
yalnız bildiğiniz servisler |
ss -tulpn çıktısında tanımadığınız bir servis internete açık dinliyorsa (0.0.0.0:PORT ya da [::]:PORT), ya kapatın ya da yalnız 127.0.0.1 üzerinde dinleyecek şekilde ayarlayın.
En Sık Yapılan Hatalar
- Anahtarı denemeden şifre girişini kapatmak. Anahtar kopyalanmamışsa sunucuya SSH ile giremezsiniz. Çözüm: web konsoldan root ile girip
00-guvenlik.confdosyasını silin,systemctl restart sshçalıştırın. ufw enablekomutunu SSH izni vermeden çalıştırmak. Bağlantınız anında kesilir. Web konsoldanufw allow 22/tcpya daufw disableile düzeltin.- Ayarı ana
sshd_configdosyasına yazıp etkisiz kalması.sshd_config.daltındaki başka bir dosya aynı ayarı daha önce tanımlıyorsa sizinki uygulanmaz. Dosyanızın adını00-ile başlatın vesshd -Tile kontrol edin. - Port değiştirip panel güvenlik duvarına eklemeyi unutmak. UFW'de açık olsa bile panel kuralı bağlantıyı engeller.
- Özel anahtarı paylaşmak ya da sunucuya koymak.
id_ed25519(uzantısız) dosyası yalnız sizin bilgisayarınızda kalır. Sunucuya giden dosya.pubuzantılıdır. - Debian'da Fail2ban'ın hiçbir şey engellememesi.
backend = systemdeksiktir;Total failedsayısı hep sıfır kalır.
Sonraki Adımlar
Sunucunuz artık temel saldırılara karşı korunuyor. Bundan sonra ne kuracağınıza göre şu rehberlerle devam edebilirsiniz:
- Uygulamaları kapsayıcılarla çalıştırmak için: Docker Kurulumu: VDS'ye Docker ve Docker Compose
- Web sitesi yayınlamak için: LEMP Kurulumu: Nginx, PHP, MariaDB ve Ücretsiz SSL
- Kontrol paneli tercih ediyorsanız: Plesk kurulumu veya CyberPanel kurulumu
- Bir ayar sunucuyu kullanılamaz hâle getirdiyse ve temiz başlamak istiyorsanız: VDS yeniden kurulum rehberi
Ubuntu, Debian ve AlmaLinux kurulabilen, panelden güvenlik duvarı yönetimi ve web konsol erişimi sunan Türkiye lokasyonlu sanal sunucular için VDS paketlerimizi inceleyin. Bir adımda takılırsanız destek talebi açın; talebinize VDS IP adresinizi ve gördüğünüz hata mesajını ekleyin, şifrenizi ya da özel anahtarınızı yazmayın.
Kaynaklar
- OpenSSH server – Ubuntu Server documentation: sshd ayarları ve anahtarla giriş
- Firewall – Ubuntu Server documentation: UFW kullanımı
- fail2ban (resmi GitHub deposu): jail yapılandırması ve belgeler
Sıkça Sorulan Sorular
Root girişini kapatırsam panelden sunucuma erişebilir miyim?
Evet. Root SSH girişini kapatmak yalnız SSH bağlantılarını etkiler. Müşteri panelindeki web konsol SSH'tan bağımsız çalışır; root şifrenizle konsoldan girmeye devam edebilirsiniz.
SSH anahtarımı kaybedersem ne yapmalıyım?
Panelden web konsolu açıp root şifrenizle girin. Yeni açık anahtarınızı kullanıcınızın ~/.ssh/authorized_keys dosyasına ekleyin ya da /etc/ssh/sshd_config.d/00-guvenlik.conf dosyasını geçici olarak kaldırıp SSH servisini yeniden başlatın.
UFW ile paneldeki güvenlik duvarı arasındaki fark nedir?
İkisi de gelen bağlantıları süzer. Panel güvenlik duvarı kuralları müşteri panelinden yönetilir ve sunucuya uygulanır; UFW ise sunucunun içinden komutla yönetilir. İkisi birlikte açıksa bir portun erişilebilir olması için iki tarafta da izinli olması gerekir.
SSH portunu değiştirmek gerekli mi?
Zorunlu değildir. Port değiştirmek log kalabalığını azaltır ama asıl koruma anahtarla giriş ve Fail2ban'dır. Değiştirirseniz yeni porta önce UFW'de ve panel güvenlik duvarında izin verin, ardından SSH ayarını değiştirin.
Fail2ban kendi IP adresimi engellerse ne yapmalıyım?
Başka bir bağlantıdan ya da panelin web konsolundan sudo fail2ban-client set sshd unbanip IP_ADRESINIZ komutuyla engeli kaldırın. Sabit IP adresinizi jail.local dosyasındaki ignoreip satırına ekleyerek tekrarını önleyin.


