Buyukweb
VDS Sunucuda Firewall Yapılandırması: iptables, nftables ve fail2ban

VDS Sunucuda Firewall Yapılandırması: iptables, nftables ve fail2ban

VDS sunucunuzda iptables ile sıfırdan firewall: default policy DROP, SSH rate limit, fail2ban entegrasyonu, nftables/UFW alternatifleri, kendi kapısını kilitleme felaketinden KVM web konsol kurtarma ve 30-dakikalık production güvenlik checklist'i.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü29 dakika okuma

VDS Sunucuda Firewall Yapılandırması: iptables, nftables ve fail2ban

VDS sunucunuzu satın aldığınız anda, IP adresiniz açık denizlerde bir radarda parlayan bir hedeftir. İlk 30 dakika içinde SSH portunuza yüzlerce brute force denemesi, otomatik tarayıcı botların port-scan'leri ve bilinen CVE'leri sömüren exploit denemeleri başlar. Datacenter seviyesinde DDoS koruması (Buyukweb tarafında L3, L4 ve L7 katmanlarında aktiftir) network-level seli durdurur; ama bir saldırgan başarılı tek bir SSH login yakaladığında, datacenter koruması işe yaramaz. İşte burada sunucu seviyesi firewall devreye girer.

Bu rehber, VDS sahibi olduğunuz ilk gün uygulayabileceğiniz sıfırdan iptables yapılandırması, fail2ban entegrasyonu, nftables modern halefi, UFW ve firewalld alternatifleri, "kendi kapısını kilitleme" felaketi durumunda KVM web konsol üzerinden kurtarma yolu ve 15+ maddelik production deploy checklist içerir. Daha önce iptables'a hiç dokunmamış bir kullanıcının da, deneyimli bir sysadmin'in de işine yarayacak şekilde VDS-spesifik production odaklı yazıldı.

Buyukweb perspektifi: VDS E5-V4 paketlerimiz KVM tam virtualizasyon üzerinde çalışır, root erişim tam olarak sizdedir. Bursa Tier 3 veri merkezimizde DDoS L3 + L4 + L7 koruması datacenter seviyesinde aktiftir (SYN flood, UDP amplification, HTTP flood otomatik filtrelenir). Ek olarak KVM web konsol sunduğumuz için, iptables kurallarıyla kendi SSH'ınızı kilitlerseniz bile, panel üzerinden konsola erişip kuralları geri alabilirsiniz — bu, paylaşımlı veya yönetimsiz hosting'te bulunmayan kritik bir kurtarma yolu. VDS fiyat aralığımız ₺250-600/ay arası, 0850 302 60 70 numarasından danışmanlık alabilirsiniz.

Neden VDS'te Ekstra Firewall? Datacenter DDoS Yetmez mi?

İlk savunma sorusu genelde şudur: "Buyukweb zaten DDoS koruyor, ben neden firewall kuruyorum?" Cevap: savunma katmanlarının her birinin farklı görevi vardır, ve her katman diğerini tamamlar.

Defense-in-Depth: Katmanlı Güvenlik

[Internet]
    |
    v
[Datacenter L3/L4 DDoS koruması]   <- Buyukweb tarafında (SYN flood, UDP flood, amplification)
    |
    v
[Datacenter L7 DDoS koruması]      <- Buyukweb tarafında (HTTP flood, rate-limit)
    |
    v
[CDN / WAF (opsiyonel)]            <- Cloudflare gibi servisler önünde
    |
    v
[Sunucu seviyesi firewall]         <- iptables/nftables/firewalld (BU REHBER)
    |
    v
[Uygulama seviyesi firewall]       <- ModSecurity, fail2ban, Nginx rate limit
    |
    v
[Uygulama (Nginx/Apache/PHP/DB)]   <- Sıkılaştırılmış konfigürasyon

Datacenter DDoS koruması yüksek hacim L3/L4 (network) ve L7 (HTTP) saldırıları yakalar. Ama:

  • Tek tek IP'lerden gelen SSH brute force datacenter filtresi tarafından "normal trafik" olarak görülür
  • Açık MySQL portu 3306'ya bağlanan saldırganı datacenter durdurmaz
  • Yanlış konfigürasyonda açılmış olan Redis 6379 veya Elasticsearch 9200 portu doğrudan internete açık olabilir
  • Spesifik uygulama açıklarını (SQL injection, file inclusion) datacenter görmez

Sunucu seviyesi firewall her bağlantı için "izinli mi?" kararını verir. Hangi portlar dışarıya açık, hangi IP'lerden hangi servislere erişilebilir — bu kararı sadece sizin firewall'unuz verebilir. Datacenter DDoS koruması ile sunucu firewall birbirini tamamlayan iki ayrı katmandır, biri diğerinin yerini almaz.

Tipik VDS Saldırı Yüzeyi

