Ubuntu’da Kernel Parametrelerini Sysctl ile Ayarlama

Sunucu yönetiminde çoğu zaman işletim sisteminin varsayılan ayarları yeterli gelmiyor. Özellikle yüksek trafikli web sunucuları, veritabanı makineleri veya ağ yönlendirme yapan sistemlerde kernel parametrelerini doğru ayarlamak, performans ve güvenilirlik açısından kritik fark yaratıyor. İşte tam bu noktada sysctl devreye giriyor. Ubuntu’da kernel’in çalışma zamanı parametrelerini okumak ve değiştirmek için kullanılan bu araç, /proc/sys/ dizininin üzerine kurulu bir arayüz sunuyor. Bu yazıda sysctl’i gerçek dünya senaryolarıyla birlikte ele alacağız.

Sysctl Nedir ve Nasıl Çalışır?

Linux kernel’i, çalışırken ayarlanabilen yüzlerce parametre sunuyor. Bu parametreler /proc/sys/ dizini altında dosya sistemi yapısında tutuluyor. Örneğin net.ipv4.ip_forward parametresi fiziksel olarak /proc/sys/net/ipv4/ip_forward dosyasına karşılık geliyor. Noktalı gösterim sadece bu dizin yapısını düzleştiriyor.

sysctl komutu bu parametreleri okumak ve değiştirmek için kullanılan standart araç. Doğrudan echo komutuyla ilgili dosyaya yazmak da teknik olarak mümkün, ancak sysctl daha temiz ve kontrollü bir yol sunuyor.

Önemli bir not: sysctl ile yapılan değişiklikler varsayılan olarak geçici. Sistemi yeniden başlattığınızda parametreler kernel varsayılanlarına dönüyor. Kalıcı hale getirmek için /etc/sysctl.conf veya /etc/sysctl.d/ altındaki dosyaları kullanmak gerekiyor.

Temel Sysctl Kullanımı

Önce mevcut bir parametrenin değerini okuyalım:

# Tek bir parametre okuma
sysctl net.ipv4.ip_forward

# Tüm parametreleri listeleme
sysctl -a

# Belirli bir kategorideki parametreleri filtreleme
sysctl -a | grep net.ipv4

# Sadece değeri göster (script kullanımında işe yarar)
sysctl -n net.ipv4.ip_forward

Parametre değiştirmek için -w flagini kullanıyoruz:

# Çalışma zamanında parametre değiştirme (geçici)
sudo sysctl -w net.ipv4.ip_forward=1

# Birden fazla parametre aynı anda
sudo sysctl -w net.ipv4.tcp_syncookies=1 net.ipv4.tcp_fin_timeout=30

Kalıcı değişiklik yapmak içinse ya doğrudan /etc/sysctl.conf dosyasını düzenliyoruz ya da daha modern ve düzenli bir yaklaşım olarak /etc/sysctl.d/ altına özel dosyalar oluşturuyoruz:

# Özel bir sysctl dosyası oluşturma
sudo nano /etc/sysctl.d/99-custom.conf

# Dosya içeriği örneği:
# net.ipv4.ip_forward = 1
# net.ipv4.tcp_syncookies = 1

# Değişiklikleri yeniden başlatmadan uygulama
sudo sysctl --system

# Belirli bir dosyayı uygulama
sudo sysctl -p /etc/sysctl.d/99-custom.conf

/etc/sysctl.d/ dizinindeki dosyalar alfabetik sıraya göre işleniyor. Bu yüzden 99- gibi yüksek numaralı dosyalar diğerlerini geçersiz kılabiliyor. Paket yöneticileri genellikle 10- veya 20- ile başlayan dosyalar oluşturduğundan kendi ayarlarınız için 99- prefiksini kullanmak iyi bir alışkanlık.

Ağ Performansını Artıran Parametreler

TCP Tampon Boyutlarını Optimize Etme

Yüksek bant genişlikli ağlarda TCP tampon boyutları büyük önem taşıyor. Varsayılan değerler çoğu zaman küçük kalıyor. Özellikle 1Gbps ve üzeri bağlantılarda ya da yüksek gecikmeli (yüksek RTT) ağlarda bu ayarlar belirgin fark yaratıyor.

# Mevcut TCP tampon değerlerini kontrol etme
sysctl net.core.rmem_max
sysctl net.core.wmem_max
sysctl net.ipv4.tcp_rmem
sysctl net.ipv4.tcp_wmem

Yüksek performanslı bir web sunucusu için /etc/sysctl.d/99-network-performance.conf dosyasına şunları ekleyebilirsiniz:

# Maksimum soket alım tamponu (bytes)
net.core.rmem_max = 134217728

