Rehber

ufw kurulumu Linux'ta: sunucu güvenlik duvarı ve nftables temelleri

Güncellendi: · Skillaria.Top

ufw kurulumu üç adımdan oluşur: varsayılan politikaları belirlemek (sudo ufw default deny incoming ve allow outgoing), SSH ve gerekli portlara izin vermek (sudo ufw allow 22/tcp, sudo ufw allow 443/tcp) ve güvenlik duvarını sudo ufw enable ile açmak. Kurallar sudo ufw status numbered ile kontrol edilir; arka planda ufw, netfilter'ı iptables veya nftables üzerinden yönetir.

Linux'ta güvenlik duvarı, sunucuya hangi ağ paketlerinin geçeceğine, hangilerinin atılacağına karar verir. Asıl işi çekirdekteki netfilter alt sistemi yapar; onu yöneten araçlar ise düşük seviyeli iptables ve nftables ile bunların üzerine kurulu ufw (Uncomplicated Firewall) araçlarıdır. Ubuntu ve Debian'daki çoğu sunucuda ufw kurulumu beş dakika sürer: gelen her şeyi kapatın, SSH'i ve servis portlarını açın, etkinleştirin. Aşağıda adım adım senaryo, tipik hatalar ve perde arkasını anlamak için nftables'ın temel bilgileri var.

Linux'ta güvenlik duvarı nasıl çalışır

Paket filtreleme çekirdekte yapılır — bu netfilter'dır. Netfilter, kancalar (hooks) sağlar: sunucuya gelen trafik, sunucudan çıkan trafik ve yönlendirilen (forward) trafik. Kullanıcı araçları bu kancalar için çekirdeğe yalnızca kural yazar.

AraçSeviyeNe zaman kullanılır
ufwbasit sözdizimli üst katmanUbuntu/Debian'da tek sunucu, tipik kurallar
firewalldbölgeli (zone) üst katmanRHEL, Rocky, Fedora
nftables (nft)düşük seviye, modernkarmaşık kurallar, NAT, adres kümeleri
iptablesdüşük seviye, eskiyeneski sistemler ve betikler

Önemli: tek bir yönetim aracı kullanın. Kuralları aynı anda hem ufw ile hem de elle iptables ile değiştirirseniz birbirlerinin kurallarını ezer ve sonuç öngörülemez olur.

ufw kurulumu ve kontrolü

Ubuntu'da ufw genellikle zaten kuruludur ama kapalıdır. Debian'da ayrıca kurulur:

$ sudo apt update
$ sudo apt install ufw
$ sudo ufw status
Status: inactive

inactive durumu, ufw kurallarının uygulanmadığı anlamına gelir. Güvenlik duvarını henüz açmayın: önce SSH'e izin verin, yoksa uzak sunucuda kendi erişiminizi kesersiniz.

ufw ile sunucuda adım adım yapılandırma

Adım 1. Varsayılan politikalar

Varsayılan politika, hiçbir kural eşleşmediğinde paketle ne yapılacağını belirler. Sunucu için güvenli düzen: gelen trafik yasak, giden trafik serbest.

$ sudo ufw default deny incoming
Default incoming policy changed to 'deny'
$ sudo ufw default allow outgoing
Default outgoing policy changed to 'allow'

Kendi giden bağlantılarınızın yanıtları otomatik geçer: ufw bağlantı durumunu izler (connection tracking), bu yüzden yanıtlar için port açmanız gerekmez.

Adım 2. SSH'e izin verin

$ sudo ufw allow OpenSSH
Rules updated
Rules updated (v6)

OpenSSH bir uygulama profilidir. SSH standart olmayan bir portta dinliyorsa, açıkça izin verin: sudo ufw allow 2222/tcp. sshd'nin gerçekte hangi portu dinlediğini sudo ss -tlnp | grep sshd ile görebilirsiniz.

Adım 3. Servis portlarını açın

$ sudo ufw allow 80/tcp
$ sudo ufw allow 443/tcp

Protokolü belirtin: /tcp olmadan ufw portu hem TCP hem UDP için açar, gereksiz bir açık kapı oluşur.

Adım 4. Güvenlik duvarını etkinleştirin