Yeni kurulmuş bir VDS'in ilk 24 saatte gördüğü trafik:

  • SSH (port 22): Saniyede ortalama 1-5 brute force denemesi, günde 50.000-200.000 deneme
  • HTTP (port 80): Vulnerability scanner'lar (/wp-admin, /.env, /phpmyadmin, /admin path tarama)
  • MySQL (port 3306): Eğer açıksa, default root parolasıyla bağlanma denemeleri
  • Redis (port 6379): Auth-less Redis arıyor, CONFIG SET ile rootkit yükleme denemeleri
  • MongoDB (port 27017): Auth-less Mongo arıyor, koleksiyonları çalıp ransom note bırakma
  • SMB (port 445): Windows tarayıcı (Linux'ta da bazen çalışan Samba)

Firewall olmadan, bu portlardan biri bile zayıf parolalı veya açık bırakıldığında sunucunuz saatler içinde compromise olabilir.

Linux Netfilter Mimari: iptables ve nftables Nasıl Çalışır?

iptables ve nftables, Linux kernel'inde Netfilter framework'ünü kullanır. Netfilter, ağ paketleri kernel ağ stack'inden geçerken belirli noktalarda (hook) çağrılan bir paket inceleme motorudur.

Hook'lar

Bir paket sunucunuza geldiğinde sırasıyla şu hook'lardan geçer:

                    [ Network Card ]
                          |
                          v
                    [ PREROUTING ]   <- Paket girdi, henüz route kararı yok
                          |
                  +-------+-------+
                  |               |
                  v               v
            [ Yerel mi? ]    [ FORWARD ]   <- Başka makineye routing
                  |               |
                  v               v
              [ INPUT ]      [ POSTROUTING ]
                  |
                  v
            [ Local Process ]
                  |
                  v
              [ OUTPUT ]   <- Yerelden çıkan paket
                  |
                  v
            [ POSTROUTING ]
                  |
                  v
                  [ Network Card ]

VDS'te tipik olarak ilgilendiğiniz hook'lar:

  • INPUT — Sunucuya gelen paketler (SSH, HTTP, vb.)
  • OUTPUT — Sunucudan giden paketler (genelde tüm trafiğe izin verilir)
  • FORWARD — Sunucudan geçip başka makineye giden paketler (sadece router/NAT gateway VDS'lerde anlamlı)

Tablolar (Tables) ve Zincirler (Chains)

iptables, kuralları tablolar içinde organize eder. Her tablo farklı bir amaca hizmet eder:

Tablo Amaç Tipik Hook'lar
filter Paket kabul/red kararı INPUT, OUTPUT, FORWARD
nat NAT (Network Address Translation) PREROUTING, POSTROUTING, OUTPUT
mangle Paket header değiştirme (TTL, TOS) PREROUTING, POSTROUTING, INPUT, OUTPUT, FORWARD
raw Connection tracking bypass PREROUTING, OUTPUT
security SELinux mark INPUT, OUTPUT, FORWARD

VDS sunucusunda filter tablosu en sık kullanılan tablodur — gelen paketleri kabul edip etmeyeceğinize karar verir. nat tablosu sadece NAT gateway senaryolarında (örneğin VPN sunucu kurarken) anlamlıdır.

iptables Komut Anatomisi

iptables [-t table] [-A|-I|-D|-R] chain rule-specification [-j target]
  • -t table — Tablo (varsayılan filter)
  • -A chain — Zincire kuralı sonuna ekle (Append)
  • -I chain [pos] — Zincire kuralı belirli pozisyona ekle (Insert)
  • -D chain — Kuralı sil (Delete)
  • -R chain pos — Kuralı değiştir (Replace)
  • -L [chain] — Kuralları listele
  • -F [chain] — Tüm kuralları flush
  • -P chain target — Zincir default policy
  • -j target — Action (ACCEPT, DROP, REJECT, LOG, RETURN, ya da custom chain)

iptables vs nftables: Modern Halef

iptables, Linux'ta uzun süredir standart firewall aracıdır, ama 2014'ten beri kernel 3.13+ ile birlikte gelen nftables resmi halefidir. nftables avantajları:

Boyut iptables nftables
Syntax Komutlar uzun, çok flag Daha temiz, JSON benzeri
Performans Her tabloyu ayrı tarar Tek tarama, daha hızlı
IPv4/IPv6 Ayrı (iptables / ip6tables) Tek (inet ailesi)
Atomic update Yok (her satır ayrı) Tüm rule set atomic
Set ve map Sınırlı Native destek
Geleceği Maintenance mode Aktif geliştirme

Ancak iptables hala yaygın kullanılıyor — dokümantasyon, script ve eklenti ekosistemi devasa. Yeni başlayanlar için iptables öğrenmek pratiktir, çünkü her tutorial ve Stack Overflow cevabı iptables üzerinden anlatılır. Production'da ise nftables'a geçiş özellikle CentOS Stream 9 / RHEL 9 / Debian 12'de varsayılan haline geliyor.

Pratik öneri: Bu rehberde iptables komutlarını ana eksende anlatacağız (en yaygın), ardından nftables örnekleri vereceğiz. iptables-nft backend ile iptables komutları nftables kernel altyapısı üzerinde çalışabilir; bu modern distrolarda otomatik aktiftir.

Sıfırdan iptables Yapılandırma: VDS İlk Kurulum Adımları

Yeni kurulmuş bir VDS'te (Ubuntu 22.04, Debian 12, AlmaLinux 9, Rocky Linux 9) iptables ile temel bir firewall kurulumu 9 adımda tamamlanır. Aşağıda her adım için komut + açıklama veriyoruz.

Kritik uyarı: Aşağıdaki komutları çalıştırmadan önce KVM web konsolunuza erişebildiğinizi mutlaka doğrulayın. Bir hatayla SSH'ınızı keserseniz, konsoldan girip düzeltmek zorunda kalacaksınız. Buyukweb müşterilerimiz panelden VDS yönetim sayfasında "KVM Konsol" butonuna tıklayarak doğrudan sunucu ekranına erişebilir.

Adım 0: Mevcut Kuralları Görme ve Flush

# Mevcut tüm kuralları listele (verbose, numbered)
sudo iptables -L -v -n --line-numbers
sudo iptables -t nat -L -v -n --line-numbers

# Eğer sıfırdan başlamak istiyorsanız (DİKKAT: tüm mevcut kurallar silinir)
sudo iptables -F            # Filter zincirlerini flush
sudo iptables -t nat -F     # NAT zincirlerini flush
sudo iptables -t mangle -F  # Mangle flush
sudo iptables -X            # Custom zincirleri sil

Adım 1: Default Policy DROP (Önce Bunu Yap, Sonra İzin Ver)

Güvenlik felsefesi: "Whitelist yaklaşımı" — varsayılan reddet, sadece bildiğin ne ise izin ver. Önce kuralları ekleyin, sonra default policy'yi DROP yapın. Aksi halde SSH'ınızı keseceksiniz.

# Önce kuralları kabul edici hale getir (geçici)
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT

# Mevcut kuralları temizle (eğer henüz yoksa)
sudo iptables -F

Aşağıdaki Adım 2-8'i bitirdikten sonra default policy'yi DROP'a çekeceğiz. Bu sıralamayı kaçırırsanız SSH bağlantınız kopar.

Bu, "halihazırda kurulmuş veya ilgili bir bağlantıya gelen paketler" demektir. SSH oturumunuz, HTTP isteğinize verilen cevaplar, FTP veri kanalı gibi her şey bu kuralla ayakta tutulur.

sudo iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT

Ne yapar: conntrack modülü Linux'un connection tracking sistemini kullanır. Bir paket eğer mevcut bir bağlantıya aitse (TCP ACK, response packet, ICMP error) veya ilgiliyse (FTP data channel), kabul edilir.

Adım 3: Loopback Trafiğini Kabul Et

sudo iptables -A INPUT -i lo -j ACCEPT
sudo iptables -A OUTPUT -o lo -j ACCEPT

Ne yapar: 127.0.0.1 üzerinden gelen ve giden tüm trafik kabul. Sunucudaki yerel servisler (örn. MySQL'in localhost dinlemesi, PHP-FPM unix socket) bu kural olmadan çalışmaz.

Adım 4: SSH Portunu Rate-Limited Kabul Et

SSH için kritik koruma: brute force azaltma. recent modülü ile son 60 saniyede aynı IP'den 4'ten fazla yeni bağlantı geliyorsa drop:

# SSH yeni bağlantıları SSH listesine ekle
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
    -m recent --set --name SSH

# Son 60 saniyede 4+ deneme varsa drop (logla)
sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
    -m recent --update --seconds 60 --hitcount 4 --name SSH \
    -j LOG --log-prefix "iptables-SSH-brute: "

sudo iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW \
    -m recent --update --seconds 60 --hitcount 4 --name SSH -j DROP

# Geriye kalan (rate-limit içinde olan) SSH bağlantılarını kabul et
sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT

Önemli: Eğer SSH port'unu 22'den 22022 gibi non-standard port'a değiştirdiyseniz (önerilir), yukarıdaki --dport 22 yerine --dport 22022 yazın.

Daha güçlü koruma: recent modülü basit rate limit. fail2ban modern alternatiftir — log dosyalarını izler ve dinamik olarak iptables/nftables/firewalld'a IP yasaklar yazar. Aşağıda detay var.

Adım 5: HTTP ve HTTPS Portlarını Kabul Et

sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 443 -j ACCEPT

Web sunucusu çalıştırıyorsanız (Nginx, Apache, OpenLiteSpeed) bu portları açın. HTTP/3 QUIC için ayrıca UDP 443 açın:

sudo iptables -A INPUT -p udp --dport 443 -j ACCEPT

Adım 6: Diğer Servisler (Mail, FTP, DB)

İhtiyacınıza göre açın. Veritabanı portlarını ASLA dışarıya açmayın (sadece localhost bind):

# Mail sunucu (eğer self-host mail varsa)
sudo iptables -A INPUT -p tcp --dport 25  -j ACCEPT  # SMTP
sudo iptables -A INPUT -p tcp --dport 465 -j ACCEPT  # SMTPS
sudo iptables -A INPUT -p tcp --dport 587 -j ACCEPT  # Submission
sudo iptables -A INPUT -p tcp --dport 993 -j ACCEPT  # IMAPS
sudo iptables -A INPUT -p tcp --dport 995 -j ACCEPT  # POP3S

# FTP (sadece gerekirse — SFTP/SCP daha güvenli)
sudo iptables -A INPUT -p tcp --dport 21 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 20 -j ACCEPT
# Passive FTP için belirli port aralığı (vsftpd config ile uyumlu)
sudo iptables -A INPUT -p tcp --dport 30000:31000 -j ACCEPT

# DNS sunucu (eğer kendi DNS sunucunuz var)
sudo iptables -A INPUT -p udp --dport 53 -j ACCEPT
sudo iptables -A INPUT -p tcp --dport 53 -j ACCEPT

Database tehlikesi: MySQL (3306), PostgreSQL (5432), Redis (6379), MongoDB (27017), Elasticsearch (9200) kesinlikle public açılmamalıdır. Bunlar için bind-address = 127.0.0.1 config + iptables ekstra koruma. Uzaktan erişim gerekiyorsa SSH tunnel veya VPN üzerinden bağlanın.

Adım 7: ICMP (Ping) Rate Limit

ICMP ping flood saldırısı yaygındır. Tam kapatmak yerine rate limit önerilir:

# ICMP echo-request (ping) saniyede 1, burst 5
sudo iptables -A INPUT -p icmp --icmp-type echo-request \
    -m limit --limit 1/s --limit-burst 5 -j ACCEPT

# Diğer ICMP type'lar (destination-unreachable, time-exceeded — network için kritik)
sudo iptables -A INPUT -p icmp --icmp-type destination-unreachable -j ACCEPT
sudo iptables -A INPUT -p icmp --icmp-type time-exceeded -j ACCEPT

Adım 8: Suspicious Paketleri Logla (İsteğe Bağlı)

# Drop edilecek paketlerden bir kısmını logla (rate-limited, log spam'ı önle)
sudo iptables -A INPUT -m limit --limit 5/min -j LOG \
    --log-prefix "iptables-dropped: " --log-level 7

Loglar /var/log/syslog (Debian/Ubuntu) veya /var/log/messages (RHEL/AlmaLinux) içine yazılır. Analiz için grep iptables-dropped /var/log/syslog kullanın.

Adım 9: Default Policy DROP (Son Adım)

Şimdi tüm izin kuralları yazıldıktan sonra, default policy'yi DROP'a çekin:

sudo iptables -P INPUT DROP
sudo iptables -P FORWARD DROP
sudo iptables -P OUTPUT ACCEPT   # OUTPUT genelde ACCEPT, paranoid moda göre değişir

Test: Yeni bir SSH terminal açıp bağlanmayı deneyin. Eğer bağlanabiliyorsanız, kuralları kaydedin (Adım 10). Eğer bağlanamıyorsanız, mevcut SSH oturumunuzu kapatmayın — Adım 9 öncesine geri dönmek için:

sudo iptables -P INPUT ACCEPT

Adım 10: Kuralları Kalıcı Yap (Reboot'ta Kaybolmasın)

iptables kuralları runtime memory'dedir; reboot'ta kaybolur. Kalıcı yapmak için:

Ubuntu / Debian

sudo apt install iptables-persistent
# Kurulum sırasında "save current rules?" diye sorar — Yes
# Sonradan kaydetmek için:
sudo netfilter-persistent save

Kurallar /etc/iptables/rules.v4 ve /etc/iptables/rules.v6 dosyalarına yazılır, reboot'ta otomatik yüklenir.

RHEL / AlmaLinux / Rocky Linux

sudo dnf install iptables-services
sudo systemctl enable --now iptables
sudo service iptables save

Kurallar /etc/sysconfig/iptables dosyasına kaydedilir.

NOT: Modern RHEL 9 / AlmaLinux 9 dağıtımlarında firewalld varsayılan firewall yönetim katmanıdır ve iptables komutları aslında iptables-nft üzerinden nftables backend'e gönderir. firewalld kullanıyorsanız, doğrudan iptables save yerine firewalld komutları üzerinden çalışmanız önerilir (aşağıda detay).

Kendi Kapısını Kilitleme Felaketi ve KVM Konsol Kurtarma

VDS güvenliğinde en yaygın hata: SSH kuralını yanlış yazıp kendi bağlantınızı kapatmak. Tipik senaryolar:

  1. Default policy DROP yaptınız ama SSH ACCEPT kuralını unuttunuz
  2. SSH port'unu 22 → 22022 değiştirdiniz ama firewall'da 22022'yi açmadınız
  3. iptables -P INPUT DROP çalıştırdınız ve iptables -A INPUT -p tcp --dport 22 -j ACCEPT kuralını ekleyemeden bağlantı koptu
  4. fail2ban whitelist'inize ev IP'nizi eklemediniz, kendinizi banladınız
  5. CSF testing modu off iken csf -e çalıştırdınız

Tüm bu senaryolarda SSH üzerinden bağlanma imkanınız yoktur. Çözüm tek: out-of-band erişim — sunucu konsolu.

Buyukweb KVM Web Konsol (Kritik Avantaj)

Buyukweb VDS planlarında KVM tam virtualizasyon çalıştığımız için, paneliniz üzerinden doğrudan sunucu konsoluna erişebilirsiniz:

1. Panel'e giriş yapın (buyukweb.com müşteri paneli)
2. Hizmetlerim → VDS sunucu seç
3. "KVM Konsol" veya "VNC Konsol" butonuna tıkla
4. Tarayıcıda yeni sekme açılır — sunucu ekranınız ekrandadır
5. Root parolanız ile login (root + parola)
6. iptables -F  (tüm kuralları flush) veya
   iptables -P INPUT ACCEPT  (default policy geri al)
7. SSH bağlantınız hemen geri gelir

Bu kurtarma yolu, paylaşımlı hosting veya yönetimsiz / KVM olmayan VDS planlarında bulunmaz. Buyukweb müşterilerimiz için kendi kapısını kilitleme hatası tamir edilebilir bir sorundur, panik gerek yoktur.

Önemli: KVM web konsol erişimini yedek olarak test edin — firewall kurmadan önce bir kez konsola girip root parolasıyla login olduğunuzdan emin olun. Acil durumda bilmediğiniz bir akışı çalıştırmak istemezsiniz.

Diğer Kurtarma Senaryoları

KVM konsol olmayan durumlar için (varsa):

  • Rescue mode boot — Bazı paneller VDS'i kurtarma modunda boot edebilir, ana disk read-only mount edilir, /etc/iptables/rules.v4 düzenlenir, reboot
  • Cron job ile auto-flush — Risk azaltma: Önce crontab -e ile */5 * * * * /sbin/iptables -F INPUT koyup, kuralları test edin, çalışınca cron'u kaldırın
  • Önceden backup scriptiptables-save > /root/firewall-backup-$(date +%F).rules ile kuralları kaydedin

Buyukweb VDS'te KVM konsol her zaman var olduğu için cron auto-flush veya rescue mode'a gerek kalmıyor genelde.

fail2ban: Dinamik Brute Force Koruma

recent modülü basit rate limit, ama gerçek brute force koruma için fail2ban kullanılır. fail2ban log dosyalarını izler, başarısız login denemelerini sayar ve dinamik olarak iptables/nftables/firewalld'a IP yasak kuralları ekler.

Kurulum

# Ubuntu / Debian
sudo apt update
sudo apt install fail2ban

# RHEL / AlmaLinux / Rocky Linux
sudo dnf install epel-release
sudo dnf install fail2ban fail2ban-firewalld

# Servis aktif et
sudo systemctl enable --now fail2ban

jail.local: Yapılandırma

Asla jail.conf dosyasını edit etmeyin — paket güncellemesinde üzerine yazılır. Bunun yerine jail.local oluşturun:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

Temel Ayarlar

[DEFAULT]
# Banlanmayacak IP'ler (kendi ev IP'nizi MUTLAKA ekleyin)
ignoreip = 127.0.0.1/8 ::1 78.135.12.34

# Ban süresi (1 saat)
bantime  = 1h

# Bu süre içinde maxretry deneme olursa banla
findtime  = 10m

# Kaç başarısız deneme = ban
maxretry = 3

# Ban backend (iptables-multiport, iptables-allports, firewallcmd-ipset, nftables)
banaction = iptables-multiport

SSH Jail (Kritik)

[sshd]
enabled  = true
port     = ssh   # ya da 22022 gibi custom port
filter   = sshd
logpath  = /var/log/auth.log   # Ubuntu/Debian
# logpath = /var/log/secure    # RHEL/AlmaLinux
maxretry = 3
findtime = 10m
bantime  = 1h

Diğer Yaygın Jail'ler

[apache-auth]
enabled  = true
port     = http,https
logpath  = /var/log/apache2/*error.log

[nginx-http-auth]
enabled  = true
port     = http,https
logpath  = /var/log/nginx/error.log

[postfix-sasl]
enabled  = true
port     = smtp,smtps,submission
logpath  = /var/log/mail.log

[wordpress]
enabled  = true
port     = http,https
filter   = wordpress
logpath  = /var/log/nginx/wordpress-auth.log
maxretry = 3
findtime = 5m
bantime  = 6h

[recidive]
enabled  = true
filter   = recidive
logpath  = /var/log/fail2ban.log
action   = iptables-allports[name=recidive]
bantime  = 1w
findtime = 1d
maxretry = 5

Recidive jail özellikle değerlidir: tekrarlı banlanan IP'leri uzun süreli (1 hafta) banlamak için fail2ban'in kendi log'unu izler.

WordPress Custom Filter

WordPress wp-login.php brute force için custom filter:

sudo nano /etc/fail2ban/filter.d/wordpress.conf
[Definition]
failregex = ^<HOST> .* "POST /wp-login.php
            ^<HOST> .* "POST /xmlrpc.php
ignoreregex =

Sonra Nginx access log'da WordPress isteklerini izlesin diye logpath'i ayarlayın.

fail2ban Status ve Yönetim

# Aktif jail listesi
sudo fail2ban-client status

# Belirli jail durumu
sudo fail2ban-client status sshd

# Manuel ban
sudo fail2ban-client set sshd banip 1.2.3.4

# Ban kaldırma
sudo fail2ban-client set sshd unbanip 1.2.3.4

# Tüm banları temizle
sudo fail2ban-client unban --all

Actions: iptables-multiport, ipset, firewallcmd-ipset

fail2ban'in arka planda nasıl banladığı action ile belirlenir:

  • iptables-multiport — Her IP için ayrı iptables rule (200+ ban'de yavaşlar)
  • iptables-ipset — IP'leri ipset'e ekler, tek rule binlerce IP bansak performanslı
  • firewallcmd-ipset — firewalld backend kullanıyorsanız (AlmaLinux/RHEL)
  • nftables-multiport — nftables backend
  • nginx-block-map — Nginx map ile uygulama seviyesinde ban

Yüksek ban hacmi için ipset veya nftables sets kesinlikle önerilir — her ban için ayrı iptables rule eklemek 1000+ IP'de iptables -L listeleme bile saniyeler sürebilir.

CSF (ConfigServer Security & Firewall) — cPanel Alternatifi

cPanel sunucularında CSF çok yaygındır. CSF, iptables üzerine bir wrapper'dır — IP listesi, port tarama tespiti, login tracker, e-posta bildirimi gibi entegre özellikler sunar. Detaylı kurulum için CSF kurulum rehberimize bakabilirsiniz.

Ne zaman CSF, ne zaman fail2ban + iptables?

  • cPanel sunucusu → CSF (cPanel WHM entegrasyonu vardır)
  • Sade VDS (cPanel yok) → fail2ban + iptables yeterli
  • Birden fazla sunucu yönetiyorsanız → Ansible/SaltStack üzerinden fail2ban + iptables daha programatik

CSF, fail2ban + iptables kombinasyonunu görsel + yönetilen bir paket haline getirir. Komut satırı sevmeyenlere uygundur.

DDoS Sunucu Seviyesi Koruma (Kernel Tuning)

Datacenter L3/L4 DDoS koruması Buyukweb tarafında aktiftir, ama sunucu seviyesinde kernel parametreleri ile koruma katmanı eklemek faydalıdır.

sysctl ile Network Hardening

sudo nano /etc/sysctl.d/99-firewall-hardening.conf
# SYN flood koruma (TCP SYN cookies)
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 2048
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_syn_retries = 5

# Source routing kapatma (spoofing önleme)
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0

# ICMP redirect kapatma
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0

# IP spoofing koruma (reverse path filter)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# Broadcast ICMP cevabını kapatma (Smurf saldırı koruması)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Hatalı ICMP error mesajlarını yoksay
net.ipv4.icmp_ignore_bogus_error_responses = 1

# Conntrack tablosu büyüklüğü (yüksek bağlantı için)
net.netfilter.nf_conntrack_max = 524288

# TCP timewait reuse
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_fin_timeout = 30

Uygula:

sudo sysctl -p /etc/sysctl.d/99-firewall-hardening.conf

Slowloris Saldırısı Önleme (Web Server Tarafında)

Slowloris, HTTP başlıklarını yavaş yavaş göndererek bağlantı kapasitesini tüketen bir saldırıdır. Apache veya Nginx config'inde:

Apache (mod_reqtimeout):

RequestReadTimeout header=20-40,minrate=500
RequestReadTimeout body=20-40,minrate=500

Nginx:

client_body_timeout 10s;
client_header_timeout 10s;
keepalive_timeout 15s 15s;
send_timeout 10s;

# Yavaş bağlantıları sınırlama
limit_req_zone $binary_remote_addr zone=slowdown:10m rate=10r/s;
limit_req zone=slowdown burst=20 nodelay;

HTTP Flood — Nginx Rate Limit

# /etc/nginx/nginx.conf http bloğu içinde
limit_req_zone $binary_remote_addr zone=api:10m rate=10r/s;
limit_conn_zone $binary_remote_addr zone=conn_limit:10m;

server {
    location /api/ {
        limit_req zone=api burst=20 nodelay;
        limit_conn conn_limit 10;
        # ...
    }
}

Bu, uygulama seviyesinde rate limit. fail2ban Nginx error log'unu izleyip limit_req violation gördüğünde IP'yi ban'leyebilir.

nftables Modern Syntax (Örnekler)

nftables'a geçmek isteyenler için kısa örnek:

# Mevcut iptables kurallarını flush
sudo iptables -F

# nftables tablo oluştur (inet = ipv4 + ipv6 birleşik)
sudo nft add table inet filter

# INPUT chain, hook input, priority 0, default policy drop
sudo nft add chain inet filter input \
    '{ type filter hook input priority 0\; policy drop\; }'

# Loopback kabul
sudo nft add rule inet filter input iif lo accept

# Established/Related kabul
sudo nft add rule inet filter input ct state established,related accept

# SSH (port 22) kabul + rate limit
sudo nft add rule inet filter input tcp dport 22 \
    ct state new limit rate 4/minute accept

# HTTP/HTTPS kabul
sudo nft add rule inet filter input tcp dport { 80, 443 } accept

# ICMP rate limit
sudo nft add rule inet filter input icmp type echo-request \
    limit rate 1/second accept

# Kuralları göster
sudo nft list ruleset

# Kuralları kalıcı yap
sudo nft list ruleset | sudo tee /etc/nftables.conf
sudo systemctl enable --now nftables

nftables daha temiz syntax, inet ailesi (IPv4 + IPv6 birleşik), set ve map native destek (örn. nft add set inet filter blacklist { type ipv4_addr\; } ile dinamik IP listesi).

UFW (Uncomplicated Firewall) — Ubuntu İçin Basit Alternatif

UFW, iptables üzerine basit bir kullanıcı arayüzüdür — Ubuntu varsayılan firewall yönetim aracı. Sade VDS sunuculara çabuk başlamak için pratiktir.

# Kurulum (Ubuntu varsayılan zaten kurulu)
sudo apt install ufw

# Varsayılan policy
sudo ufw default deny incoming
sudo ufw default allow outgoing

# Servisleri aç
sudo ufw allow ssh           # port 22
sudo ufw allow http          # port 80
sudo ufw allow https         # port 443
sudo ufw allow 22022/tcp     # custom SSH port

# Belirli IP'den SSH izni (whitelist)
sudo ufw allow from 78.135.12.34 to any port 22

# Rate limit (brute force önleme)
sudo ufw limit ssh

# Etkinleştir
sudo ufw enable

# Durum
sudo ufw status verbose
sudo ufw status numbered

# Kural silme
sudo ufw delete allow 80
sudo ufw delete 3   # 3 numaralı kural

UFW arka planda iptables-nft üzerinden kurallar yazar. fail2ban da UFW backend ile çalışabilir (banaction = ufw). Yeni başlayanlar için kolay başlangıç önerisi: UFW + fail2ban kombinasyonu.

firewalld (AlmaLinux / Rocky / RHEL Varsayılan)

RHEL ailesinde firewalld zone-based firewall yönetim katmanıdır. iptables yerine "zone"larla çalışır: public, internal, dmz, trusted gibi tanımlı kümeler.

Detaylı kurulum için ayrı rehberimiz var: AlmaLinux 9 firewalld yapılandırma. Burada özet:

# Default zone
sudo firewall-cmd --get-default-zone

# Public zone aktif servisler
sudo firewall-cmd --zone=public --list-services

# HTTP/HTTPS aç (kalıcı + runtime)
sudo firewall-cmd --zone=public --add-service=http --permanent
sudo firewall-cmd --zone=public --add-service=https --permanent

# Custom port (örn. SSH 22022)
sudo firewall-cmd --zone=public --add-port=22022/tcp --permanent

# Reload
sudo firewall-cmd --reload

# Rich rule (gelişmiş kural)
sudo firewall-cmd --zone=public --add-rich-rule='
    rule family="ipv4"
    source address="78.135.12.34"
    port port="22" protocol="tcp" accept'

iptables vs firewalld karşılaştırması için iptables ve firewalld kıyaslama rehberi.

IPv6 Firewall (ip6tables)

VDS'inizde IPv6 aktifse, iptables kuralları IPv4'e özeldir — IPv6 için ayrıca ip6tables komutu kullanmanız gerekir.

# IPv6 kuralları
sudo ip6tables -P INPUT DROP
sudo ip6tables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
sudo ip6tables -A INPUT -i lo -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 22 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 80 -j ACCEPT
sudo ip6tables -A INPUT -p tcp --dport 443 -j ACCEPT

# ICMPv6 önemli (DAD, NDP için gerekli)
sudo ip6tables -A INPUT -p ipv6-icmp -j ACCEPT

# Kalıcı yap (Ubuntu/Debian)
sudo ip6tables-save | sudo tee /etc/iptables/rules.v6

Önemli: ICMPv6 paketleri (Neighbor Discovery, Router Advertisement, MTU Discovery) tam bloklanırsa IPv6 trafiği çökecektir. Yukarıdaki -p ipv6-icmp -j ACCEPT kuralını ihmal etmeyin.

nftables ile inet ailesi kullanarak IPv4 ve IPv6'yı tek tablo altında yönetmek daha pratiktir — bu yüzden modern dağıtımlarda nftables'a geçiş hızlanıyor.

Port Knocking ve VPN Üzerinden SSH

SSH'ı public açmaktansa, daha güvenli alternatifler:

Port Knocking (knockd, fwknop)

SSH portu varsayılan kapalıdır; sadece belirli sırayla belirli portlara TCP/UDP paketi gönderildiğinde geçici olarak SSH açılır.

sudo apt install knockd
sudo nano /etc/knockd.conf
[openSSH]
    sequence    = 7000,8000,9000
    seq_timeout = 5
    command     = /sbin/iptables -I INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

[closeSSH]
    sequence    = 9000,8000,7000
    seq_timeout = 5
    command     = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 22 -j ACCEPT
    tcpflags    = syn

Client tarafında knock sunucu-ip 7000 8000 9000 çalıştırıp ardından SSH bağlanırsınız.

fwknop (Single Packet Authorization) port knocking'in modern halefi — kriptografik olarak imzalanmış tek paketle SSH açma.

WireGuard VPN Üzerinden SSH

Daha temiz yaklaşım: SSH portunu hiç public açmamak, sadece WireGuard VPN üzerinden erişmek.

[Laptop]  →  WireGuard tunnel  →  [VDS WireGuard interface]  →  SSH (sadece WG arayüzü dinler)

/etc/ssh/sshd_config:

ListenAddress 10.66.66.1   # WireGuard VDS IP
# ListenAddress 0.0.0.0    # YORUMLA — public dinleme yok

iptables:

# SSH sadece WireGuard interface'ten
sudo iptables -A INPUT -i wg0 -p tcp --dport 22 -j ACCEPT
# Public'ten SSH yok — kural eklemiyoruz

Bu yaklaşım, brute force riskini sıfıra indirir — public'te dinleyen SSH yoktur. WireGuard kurulum detayı için ayrı WireGuard rehberi hazırlanıyor.

Test ve Doğrulama Araçları

nmap (Kendi VDS'inize Dış Kontrol)

Başka bir makineden veya cep telefonu hotspot ağından VDS'inizi tarayın:

# Hızlı TCP port tarama
nmap -F vds-ip-adresiniz

# Tüm 65535 portu tara
nmap -p- vds-ip-adresiniz

# Servis ve versiyon tespiti
nmap -sV -p 22,80,443 vds-ip-adresiniz

# UDP tarama (yavaş)
sudo nmap -sU --top-ports 100 vds-ip-adresiniz

Beklenen sonuç: Sadece açtığınız portlar (22, 80, 443) open, diğerleri filtered veya closed olmalı.

hping3 (Paket Gönderim Testi)

sudo apt install hping3

# SYN paket flood testi (kendi VDS'inize)
sudo hping3 -S -p 80 --flood vds-ip

# ICMP ping flood
sudo hping3 -1 --flood vds-ip

fail2ban veya iptables rate limit'lerin çalıştığını doğrulamak için bu testleri kontrollü ortamda yapın.

Online Port Scan Servisleri

  • mxtoolbox.com/SuperTool.aspx (port check)
  • shodan.io (VDS'inizin açık port profilinin internette nasıl göründüğü)
  • censys.io (alternatif IP intelligence)

Shodan'da VDS IP'nizi aratarak internetin sizi nasıl gördüğünü kontrol edin. Beklenen: SSH (22 veya custom), HTTP (80), HTTPS (443) ve başka hiçbir şey.

Loglama ve Analiz

# iptables drop log'larını izle
sudo tail -f /var/log/syslog | grep iptables-

# fail2ban log
sudo tail -f /var/log/fail2ban.log

# SSH başarısız login'ler
sudo grep "Failed password" /var/log/auth.log | tail -30

# Apache/Nginx access log analizi (GoAccess)
sudo apt install goaccess
goaccess /var/log/nginx/access.log -o /var/www/html/report.html

Log retention politikası: Logları en az 30 gün saklayın (KVKK uyumluluk + olay incelemesi). logrotate ile günlük dönüş ve sıkıştırma standarttır.

Karar Matrisi: Hangi Firewall Sizin İçin?

Senaryo Önerilen Firewall Neden
Yeni başlayan, Ubuntu VDS UFW + fail2ban Sade syntax, hızlı başlangıç
Deneyimli sysadmin, granular kontrol iptables + fail2ban Tam manuel kontrol, geniş ekosistem
Modern dağıtım, IPv4+IPv6 nftables + fail2ban Tek tablo, atomic, performans
RHEL/AlmaLinux/Rocky firewalld Zone-based, dağıtım varsayılanı
cPanel sunucusu CSF cPanel UI entegrasyonu
Birden fazla VDS yönetiyorsunuz iptables/nftables + Ansible Programatik, sürüm kontrolü

Pratik öneri: Tek VDS, web hosting amaçlı, Ubuntu/Debian → UFW + fail2ban. AlmaLinux/Rocky/RHEL → firewalld + fail2ban. cPanel → CSF. Production VDS, özel kurallar gerekli → iptables veya nftables + fail2ban.

Buyukweb VDS Yeni Kurulum 30-Dakika Güvenlik Checklist

VDS satın aldığınız ilk 30 dakikada uygulamanız gereken adımlar:

  • 0. KVM web konsol erişimini test et (panel → VDS → KVM Konsol → root login dene)
  • 1. SSH portu değiştir (/etc/ssh/sshd_configPort 22022 gibi non-standard)
  • 2. Root SSH'ı kapat (PermitRootLogin no) — sudo user kullan
  • 3. SSH key authentication aktif et (parola yerine public key)
  • 4. SSH parola login'i kapat (PasswordAuthentication no) — key yedeği aldıktan SONRA
  • 5. Yeni sudo kullanıcı oluştur (adduser admin + usermod -aG sudo admin)
  • 6. iptables/UFW/firewalld kur ve default policy DROP
  • 7. SSH portunu firewall'da aç (22022 gibi)
  • 8. HTTP 80 + HTTPS 443 aç (web sunucu varsa)
  • 9. Database portlarını sadece localhost bind (3306, 5432, 6379, 27017)
  • 10. fail2ban kur (sshd + apache/nginx + recidive jail'ler)
  • 11. ignoreip listesine kendi IP'ni ekle (/etc/fail2ban/jail.local)
  • 12. sysctl network hardening uygula (/etc/sysctl.d/99-firewall-hardening.conf)
  • 13. iptables-persistent veya iptables-services ile reboot kalıcılığı
  • 14. Otomatik güvenlik güncelleme aktif (unattended-upgrades Debian/Ubuntu, dnf-automatic RHEL)
  • 15. Pre-firewall backup al (iptables-save > /root/firewall-backup-$(date +%F).rules)
  • 16. Test: Başka bir IP'den nmap -F vds-ip ile beklenen portları doğrula
  • 17. Reboot testi: Sunucuyu yeniden başlat, firewall kuralları yüklendi mi kontrol et
  • 18. fail2ban status kontrol (sudo fail2ban-client status sshd)
  • 19. KVM konsol erişimini son kez test et (acil durum yedeği)

Bu listeyi tamamladıktan sonra VDS'iniz production-ready güvenlik baseline'a sahiptir.

Sık Yapılan Hatalar

  1. Default policy DROP'tan ÖNCE SSH ACCEPT kuralı yazmamak — SSH koparsın
  2. Custom SSH port'una geçtikten sonra firewall'da eski 22 portu açık bırakmak
  3. Database portlarını public bırakmak (3306, 6379, 27017, 9200)
  4. fail2ban ignoreip listesinde kendi IP olmaması — kendinizi banlarsınız
  5. iptables-persistent kurmadan kuralları reboot'ta kaybetmek
  6. IPv6 firewall'ı unutmak — IPv4 kurallı ama IPv6 wide open
  7. ICMP'yi tamamen drop etmek — MTU discovery bozulur, TCP performance düşer
  8. OUTPUT chain'i DROP yapıp paket yöneticisini kilitlemekapt update çalışmaz
  9. Test etmeden default policy DROP yapmak — KVM konsol'a düşersiniz
  10. Backup almadan iptables -F yapmak — kuralları geri alamazsınız

Sık Sorulan Sorular (SSS)

"iptables ve nftables'tan hangisini öğreneyim?"

iptables: Mevcut sistemleri yönetmek, dokümantasyon/Stack Overflow cevaplarının %95'i iptables üzerinden, ekosistem büyük. nftables: Yeni sistemler için tercih edilir, modern dağıtımlarda varsayılan oluyor, syntax daha temiz, performans daha iyi. Pratik öneri: Önce iptables temellerini öğrenin (CKEY için de gerekli), sonra nftables'a geçiş yapın. iptables-translate aracı mevcut iptables komutlarını nftables syntax'ına çevirir.

"Cloudflare kullanıyorum, server firewall gerek var mı?"

Cloudflare proxy moduyla (turuncu bulut aktif), trafik Cloudflare üzerinden gelir ve server origin IP'sini koruma sağlar. Ama: (a) origin IP'niz sızabilir (eski DNS kayıtları, mail header, hata sayfaları), o noktada Cloudflare bypass edilir. (b) Cloudflare sadece HTTP/HTTPS koruma sağlar — SSH, FTP, mail trafiği için server firewall şart. Sonuç: Cloudflare + server firewall birlikte kullanın. iptables -A INPUT -p tcp --dport 80 -s [Cloudflare IP listesi] -j ACCEPT ile sadece Cloudflare'den HTTP/HTTPS kabul edip origin'i ekstra koruyabilirsiniz.

"Kendi SSH'ımı kilitlersem ne olur?"

Buyukweb VDS müşterileri için panel'den KVM web konsol erişimi var. Panel → VDS → KVM Konsol → root login → iptables -F (kuralları flush) → iptables -P INPUT ACCEPT → SSH bağlantınız geri gelir. Bu yüzden firewall kurmadan önce mutlaka KVM konsol erişiminizi test edin. KVM konsol olmayan hosting'lerde rescue mode boot veya provider destek hattı gerekir.

"cPanel yönetimli paketim var, iptables kurmam gerek mi?"

cPanel sunucularında CSF genelde varsayılan olarak kuruludur — iptables üzerine wrapper. cPanel paketinizde CSF aktifse, doğrudan iptables komutları yerine CSF UI veya csf -a, csf -d komutlarıyla yönetin. Manuel iptables komutu yazmak CSF kurallarıyla çakışabilir. cPanel olmayan VDS'te ise iptables veya nftables doğrudan yönetilir.

"fail2ban yerine sadece iptables recent modülü yetmez mi?"

recent modülü basit rate limit yapabilir (örn. 60 saniyede 4+ deneme = drop). Ama: (a) Log analizi yok — başarısız login mi, geçerli mi ayırt etmez, sadece bağlantı sayısı. (b) Pattern bazlı yasak yok — WordPress wp-login.php POST, MySQL auth fail gibi spesifik desenler için custom filter şart. (c) Reboot'ta hafıza kaybolur. fail2ban log dosyalarını gerçek zamanlı izler, başarısız auth pattern'lerini yakalar ve dinamik olarak iptables/nftables kuralı yazar — recent'in çok ötesinde bir araçtır. Öneri: İkisini birlikte kullan — recent ile genel rate limit, fail2ban ile detaylı pattern bazlı koruma.

"Datacenter DDoS koruması varsa ben de sunucu firewall'a gerek yok mu?"

Datacenter L3/L4 DDoS koruması yüksek hacim network seli ile ilgilenir (SYN flood, UDP amplification, 10+ Gbps saldırılar). Bu koruma, tek tek IP'lerden gelen brute force, port scan, uygulama açıkları sömüren spesifik istekleri görmez — onlar "normal trafik" olarak datacenter filtresinden geçer. Sunucu firewall, bu hassas trafiği yakalayan ikinci katmandır. Defense-in-depth ilkesi: birden fazla bağımsız savunma katmanı gerekir. Buyukweb DDoS L3+L4+L7 datacenter seviyesinde aktiftir, ama sunucu firewall'ınız hala şarttır.

Sonuç ve Sonraki Adımlar

VDS güvenliği, datacenter koruma + sunucu firewall + uygulama sıkılaştırması olarak katmanlı bir disiplindir. Bu rehberde işlediğimiz başlıkları özetlemek gerekirse:

  1. Datacenter DDoS L3/L4/L7 koruması Buyukweb tarafında aktif — ama yeterli değil, sunucu firewall şart
  2. iptables ile temel kurallar — default DROP, established/related accept, SSH rate limit, web 80/443
  3. fail2ban ile dinamik brute force koruma — sshd, apache, nginx, postfix, wordpress, recidive jail
  4. KVM web konsol kurtarma yolu — Buyukweb VDS'te paneldenSSH kapısı kilitlenirse erişim
  5. 30-dakikalık başlangıç checklist — SSH key, port değiştirme, fail2ban, kernel hardening
  6. Test araçları — nmap, hping3, shodan ile dış kontrol
  7. Alternatifler — UFW (basit), firewalld (zone-based), CSF (cPanel), nftables (modern)

Bu rehber tek başına bir başlangıç. Her uygulama (Nginx, MySQL, WordPress, Mail) için ayrı sıkılaştırma adımları var. Konuyu derinleştirmek için aşağıdaki rehberlerimize göz atın.


İlgili Büyükweb Rehberleri

VDS sunucunuz için firewall kurulumu, fail2ban yapılandırması, KVM web konsol kullanımı veya kendi kapısını kilitleme kurtarma yolu için 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz. Bursa Tier 3 veri merkezimizde KVM tam virtualizasyon ile root erişim + KVM web konsol kurtarma sunduğumuz için, firewall hataları sizin için tamir edilebilir bir sorundur, panik gerek yok.

VDS & VPS Rehberi İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#VDS#Firewall#iptables#UFW#fail2ban#Güvenlik#Linux

Bu yazıyı paylaş