Debian sunucu üzerinde ufw güvenlik duvarını etkinleştirmiş, bazı hizmetler için port açma kuralları oluşturmuştum.
sudo ufw allow <hizmet>
Ara sıra güvenlik kayıtlarını incelemek için bağlanıyor
sudo journalctl -u <hizmet> --since "1 week ago"
gibi bir komut ile son 1 hafta içinde gerçekleşen olaylara ait kayıtları inceliyordum. Şüpheli/ısrarcı bir IP adresinden gelen istekler ile ilgili engelleme kuralları koyuyordum.
sudo ufw deny from 192.168.5.0/24 to any
Normalde /var/log/ufw.log dosyasında engellenen IP adreslerine ait kayıtlarının olması gerekir.
sudo tail /var/log/ufw.log
Bir süre sonra farkettim ki ufw ile önce istediğim hizmeti etkinleştirip altında da ufw deny komutu ile eklediğim IP engellemeleri aslında engellenmiyor. Bunun sebebi de genel olarak güvenlik duvarı kuralları içinde işlemin üstteki kuraldan başlaması ve aşağıya doğru inmesi. Trafiğe uyan bir kural bulunduktan sonra alttaki diğer kurallar işletilmiyor. Yani üstte hizmete izin veren bir kural varsa attaki engellemeler çalışmıyor. Bunun için engelleme kurallarını izin verme kurallarının üstüne koymaya başladım, aşağıdaki gibi
sudo ufw insert 1 deny from 192.168.5.0/24 to any
Bunun sonucunda da /var/log/ufw.log dosyasına artık kayıtlar düşmemeye başladı. Acaba engellemeler çalışmıyor mu diye düşündüm ama
sudo iptables -L ufw-user-input -v -n
komutuyla baktığımda ilgili engelleme kurallarının yanıdaki sayaçların arttığını gördüm. Yani engelleme kuralları çalışıyor ama log kayıtları oluşmuyordu. Arka planda iptables altyapısını kullanan ufw, izin, engelleme ve log işlemleri için karmaşık bir kural yapısına sahip. insert ile üst sıraya eklediğim kurallar log yapısını bozuyor. Buna çözüm olarak önce ufw-user-input zincirine iptables komutu ile yeni LOG kuralı eklemeyi (her IP için ayrı kural) denedim.
sudo iptables -I ufw-user-input 1 -s 192.168.5.0/24 -j LOG --log-prefix "[UFW BLOCK] "
Ama her yeni IP adresi engelleme kurallı eklediğimde ufw, iptables kurallarını sıfırlayıp kuralları tekrar baştan yazdığı için log kuralım da siliniyordu. Bu duruma çözüm olarak LOG kurallarını ufw-user-input zincirine değil de ufw-before-input zincirine eklemeyi, ekleme işlemini de /etc/ufw/before.rules dosyası aracılığıyla yapmayı buldum. Bu şekilde kuralları değiştirdiğimde eski LOG silinmiyor. before.rules dosyasında *filter anahtar kelimesi ile başlayan ve # End required lines ile biten bölümden hemen sonra
-A ufw-before-input -s 192.168.5.0/24 -j LOG --log-prefix "[UFW BLOCK] " --log-level 4
ekliyorum. Bunu da engellediğim her IP adresi için ayrı ayrı yapıyorum.
iptables altyapısı aslında /var/log/ufw.log gibi bir dosyaya log yazmıyor. ufw nasıl oluyor da buraya yazabiliyor, merak ettim. Loglar aslında
/var/log/syslog/var/log/messages
/var/log/kern.log
yazılıyor. Bu loglar üzerinden de
grep "UFW BLOCK" /var/log/kern.log
gibi sorgular ile ufw engellemeleri görülebiliyor. Bunların ufw.log dosyasında da görünmesini sağlayan ise rsyslog sistemi. /etc/rsyslog.d/20-ufw.conf dosyasında aşağıdaki gibi bir satır var.
:msg,contains,"[UFW " /var/log/ufw.log
Bu satır sayesinde syslog kayıtlarında içinde "[UFW " geçen logların /var/log/ufw.log dosyasına yönlendirilmesi sağlanmış.
Dahası, bir süredir iptables altyapısı yerine nftables'ın kullanıldığı farkettim.
sudo iptables -V
komutu sonucunda parantez içinde nf_tables yazıyorsa evet, iptables yerine nftables kullanıyoruz demek. Bunun yerine parantez içinde legacy yazıyor veya olabilir ya da parantez içinde bir ifade olmayabilir. Bu, iptables olduğunun göstergesi. Bir süre daha uyumluluk modunda iptables komutları ile çalışabiliriz. Ama bu uyumluluk modu uzun sürmeyecek. Sistemde nftables'ın izlerini aramak için önce kurulu paketlerin içinde nftables arayabilirim. Debian tabanlı sistemlerde
dpkg -l | grep -E "(iptables|nftables|ufw)"veya Fedora türevlerinde
rpm -qa | grep -E "(iptables|nftables|firewalld)"
Yüklü modüllerde nf_tables olup olmadığına bakabilirim
lsmod | grep nf_tables
systemd birimlerine bakabilirim
systemctl list-units --type=service | grep -E "(iptables|nftables|firewall)">
Son olarak nftables kullanan bir sistemde
nft list ruleset
ile json formatında bir çıktı kural kümesini gösterir.