$ sudo ufw enable
Command may disrupt existing ssh connections. Proceed with operation (y|n)? y
Firewall is active and enabled on system startup

ufw hemen başlar ve her açılışta otomatik çalışır. Mevcut SSH oturumunuzu kapatmayın: ikinci bir oturum açıp bağlantının çalıştığını doğrulayın.

Adım 5. Kuralları kontrol edin

$ sudo ufw status verbose
Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)
New profiles: skip

To                         Action      From
--                         ------      ----
22/tcp (OpenSSH)           ALLOW IN    Anywhere
80/tcp                     ALLOW IN    Anywhere
443/tcp                    ALLOW IN    Anywhere
22/tcp (OpenSSH (v6))      ALLOW IN    Anywhere (v6)
80/tcp (v6)                ALLOW IN    Anywhere (v6)
443/tcp (v6)               ALLOW IN    Anywhere (v6)

IPv6 kurallarını ufw kendisi oluşturur; /etc/default/ufw dosyasında IPV6=yes olduğunda (varsayılan değer budur).

ufw'de port açma: tüm sözdizimi seçenekleri

ufw allow komutu kısa ve uzun biçimi anlar. Kısa biçim tipik durumlar için uygundur; uzun biçim ise kaynak, arayüz veya hedef adresi belirtmeniz gerektiğinde kullanılır.

GörevKomut
TCP portusudo ufw allow 443/tcp
UDP portusudo ufw allow 51820/udp
Port aralığısudo ufw allow 6000:6007/tcp
Servis adıylasudo ufw allow https
Tek bir IP'densudo ufw allow from 203.0.113.10
Bir alt ağdan belirli portasudo ufw allow from 10.0.0.0/24 to any port 5432 proto tcp
Belirli arayüz üzerindensudo ufw allow in on eth1 to any port 3306 proto tcp
Yasaklasudo ufw deny 23/tcp
Yanıt vererek reddetsudo ufw reject 25/tcp

deny ile reject arasındaki fark: deny paketi sessizce atar ve istemci zaman aşımına uğrayana kadar bekler; reject ise portun kapalı olduğunu bildiren bir yanıt gönderir. Dış dünya için genellikle deny seçilir, iç ağlarda reject daha uygundur çünkü istemciler hatayı hemen görür.

Veritabanına yalnızca tek sunucudan erişim

Sık görülen bir durum: PostgreSQL veya MySQL internetten görünmemeli, ama yan sunucudaki uygulama bağlanabilmelidir.

$ sudo ufw allow from 10.0.0.5 to any port 5432 proto tcp
Rule added

Port 5432, deny incoming politikası sayesinde diğer tüm kaynaklar için kapalı kalır. Ayrıca veritabanı servisinin yalnızca iç adresi dinlemesini ayarlamak iyi olur: güvenlik duvarı ve servis ayarları birbirini tamamlar.

Uygulama profilleri

Paketler, port tanımlarını /etc/ufw/applications.d/ dizinine koyabilir. Profil listesi ve içeriği:

$ sudo ufw app list
Available applications:
  Nginx Full
  Nginx HTTP
  Nginx HTTPS
  OpenSSH
$ sudo ufw app info "Nginx Full"
Profile: Nginx Full
Title: Web Server (Nginx, HTTP + HTTPS)
Description: Small, but very powerful and efficient web server

Ports:
  80,443/tcp

Profile izin vermek: sudo ufw allow "Nginx Full". Boşluk içeren adları tırnak içine alın. Kendi profilinizi aynı dizinde INI biçiminde tanımlayıp sudo ufw app update ad ile uygulayabilirsiniz.

ufw kuralı nasıl silinir

En güvenilir yol numarayla silmektir:

$ sudo ufw status numbered
Status: active

     To                         Action      From
     --                         ------      ----
[ 1] OpenSSH                    ALLOW IN    Anywhere
[ 2] 80/tcp                     ALLOW IN    Anywhere
[ 3] 443/tcp                    ALLOW IN    Anywhere
[ 4] OpenSSH (v6)               ALLOW IN    Anywhere (v6)
[ 5] 80/tcp (v6)                ALLOW IN    Anywhere (v6)
[ 6] 443/tcp (v6)               ALLOW IN    Anywhere (v6)

$ sudo ufw delete 2
Deleting:
 allow 80/tcp
