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.