# Maksimum soket gönderim tamponu (bytes)
net.core.wmem_max = 134217728

# TCP alım tamponu: minimum, varsayılan, maksimum
net.ipv4.tcp_rmem = 4096 87380 134217728

# TCP gönderim tamponu: minimum, varsayılan, maksimum
net.ipv4.tcp_wmem = 4096 65536 134217728

# Ağ kartı kuyruk uzunluğu
net.core.netdev_max_backlog = 5000

# TCP window scaling
net.ipv4.tcp_window_scaling = 1

SYN Flood Koruması ve Bağlantı Yönetimi

Bir web sunucusunu internete açık bıraktığınızda SYN flood saldırılarıyla karşılaşmak kaçınılmaz. TCP SYN cookies mekanizması bu tür saldırılara karşı etkili bir önlem:

# SYN flood koruması için önerilen ayarlar
cat > /etc/sysctl.d/99-syn-flood-protection.conf << 'EOF'
# SYN cookie korumasını etkinleştir
net.ipv4.tcp_syncookies = 1

# SYN backlog kuyruğunu artır
net.ipv4.tcp_max_syn_backlog = 8192

# SYN-ACK yeniden deneme sayısını azalt
net.ipv4.tcp_synack_retries = 2

# SYN yeniden deneme sayısını azalt
net.ipv4.tcp_syn_retries = 3

# Listen backlog
net.core.somaxconn = 65535

# FIN_WAIT_2 zaman aşımı
net.ipv4.tcp_fin_timeout = 30

# TIME_WAIT soketlerini yeniden kullan
net.ipv4.tcp_tw_reuse = 1
EOF

sudo sysctl -p /etc/sysctl.d/99-syn-flood-protection.conf

IP Yönlendirme Ayarı

VPN sunucusu kuruyorsanız, iki ağ arasında köprü oluşturuyorsanız veya Docker/LXC kullanıyorsanız IP yönlendirmeyi etkinleştirmeniz gerekiyor:

# IP yönlendirmeyi etkinleştir (kalıcı)
echo "net.ipv4.ip_forward = 1" | sudo tee /etc/sysctl.d/99-ip-forward.conf
sudo sysctl -p /etc/sysctl.d/99-ip-forward.conf

# Kontrol et
sysctl net.ipv4.ip_forward
# Çıktı: net.ipv4.ip_forward = 1

# IPv6 yönlendirme de gerekiyorsa
echo "net.ipv6.conf.all.forwarding = 1" | sudo tee -a /etc/sysctl.d/99-ip-forward.conf

Bellek Yönetimi Parametreleri

Swappiness Ayarı

vm.swappiness belki de en çok bilinen sysctl parametresi. Kernel’in ne kadar agresif şekilde swap kullanacağını belirliyor. 0-100 arasında değer alıyor; 0 swap’ı minimize ediyor, 100 ise agresif şekilde kullanıyor.

vm.swappiness = 60: Varsayılan değer, genel kullanım için makul. vm.swappiness = 10: Veritabanı sunucuları için önerilen, RAM mümkün olduğunca kullanılıyor. vm.swappiness = 1: Neredeyse hiç swap kullanmıyor, yalnızca OOM durumunda devreye giriyor.

# Mevcut değeri kontrol et
sysctl vm.swappiness

# Geçici olarak değiştir
sudo sysctl -w vm.swappiness=10

# PostgreSQL veya MySQL gibi veritabanı sunucuları için kalıcı ayar
echo "vm.swappiness = 10" | sudo tee /etc/sysctl.d/99-database-tuning.conf
sudo sysctl -p /etc/sysctl.d/99-database-tuning.conf

Dirty Ratio Parametreleri

Disk yazma işlemleri için bellek tamponlamasını kontrol eden bu parametreler, yoğun disk yazma yapan sistemlerde önem kazanıyor:

cat > /etc/sysctl.d/99-vm-tuning.conf << 'EOF'
# RAM'in %15'i kirlendiğinde yazmaya başla (varsayılan %20)
vm.dirty_ratio = 15

# Arka planda yazma başlangıç eşiği (varsayılan %10)
vm.dirty_background_ratio = 5

# Maksimum kirli veri bekleme süresi (centisaniye, 30 sn)
vm.dirty_expire_centisecs = 3000

# Kirli veri yazma tarama aralığı (centisaniye, 5 sn)
vm.dirty_writeback_centisecs = 500
EOF

OOM Killer Davranışı

Out of Memory (OOM) durumlarında kernel hangi süreci öldüreceğine karar vermek zorunda. Bu davranışı ayarlamak mümkün:

