Sunucuyu yeniden başlattıktan sonra ufw allow 8080 ile açtığınız 8080 portu yeniden kapandıysa, sorun sizin komutunuzda değil; kuralın runtime zincirine yazılmış ve başlangıç dosyasına kaydedilmemiş olmasındadır. Bu metin, hangi kuralı istediğinizi bildiğiniz ancak diğer araçtaki tam eşdeğerine veya kalıcı biçimine ihtiyaç duyduğunuz durumlar içindir.
Üç araç, üç farklı zihinsel model
iptables doğrusal zincirler üzerinde çalışır ve her paket, ilk eşleşen kurala kadar yukarıdan aşağıya değerlendirilir. nftables aynı modeli tablolar, set'ler ve map'lerle ileri taşır ve 3.13 çekirdeğinden itibaren kullanılabilir; günümüz dağıtımlarının çoğunda iptables, nft üzerinde yalnızca bir uyumluluk katmanıdır. ufw ve firewalld ise bu ikisinden biri için kural üreticisinden başka bir şey değildir.
Bunun pratik sonucu şudur: aynı anda hem ufw hem de bir iptables -A betiği çalıştırıyorsanız, aynı zincir üzerinde iki yazarınız var demektir ve kural sıralamanız artık öngörülemez. Birini seçin.
Komutların iptables, nftables ve ufw'deki tam eşdeğerleri
Aşağıdaki tablo, gerçekten aranan şeyleri içerir. nft sütunu modern eşdeğerdir, birebir çeviri değildir.
| İşlem | iptables | nftables | ufw |
|---|---|---|---|
| Kuralları görüntüleme | iptables -L -n -v --line-numbers | nft list ruleset | ufw status verbose |
| Port açma | iptables -A INPUT -p tcp --dport 443 -j ACCEPT | nft add rule inet filter input tcp dport 443 accept | ufw allow 443/tcp |
| SSH hız sınırlama | iptables -A INPUT -p tcp --dport 22 -m conntrack --ctstate NEW -m recent --set | nft add rule inet filter input tcp dport 22 ct state new limit rate 4/minute accept | ufw limit 22/tcp |
| Bir kuralı silme | iptables -D INPUT 3 | nft -a list chain inet filter input ardından nft delete rule inet filter input handle 12 | ufw delete allow 443/tcp |
| Kalıcı kaydetme | iptables-save > /etc/iptables/rules.v4 | /etc/nftables.conf dosyası ve systemctl enable nftables | /etc/ufw/ içinde otomatik |
Çok zaman kaybettiren küçük bir nokta: nftables'da bir kural içinde ct state ve dport sırası önemli değildir, ancak kuralların birbirine göre sırası önemlidir. iptables'da da durum aynıdır. DROP kuralını ACCEPT'ten önce koyarsanız, paket asla ikinci satıra ulaşmaz ve açıkça -j LOG koymadığınız sürece logda da bir şey görmezsiniz.
Kalıcı kaydetme: en çok kuralın kaybolduğu yer
Debian ve Ubuntu'da iptables-persistent paketi, önyüklemede /etc/iptables/rules.v4 ve rules.v6 dosyalarını yükler. RHEL ve türevlerinde iptables-services ve service iptables save. Hiçbiri kurulu değilse, kurallarınız yalnızca bir sonraki yeniden başlatmaya kadar yaşar.
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6
systemctl enable --now netfilter-persistent
nftables için /etc/nftables.conf dosyasını nft list ruleset > /etc/nftables.conf ile yeniden yazın ve servisi enable edin. Dikkatli olun, bu komut tüm dosyayı değiştirir; içinde yorum veya include varsa kaybolur.
Burada hata yapıyorlar
Ticket'larda en sık gördüğüm hata şudur: biri önceden ufw allow 22/tcp çalıştırmadan ufw enable yazıyor ve SSH bağlantısı kesildikten sonra ağ hatası arıyor. Belirtisi şudur: ping yanıt verir (çünkü ICMP, ufw'nin varsayılan politikasında izinlidir) ancak 22 portundaki ssh zaman aşımına uğrar. Erişimi kaybettiyseniz, rescue modu ve sunucuyu yeniden kurma yoluyla giriş yapıp kuralları düzeltebilirsiniz.
Değerlendirme sırası ve özel zincirler
iptables'da üç yerleşik zinciriniz vardır: INPUT, OUTPUT ve FORWARD. Sunucunuz yönlendirici veya konteyner ana makinesi rolündeyse FORWARD'ı hafife almayın; Docker varsayılan olarak kendi kurallarını DOCKER-USER ve DOCKER zincirlerine enjekte eder ve sizin FORWARD DROP politikanız konteyner trafiğini kesebilir. VPS'te Docker çalıştırıyorsanız, FORWARD'a dokunmadan önce VPS'te Docker kurulumu sayfasına bakın ki hangi zincirlere dokunmamanız gerektiğini bilin.
Hata ayıklama için sayaçlar en iyi dostunuzdur. iptables -L INPUT -n -v her kuralın paket sayısını gösterir. Bir kural sıfır paket aldıysa, ona hiç trafik ulaşmamıştır ve sorun başka bir yerdedir. nftables'daki eşdeğeri, kuralın counter ile oluşturulmuş olması koşuluyla sayaçlarla birlikte nft list ruleset'tir.
Varsayılan politikayı her şeyden önce belirleyin
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
Bu dört satır, her sağlıklı güvenlik duvarının temelidir. ESTABLISHED,RELATED satırını silmeyin; o olmadan DNS yanıtları ve giden bağlantılar da geri dönerken kesilir. Sunucunuzda MySQL servisi varsa ve dışarıdan ona bağlanıyorsanız, 3306 portunu tüm internete açmak yerine MySQL erişimini kısıtlama yolunu izleyin.
Hangisini seçmeliyim
Sunucu yeni kurulduysa ve profesyonel bir sistem yöneticiniz yoksa ufw'yi seçin. Sözdizimi kısadır, otomatik kaydetme özelliği vardır ve senaryoların %90'ı için yeterlidir. Bulut altyapısında çalışıyorsanız ve dinamik kurallarınız veya büyük IP set'leriniz varsa, nftables doğru seçimdir; hash tipi bir set'te binlerce IP üzerinde lookup sabit karmaşıklığa sahiptir, oysa iptables doğrusal olarak tarar. iptables'ı yalnızca eski betikler veya yönetim panelleri ona bağımlıysa koruyun.
Kabul etmeniz gereken bedel: nftables, 3.13 çekirdeğinden eski dağıtımlarda çalışmaz ve bazı izleme araçları hâlâ iptables -L çıktısını ayrıştırır. Ekibiniz bu çıktıya bağımlıysa, geçişi erteleyin.
Her değişiklikten önce geri dönüş yolunuz olsun
INPUT zincirine her dokunduğunuzda, bir at veya screen ile geri yükleme komutunu zamanlayın. Örneğin echo "iptables-restore < /root/rules.backup" | at now + 10 minutes. Kendinizi dışarı kilitlediyseniz, on dakika sonra geri dönersiniz. Bu alışkanlık, herhangi bir dokümantasyondan daha fazla sizi kurtarır.
Yoğun trafiği olan sunucular için güvenlik duvarı işin yalnızca bir parçasıdır; kuralları uyguladıktan sonra yük yükseldiyse, yüksek sunucu yükünün nedenini teşhis etme bir sonraki adımdır. Ve özel veya bulut sunucuda çalışıyorsanız ve ağın hangi katmanının sizin elinizde olduğunu bilmek istiyorsanız, özel sunucu ve bulut sunucu sayfalarına bakın. İlk kurulum için de root erişimli bir Linux hosting yeterlidir; bu kuralları aracısız test edebilirsiniz.
Sık sorulan sorular
Sunucu yeniden başlatıldıktan sonra iptables kuralları neden siliniyor?
Çünkü kurallar yalnızca çekirdek belleğindedir ve bir dosyaya kaydedilmemiştir. iptables-save > /etc/iptables/rules.v4 ile onları yazın ve iptables-persistent veya netfilter-persistent paketini kurup enable edin. Bu adım olmadan, her yeniden başlatma veya ağ servisi yeniden yüklemesi kuralları başlangıç durumuna döndürür.
ufw ile iptables arasındaki fark nedir ve hangisi daha hızlıdır?
ufw, iptables veya nftables üzerinde bir kullanıcı arayüzüdür ve kendine ait ayrı bir filtreleme motoru yoktur; dolayısıyla paket işleme hızı ikisinde de aynıdır. Fark yönetimdedir: ufw kaydetmeyi ve sıralamayı kendi tutar, iptables tam kontrol verir ancak her şeyi elle yazmanız gerekir.
Bir portun gerçekten kapalı mı yoksa servisin dinlemediğini mi nasıl anlarım?
Dışarıdan nc -vz your-server-ip 443 ile test edin. Bağlantı reddedildiyse ancak sunucuda ss -tlnp servisin o portta listen yaptığını gösteriyorsa, sorun güvenlik duvarındadır. Servis listen yapmıyorsa, güvenlik duvarının suçu yoktur ve servisi incelemelisiniz.
Servisin dışarıdan erişilebilir olması için güvenlik duvarında port açmak yeterli mi?
Hayır. Üç katmanın uyumlu olması gerekir: sistem güvenlik duvarı, bulut ağı güvenlik duvarı (security group) ve 127.0.0.1 yerine 0.0.0.0 üzerinde dinleyen servisin kendisi. Servis localhost'a bağlanmışsa, hiçbir güvenlik duvarındaki hiçbir kural onu dışarıdan erişilebilir kılamaz.