UFW ile Güvenlik Duvarı: Linux Sunucular İçin Temel Kurallar
UFW ile gelen bağlantıları varsayılan olarak engelleyip yalnızca gerekenlere izin vermek, SSH'e erişimi yerel ağla sınırlamak ve kuralları güvenle yönetmek için adım adım rehber.
Bir sunucuda çalışan her servis, ağdan ulaşılabilecek bir kapıdır. Bazılarını bilerek açarsınız (SSH, web uygulaması); bazıları ise kurulumla birlikte kendiliğinden dinlemeye başlar. Güvenlik duvarı, "yalnızca bildiğim kapılar açık olsun" ilkesini zorunlu kılan katmandır. Debian ve Ubuntu tabanlı sistemlerde bunu en kolay yapan araç UFWdur (Uncomplicated Firewall); altta iptables/nftables kullanır ama size sade bir arayüz sunar.
Önce ne dinliyor?
Kural yazmadan önce, hangi portların dinlendiğini görün:
sudo ss -tlnp
Çıktıdaki Local Address:Port sütununda 0.0.0.0:22 ya da *:22 gibi değerler, o portun tüm arayüzlerden erişilebilir olduğunu gösterir. 127.0.0.1:3306 ise yalnızca yerel makineden erişilebilir demektir ve veritabanları için olması gereken budur. Güvenlik duvarı, bu listeye ek bir güvence katmanıdır; ama servisleri gereksiz yere dışarı açmamak daha da iyidir.
Kurulum
UFW Raspberry Pi OS'ta varsayılan olarak yüklü olmayabilir:
sudo apt install ufw
sudo ufw status
İlk durumda Status: inactive görmelisiniz. Henüz hiçbir şey engellenmiyor.
Altın kural: önce SSH'e izin ver, sonra etkinleştir
En sık yapılan hata, SSH ile bağlıyken UFW'yi etkinleştirip kendini dışarıda bırakmaktır. Sıra şöyle olmalı:
# 1) Varsayılan politikalar
sudo ufw default deny incoming
sudo ufw default allow outgoing
# 2) SSH'e izin ver — sadece yerel ağdan
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
# 3) Etkinleştir
sudo ufw enable
Birinci adım, gelen bağlantıları varsayılan olarak reddeder ve giden bağlantılara (güncelleme, e-posta, NTP) izin verir. İkinci adım, SSH'e yalnızca 192.168.1.0/24 ağından erişim tanır; bu adresi kendi yerel ağ aralığınızla değiştirin. Etkinleştirirken uyarı çıkar ("mevcut SSH bağlantılarını kesebilir"); kuralı eklediyseniz onaylayabilirsiniz.
Ağınızın aralığını bilmiyorsanız:
ip -4 addr show eth0
inet 192.168.1.50/24 gibi bir satır, ağın 192.168.1.0/24 olduğunu gösterir.
Uygulamanıza erişim
Bir web uygulaması 5000 numaralı portta çalışıyorsa ve yalnızca yerel ağdan erişilecekse:
sudo ufw allow from 192.168.1.0/24 to any port 5000 proto tcp
Uygulama bir ters vekil (nginx) ya da Cloudflare Tunnel arkasındaysa, dışarıdan doğrudan erişim gerekmez. Tünel yazısında anlatıldığı gibi tünel giden bir bağlantı kurduğu için, uygulama portunu hiç açmadan yayın yapabilirsiniz. Bu durumda uygulamayı 127.0.0.1'e bağlayıp güvenlik duvarında hiçbir kural eklememek en güvenli yapıdır.
Brute-force'a karşı: limit
UFW'nin limit kuralı, bir adresten 30 saniye içinde 6 ya da daha fazla bağlantı denemesi gelirse o adresi geçici olarak engeller:
sudo ufw limit 22/tcp
Bu, SSH'i internete açtığınız (ya da açma ihtimali olan) durumlarda temel bir korumadır. Daha kapsamlı koruma için fail2ban rehberine bakın; ikisini birlikte kullanabilirsiniz. İç ağda bile, tehlikeye girmiş bir cihaz sizin sunucunuza deneme yapabilir.
Kuralları görmek ve silmek
sudo ufw status verbose
sudo ufw status numbered
Numaralı liste, silmek için kolaylık sağlar:
sudo ufw delete 3
Silme işleminden sonra numaralar yeniden dizilir; art arda silerken her seferinde listeyi yeniden okuyun. Hatalı bir kural yüzünden bağlantıyı kaybettiyseniz ve fiziksel erişiminiz varsa sudo ufw disable ile kapatabilirsiniz.
Günlük kaydı
sudo ufw logging low
Engellenen bağlantılar /var/log/ufw.log ve journal'a yazılır. Bunları journalctl ile ya da dosyadan inceleyebilirsiniz. İnternete açık bir cihazda günlükler kısa sürede şişebilir; SD kartı olan cihazlarda low seviyesini tercih edin ve yazma trafiğine dikkat edin.
Sık yapılan hatalar
IPv6'yı unutmak. UFW varsayılan olarak IPv6 kurallarını da yönetir (/etc/default/ufw içinde IPV6=yes). IPv6 kullanmıyorsanız bile ayarın tutarlı olduğundan emin olun.
Docker ile çakışma. Docker, kendi iptables kurallarını ekler ve UFW kurallarını atlayabilir; yani UFW'de engellenmiş bir portu bir konteyner yine yayınlayabilir. Docker kullanıyorsanız yayınlanan portları ayrıca denetleyin.
Güvenlik duvarına aşırı güvenmek. Güvenlik duvarı, zayıf bir parolayı ya da güncellenmemiş bir yazılımı kurtarmaz. SSH için anahtarla giriş, uygulama için güvenli oturum yine gereklidir.
Kuralı deneme-yanılmayla eklemek. Her kuralı bir amaçla ekleyin ve gerekçesini bir yere not edin. Altı ay sonra "bu port neden açık?" sorusuna cevap verebilmelisiniz.
Kontrol listesi
- Gelen varsayılan:
deny; giden:allow. - SSH yalnızca gereken adreslere açık.
- Her açık port için bir gerekçe var.
- Veritabanı portu (3306) dışarıya kapalı.
ufw status verboseçıktısı belgelenmiş.- Kural değişikliğinden önce ikinci bir SSH oturumu açık tutuluyor; böylece hata yaparsanız geri dönebilirsiniz.
Bu kısa düzen, çoğu küçük sunucu için yeterli bir temel güvenliktir. Daha karmaşık ağlarda (VLAN'lar, birden fazla alt ağ) bir güvenlik duvarını modem düzeyinde de yapılandırmak gerekir; ama sunucunun kendi duvarı her zaman son savunma hattıdır.
Uygulamalı kurulum: sıfırdan örnek
Yerel ağdaki bir Pi'de yalnızca SSH ve bir web paneline izin vermek istediğimizi varsayalım (ağ 192.168.1.0/24):
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from 192.168.1.0/24 to any port 22 proto tcp
sudo ufw allow from 192.168.1.0/24 to any port 8000 proto tcp
sudo ufw enable
sudo ufw status verbose
Varsayılan politika "gelen her şeyi reddet" olduğundan, açıkça izin verilmeyen hiçbir şey erişilemez. Kurallar yalnızca yerel ağdan geldiği için internetteki biri portlara ulaşamaz; zaten panel internete tünel ile yayınlanıyorsa (tünel rehberi) dış arayüzde açık porta ihtiyaç yoktur. Etkinleştirmeden önce SSH kuralının yazılı olduğundan emin olun; aksi halde kendinizi dışarıda bırakırsınız.
Docker ve UFW tuzağı
Docker kullanıyorsanız dikkat: Docker, yayınlanan portlar için kendi iptables kurallarını ekler ve bunlar çoğu durumda UFW kurallarını atlar. Yani "UFW ile reddettim" dediğiniz bir port, bir konteyner üzerinden dışarıya açık kalabilir. Çözümler: konteyner portlarını yalnızca 127.0.0.1:PORT:PORT biçiminde yayınlamak, ya da Docker'ın UFW ile uyumlu çalışması için ek kural düzenlemeleri yapmak. Güvenlik duvarını yalnızca "yapılandırdım" diye değil, dışarıdan bir tarama ile (başka bir cihazdan nmap) doğrulayın.
Kuralları doğrulamak
sudo ufw status numberedkuralları numarayla gösterir; silmek içinsudo ufw delete 3.- Başka bir cihazdan
nmap -p 22,80,443,8000 SUNUCU_ADRESIaçık portları gösterir; yalnızca izin verdiğiniz portlar açık görünmeli. sudo ss -ltnpsunucuda hangi servisin hangi adreste dinlediğini gösterir. Uygulamanın0.0.0.0yerine127.0.0.1'de dinlemesi ikinci bir güvencedir.- Günlük açıksa
sudo journalctl -k | grep UFWengellenen bağlantıları gösterir (journalctl rehberi).
UFW'yi SSH korumasıyla birlikte düşünün: engellenen girişimleri otomatik yasaklayan fail2ban rehberi güvenlik duvarını tamamlar.
Sık sorulan sorular
UFW ile fail2ban birlikte kullanılır mı? Evet. fail2ban, tekrarlayan başarısız denemeleri yapan adresleri UFW (ya da doğrudan iptables) kuralıyla engelleyebilir.
IPv6 için ayrı kural gerekir mi? /etc/default/ufw dosyasında IPV6=yes ise kurallar her iki protokole de uygulanır; bunun açık olduğundan emin olun.
Kural sırası önemli mi? Evet; eşleşen ilk kural uygulanır. Daha belirgin kuralları daha genel olanlardan önce yazın.
Kendimi kilitledim, ne yapmalıyım? Fiziksel erişim ya da konsolla sudo ufw disable yapıp kuralları düzeltin; bu yüzden uzak sunucuda değişiklikten önce ikinci bir oturumu açık tutmak önemlidir.
UFW tek başına yeterli mi? Değil; güncel yazılım, güçlü kimlik doğrulama ve en az yetkili servis ile birlikte bir katmandır.