# Kritik sistem servislerini OOM killer'dan koruma
# Örneğin bir veritabanı için (PID'i bul)
DB_PID=$(systemctl show -p MainPID postgresql | cut -d= -f2)
echo -17 | sudo tee /proc/$DB_PID/oom_adj

# OOM durumunda panic yerine kill
sudo sysctl -w vm.panic_on_oom=0

# OOM log'larını kontrol et
dmesg | grep -i "oom|killed process"

Güvenlik Odaklı Parametreler

Güvenlik sertleştirmesi (hardening) söz konusu olduğunda sysctl güçlü bir araç. Özellikle internete açık sunucularda şu parametreler mutlaka değerlendirilmeli:

cat > /etc/sysctl.d/99-security-hardening.conf << 'EOF'
# ICMP redirect kabul etme (MITM saldırısı vektörü)
net.ipv4.conf.all.accept_redirects = 0
net.ipv4.conf.default.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Secure ICMP redirect
net.ipv4.conf.all.secure_redirects = 0
net.ipv4.conf.default.secure_redirects = 0

# IP spoofing koruması (kaynak doğrulama)
net.ipv4.conf.all.rp_filter = 1
net.ipv4.conf.default.rp_filter = 1

# ICMP broadcast ping'leri yok say (Smurf saldırısı koruması)
net.ipv4.icmp_echo_ignore_broadcasts = 1

# Kötü hata mesajlarını yok say
net.ipv4.icmp_ignore_bogus_error_responses = 1

# SYN cookies
net.ipv4.tcp_syncookies = 1

# IP source routing'i devre dışı bırak
net.ipv4.conf.all.accept_source_route = 0
net.ipv4.conf.default.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0

# Log spoofed, source routed ve redirect paketleri
net.ipv4.conf.all.log_martians = 1
net.ipv4.conf.default.log_martians = 1

# Router advertisement'larını kabul etme (sunucu için)
net.ipv6.conf.all.accept_ra = 0
net.ipv6.conf.default.accept_ra = 0

# IPv6 router advertisement
net.ipv6.conf.all.autoconf = 0

# Kernel pointer'larını /proc'ta gizle
kernel.kptr_restrict = 2

# dmesg'i kısıtla (privilege escalation için kullanılabilir)
kernel.dmesg_restrict = 1

# PTRACE scope (container ortamı değilse 1 veya 2 önerilir)
kernel.yama.ptrace_scope = 1

# Sysrq tuşunu kısıtla
kernel.sysrq = 0

# Core dump'ları devre dışı bırak (hassas bilgi sızıntısı)
fs.suid_dumpable = 0
EOF

sudo sysctl --system

Dosya Sistemi ve Süreç Limitleri

Yoğun trafik alan bir Nginx veya Apache sunucusunda “too many open files” hatasıyla karşılaştıysanız, dosya tanımlayıcı limitlerini artırmak gerekiyor:

# Mevcut sistem limitlerini kontrol et
sysctl fs.file-max
sysctl fs.file-nr  # açık dosyalar, serbest slotlar, maksimum

# Maksimum açık dosya sayısını artır
echo "fs.file-max = 2097152" | sudo tee -a /etc/sysctl.d/99-file-limits.conf

# İnotify izleyici sayısını artır (geliştirme araçları için kritik)
cat >> /etc/sysctl.d/99-file-limits.conf << 'EOF'
# Inotify watchers (IDE'ler, monitoring araçları için)
fs.inotify.max_user_watches = 524288
fs.inotify.max_user_instances = 512

# Maksimum süreç/thread sayısı
kernel.pid_max = 4194304

# Maksimum açık dosya tanımlayıcısı
fs.file-max = 2097152
EOF

sudo sysctl -p /etc/sysctl.d/99-file-limits.conf

Gerçek Dünya Senaryosu: Yüksek Trafikli Nginx Sunucusu

Diyelim ki aylık 50 milyon istek alan bir web uygulaması çalıştırıyorsunuz. Sunucu zaman zaman bağlantı hatası veriyor ve netstat -an | grep TIME_WAIT çalıştırdığınızda binlerce TIME_WAIT soketi görüyorsunuz. Bu durumda şu adımları izleyebilirsiniz:

# Önce mevcut durumu belgele
echo "=== Mevcut Sysctl Değerleri ===" > /tmp/before_tuning.txt
sysctl net.ipv4.tcp_fin_timeout >> /tmp/before_tuning.txt
sysctl net.ipv4.tcp_tw_reuse >> /tmp/before_tuning.txt
sysctl net.core.somaxconn >> /tmp/before_tuning.txt
netstat -an | grep -c TIME_WAIT >> /tmp/before_tuning.txt