Proceed with operation (y|n)? y
Rule deleted

Bir kural silindikten sonra numaralar kayar, bu yüzden bir sonraki silmeden önce status numbered komutunu yeniden çalıştırın. İkinci yol, kuralı delete kelimesiyle tekrar yazmaktır: sudo ufw delete allow 80/tcp; bu, IPv4 ve IPv6 kuralını birlikte siler.

Kuralların sırası ve başa ekleme

ufw kuralları yukarıdan aşağıya kontrol eder ve ilk eşleşen uygulanır. Bu yüzden belirli bir adres için yasak, genel izinden üstte olmalıdır:

$ sudo ufw insert 1 deny from 198.51.100.23
Rule inserted

Yasağı normal komutla eklerseniz, allow 443/tcp kuralından sonra listenin sonuna düşer ve o port için çalışmaz.

SSH'i kaba kuvvetten koruma: ufw limit

limit kuralı bağlantıya izin verir, ama 30 saniye içinde 6 veya daha fazla bağlantı açan adresi engeller:

$ sudo ufw limit OpenSSH
Rule updated

Bu, toplu parola denemelerine karşı basit bir korumadır. Ciddi koruma için yalnızca anahtarla girişi açın ve isterseniz fail2ban ekleyin — o da ufw üzerinden adres engelleyebilir.

ufw günlükleri

Günlük tutmayı sudo ufw logging on ile açarsınız; seviyeler low, medium, high, full'dur. Kayıtlar /var/log/ufw.log dosyasına (rsyslog üzerinden) ve çekirdek günlüğüne düşer:

$ sudo journalctl -k | grep 'UFW BLOCK' | tail -2
Oct 14 10:12:03 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=45.155.205.1 DST=192.0.2.10 PROTO=TCP SPT=51544 DPT=3389
Oct 14 10:12:09 web kernel: [UFW BLOCK] IN=eth0 OUT= SRC=89.248.165.7 DST=192.0.2.10 PROTO=TCP SPT=40312 DPT=23

SRC ve DPT alanları kimin hangi porta vurduğunu gösterir. Servis yanıt vermiyorsa ve günlükte o portun UFW BLOCK kaydı varsa, kural eklenmemiş demektir.

ufw ve Docker: portlar kurallara rağmen neden açık

Bu en bilinen tuzaktır. Docker, port yayımlarken (-p 8080:80) kendi NAT kurallarını ve DOCKER zincirini ekler; konteynere giden trafik forward üzerinden geçer ve ufw'nin gelen kurallarını atlar. Sonuçta ufw status 8080 portunu göstermez, ama dışarıdan erişilebilir olur.

Çözüm seçenekleri:

  • Portları yalnızca localhost'a yayımlayın: -p 127.0.0.1:8080:80, dışarıya ise ters vekil (nginx) üzerinden çıkın.
  • Kendi kurallarınızı DOCKER-USER zincirine ekleyin — Docker bu zinciri üzerine yazmaz.
  • Yardımcı konteynerlerin portlarını hiç yayımlamayın; Docker ağı üzerinden bağlayın.

Sıfırlama ve devre dışı bırakma

$ sudo ufw disable     # kapat, kurallar korunur
$ sudo ufw reset       # tüm kuralları sil ve kapat
$ sudo ufw reload      # yapılandırmayı yeniden oku

reset öncesinde ufw, kural dosyalarının kopyalarını tarih eki ile /etc/ufw/ altına kaydeder. Kurallar /etc/ufw/user.rules ve user6.rules dosyalarında tutulur — bunları elle düzenlemeyin, yalnızca komutlarla değiştirin.

nftables temelleri

nftables, Linux çekirdeğindeki iptables'ın modern karşılığıdır. Debian 10+ ve Ubuntu 20.10+ sürümlerinde iptables komutu varsayılan olarak iptables-nft uyumluluk katmanı üzerinden çalışır; bu yüzden ufw kuralları da nftables'a düşer. Çekirdeğe yüklü olan her şeyi görmek için:

$ sudo nft list ruleset

nftables yapısı: bir tablo (aile ip, ip6 veya ikisi için birden inet) netfilter kancalarına bağlı zincirler içerir, zincirler ise kuralları içerir. Sunucu için asgari güvenlik duvarı /etc/nftables.conf dosyasında şöyle olur:

#!/usr/sbin/nft -f
flush ruleset

table inet filter {
    chain input {
        type filter hook input priority 0; policy drop;
        ct state established,related accept
        ct state invalid drop
        iif "lo" accept
        ip protocol icmp accept
        meta l4proto ipv6-icmp accept
        tcp dport { 22, 80, 443 } accept
    }
    chain forward {
        type filter hook forward priority 0; policy drop;
    }
    chain output {
        type filter hook output priority 0; policy accept;
    }
}

Uygulayıp açılışta etkinleştirmek için:

$ sudo nft -c -f /etc/nftables.conf   # yalnızca sözdizimini kontrol et
$ sudo systemctl enable --now nftables

Kuralları anında da ekleyebilirsiniz, ama dosyaya yazılmazsa yeniden başlatmadan sonra kaybolurlar:

$ sudo nft add rule inet filter input tcp dport 5432 ip saddr 10.0.0.5 accept
$ sudo nft -a list chain inet filter input   # -a kuralların handle değerini gösterir
$ sudo nft delete rule inet filter input handle 9

nftables'ın asıl avantajı kümeler ({ 22, 80, 443 }) ve IPv4 ile IPv6'yı tek bir inet tablosunda birleştirmesidir. Kendi nftables.service'inizi ufw ile aynı anda çalıştırmayın: flush ruleset ufw kurallarını siler.

Tipik hatalar

  • SSH kuralı olmadan ufw'yi açmak — erişim kaybolur. Kurtarmak için sağlayıcının konsolu (VNC/seri) gerekir: sudo ufw allow OpenSSH veya sudo ufw disable.
  • Port açıldı ama servis erişilemiyor — servis dış adres yerine 127.0.0.1 dinliyordur. ss -tlnp ile kontrol edin.
  • Bir de bulut güvenlik duvarı var — birçok sağlayıcının güvenlik grupları vardır; portu orada da açmanız gerekir.
  • deny çalışmıyor — kural, izin veren kuraldan aşağıda duruyor; insert 1 kullanın.

Sonuç

Temel ufw kurulumu şunlardan oluşur: default deny incoming, SSH ve servis portlarına izin, ufw enable ve status numbered ile kontrol. Belirli erişim için from ve port içeren kurallar, SSH için limit kullanın; Docker kullanıyorsanız ufw'yi atlayabileceğini unutmayın. NAT veya karmaşık kural kümeleri gerektiğinde nftables'a geçin. Sunucunun güvenlik duvarıyla korunması kurstaki Linux uygulamalarında ele alınır.

Sık sorulan sorular

ufw, iptables'tan nasıl farklı?

ufw, basit sözdizimi olan bir üst katmandır ve kuralları kendisi iptables veya nftables için üretir. iptables ve nftables ise düşük seviyeli araçlardır; tam kontrol sağlar ama daha fazla bilgi gerektirir.

ufw kuralları yeniden başlatmadan sonra korunur mu?

Evet. sudo ufw enable çalıştırdıktan sonra güvenlik duvarı açılışta başlar ve kurallar /etc/ufw/user.rules ile user6.rules dosyalarında saklanır.

Giden bağlantılar için port açmak gerekir mi?

allow outgoing politikasında gerekmez. ufw, bağlantı durumunu izlediği için giden bağlantıların yanıtlarını otomatik geçirir.

ufw açıkken ping'e nasıl izin verilir?

ufw, gelen ICMP echo-request paketlerine varsayılan olarak izin verir; bu kural /etc/ufw/before.rules dosyasında tanımlıdır. Ping'i yasaklamak için bu dosyadaki kuralı ACCEPT yerine DROP yapın ve sudo ufw reload çalıştırın.

CentOS ve Rocky Linux'ta ufw var mı?

Bu dağıtımların yerleşik aracı firewalld ve firewall-cmd komutudur. ufw'yi EPEL'den kurabilirsiniz, ama firewalld ile birlikte kullanmamak daha iyidir.

Bu konuyu videoyla öğrenin

Bu konu “Linux: с нуля до уверенного администрирования” kursunda uygulamalı olarak ayrıntılı işleniyor.

Kursa git