# Nginx yüksek trafik ayarları
cat > /etc/sysctl.d/99-nginx-hightraffic.conf << 'EOF'
# FIN_WAIT_2 zaman aşımını kısalt
net.ipv4.tcp_fin_timeout = 15

# TIME_WAIT soketlerini yeni bağlantılar için yeniden kullan
net.ipv4.tcp_tw_reuse = 1

# Lokal port aralığını genişlet
net.ipv4.ip_local_port_range = 1024 65535

# Maksimum bağlantı kuyruğu
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# Keepalive optimizasyonu
net.ipv4.tcp_keepalive_time = 300
net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15

# TCP tampon
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
EOF

sudo sysctl -p /etc/sysctl.d/99-nginx-hightraffic.conf

# Değişiklik sonrası durumu kontrol et
echo "TIME_WAIT soket sayısı:"
netstat -an | grep -c TIME_WAIT

Mevcut Ayarları Yedekleme ve Geri Yükleme

Herhangi bir tuning çalışması öncesinde mevcut durumu kaydetmek hayat kurtarıcı:

# Tüm mevcut kernel parametrelerini yedekle
sudo sysctl -a > /root/sysctl_backup_$(date +%Y%m%d_%H%M%S).txt

# Belirli bir kategoriyi yedekle
sudo sysctl -a | grep "^net." > /root/network_params_backup.txt

# Geri yükleme için (tek tek uygulamak gerekiyor, sysctl -p ile doğrudan yüklenemez)
# Bunun için özel bir script kullanın
cat > /root/restore_sysctl.sh << 'EOF'
#!/bin/bash
while IFS=' = ' read -r key value; do
    [[ "$key" =~ ^# ]] && continue
    [[ -z "$key" ]] && continue
    sysctl -w "${key}=${value}" 2>/dev/null
done < /root/sysctl_backup.txt
EOF
chmod +x /root/restore_sysctl.sh

Değişiklikleri Test Etme ve Doğrulama

Yapılan değişikliklerin etkisini ölçmek için basit bir kontrol akışı:

# Bir parametrenin geçerli değerini doğrula
sysctl net.ipv4.tcp_syncookies
# Çıktı: net.ipv4.tcp_syncookies = 1

# Tüm sysctl.d dosyalarının başarıyla uygulandığını kontrol et
sudo sysctl --system 2>&1 | grep -i error

# /proc/sys ile karşılaştır (aynı olmalı)
cat /proc/sys/net/ipv4/tcp_syncookies

# Systemd-journald ile uygulama loglarını takip et
journalctl -f -u sysctl 2>/dev/null || dmesg -w

Ubuntu Sürümleri Arası Farklılıklar

Ubuntu 22.04 ve sonrasında bazı parametreler değişti veya kaldırıldı. net.ipv4.tcp_tw_recycle parametresi kernel 4.12’de kaldırıldığından bu değeri ayarlamaya çalışmak hata verecektir. sysctl -a 2>/dev/null ile geçerli parametreleri listelemek ve sonrasında değişiklik yapmak daha güvenli bir yaklaşım.

Ayrıca Ubuntu’da AppArmor ve seccomp gibi güvenlik mekanizmaları bazı parametreleri kısıtlayabiliyor. Sanal makine veya container ortamında çalışıyorsanız bazı parametreler namespace seviyesinde izole ediliyor ve root olsanız bile değiştiremeyebilirsiniz.

Sonuç

sysctl ile kernel parametre yönetimi, sistem yöneticiliğinin temel becerilerinden biri. Yaptığınız her değişikliği belgelemenizi, önce test ortamında denemenizi ve production’a almadan önce sistemin nasıl tepki verdiğini izlemenizi şiddetle tavsiye ederim. Özellikle TCP tampon ayarları ve vm parametreleri bazı iş yüklerinde beklenmedik etkiler yaratabilir.

Güvenlik sertleştirme parametrelerini uygulamadan önce sisteminizdeki uygulamaların bu kısıtlamalarla uyumlu olup olmadığını da kontrol edin. Örneğin kernel.yama.ptrace_scope = 2 gibi kısıtlayıcı bir ayar bazı debugging araçlarını kırabilir.

Son olarak, /etc/sysctl.d/ yapısını kullanmak her zaman daha temiz bir yönetim sunuyor. Her sunucu rolü için ayrı dosyalar oluşturmak (güvenlik ayarları, ağ optimizasyonu, dosya limitleri gibi) hem okunabilirliği artırıyor hem de sorun gidermeyi kolaylaştırıyor. Bir değişikliği geri almak istediğinizde sadece ilgili dosyayı silip sysctl --system çalıştırmanız yeterli oluyor.

Yorum yapın