macOS ve BSD Sistemlerde PF Firewall Rehberi

PF (Packet Filter), BSD tabanlı işletim sistemlerinde (özellikle OpenBSD ve FreeBSD) varsayılan olarak gelen, ancak esnekliği ve gücü nedeniyle macOS'tan çeşitli ağ cihazlarına kadar geniş bir alanda kullanılan oldukça yetenekli bir güvenlik duvarı sistemidir.


Bölüm 1: Giriş ve Temel Yapılandırma

  • Giriş: Apple'ın grafik arayüzündeki basit güvenlik duvarının ötesine geçiyoruz. PF (Packet Filter) ile ağ trafiğiniz üzerinde tam kontrol sağlama.

  • Temel Kavramlar: pf.conf dosyasının anatomisi, makrolar ve filtreleme mantığı.

  • İlk Adım: /etc/pf.conf dosyasını yedekleme ve inceleme.

  • Uygulama: "Her şeyi engelle, ihtiyacın olana izin ver" kuralı ile ilk güvenli yapılandırma.

  • Komut Paneli: pfctl -e, -d ve -f komutlarının kullanımı.


1. PF Nedir ve Neden Kullanılır?

PF, ağ trafiğini filtrelemek, NAT (Network Address Translation) yapmak ve bant genişliğini yönetmek için kullanılır. Modern güvenlik duvarları arasında kural dizilimi ve durum bilgisi (stateful inspection) yönetimi ile öne çıkar.

  • Okunabilirlik: Konfigürasyon dosyası oldukça temiz ve insan tarafından okunabilir bir sözdizimine sahiptir.

  • Performans: Çok yüksek trafik yükleri altında bile stabil çalışır.

  • Esneklik: Paketleri normalize etme (scrub) ve trafik önceliklendirme gibi gelişmiş özellikler sunar.


2. Temel Yapılandırma Dosyası (pf.conf)

PF ayarları genellikle /etc/pf.conf dosyasında tutulur. Bu dosyada kurallar belirli bir hiyerarşiye göre yazılmalıdır. Standart bir kural dizilimi şu şekildedir:

  1. Makrolar (Macros): Değişken tanımlamaları (Arayüzler, IP grupları).

  2. Tablolar (Tables): Büyük IP listelerini yönetmek için.

  3. Seçenekler (Options): PF'in genel çalışma parametreleri.

  4. Normalizasyon (Scrub): Paketlerin temizlenmesi.

  5. Kuyruklama (Queueing): Bant genişliği yönetimi.

  6. Çeviri (NAT/RDR): Port yönlendirme ve NAT.

  7. Filtreleme Kuralları (Filter Rules): Trafiğe izin verme veya engelleme.


3. Temel Sözdizimi ve Örnek Kurallar

PF'in en temel kural mantığı şöyledir:

action [direction] [log] [quick] [on interface] [af] [proto] [from src_addr] [to dst_addr] [port] [flags] [state]

Örnek Bir Başlangıç Konfigürasyonu

Bash:
# Makrolar
ext_if = "em0"
tcp_pass = "{ 22, 80, 443 }"

# Paketleri temizle (Fragmanları birleştir, geçersiz paketleri at)
scrub in all

# Varsayılan Politika: Her şeyi engelle
block all

# Loopback arayüzüne (localhost) izin ver
set skip on lo0

# Gelen web ve SSH trafiğine izin ver
pass in on $ext_if proto tcp from any to any port $tcp_pass

# Dışarı giden tüm trafiğe izin ver
pass out on $ext_if all keep state

4. Kritik Kavramlar

"Quick" Anahtar Kelimesi

PF normalde kuralları yukarıdan aşağıya tarar ve paketle eşleşen son kural neyse onu uygular. Ancak bir kuralda quick ifadesi varsa, o kural eşleştiği anda arama durur ve kural uygulanır.

Tablolar (Tables)

Özellikle spam veya saldırgan IP'leri engellemek için tablolar harikadır. RAM üzerinde tutuldukları için binlerce IP olsa bile performansı etkilemezler.

Bash:
table <bruteforce> persist
block in quick from <bruteforce>

Durum Bilgisi (Stateful Inspection)

PF varsayılan olarak keep state kullanır. Yani bir paketin içeri girmesine izin verirseniz, o bağlantıya ait geri dönüş trafiğine otomatik olarak izin verilir.


5. PF'i Yönetmek İçin Temel Komutlar

PF'i yönetmek için pfctl komutu kullanılır:

  • Etkinleştirme/Devre Dışı Bırakma:

    • pfctl -e (Enable)

    • pfctl -d (Disable)

  • Kuralları Kontrol Etme ve Yükleme:

    • pfctl -nf /etc/pf.conf (Hata kontrolü yap, yükleme yapmaz)

    • pfctl -f /etc/pf.conf (Dosyayı yükle ve kuralları uygula)

  • İzleme ve Görüntüleme:

    • pfctl -sr (Aktif filtre kurallarını göster)

    • pfctl -ss (Aktif bağlantı durumlarını göster)


Sonuç

PF, başlangıçta karmaşık görünse de mantığı kavrandığında dünyanın en güçlü firewall araçlarından biridir. Güvenli bir yapı için her zaman "her şeyi engelle, sadece ihtiyacın olana izin ver" prensibiyle başlamalısınız.


macOS üzerinde PF (Packet Filter), sistemin ağ güvenliğinin kalbinde yer alır. macOS aslında bir BSD türevi (Darwin) olduğu için PF, sistemin yerleşik güvenlik duvarı çözümüdür. Apple'ın grafiksel arayüzdeki "Güvenlik Duvarı" ayarları daha basit düzeydeyken, PF terminal üzerinden çok daha derinlemesine kontrol sağlar.

1. macOS'ta PF'in Yeri ve Durumu

macOS'ta ana yapılandırma dosyası /etc/pf.conf yolunda bulunur. Ancak Apple, sistem güncellemelerinde bu dosyanın üzerine yazabildiği için, özel kurallarınızı genellikle ayrı bir dosyada tutmanız veya bu dosyayı dikkatli düzenlemeniz önerilir.

  • Durum Kontrolü: macOS'ta PF varsayılan olarak kapalı gelebilir. Kontrol etmek için:

    sudo pfctl -s info


2. macOS'ta PF Yapılandırma Adımları

A. Mevcut Dosyayı İnceleme

Öncelikle sistemin varsayılan kurallarını görmek için dosyayı açın:

cat /etc/pf.conf

Genellikle macOS burada kendi "anchor" (çapa) noktalarını kullanır. Bu noktalar, sistemin veya diğer uygulamaların (örneğin uygulama güvenlik duvarı) dinamik olarak kural eklemesine izin verir.

B. Özel Kural Dosyası Oluşturma

Kendi kurallarınızı /etc/pf.anchors/com.user.firewall gibi bir dosyaya yazmak en temiz yöntemdir.

Örnek bir kural seti (sudo nano /etc/pf.anchors/com.user.firewall):

Bash:
# Değişkenler
wifi_if = "en0"

# Tüm trafiği engelle (Inbound)
block in on $wifi_if all

# Sadece SSH (22) ve HTTP (80) trafiğine izin ver
pass in on $wifi_if proto tcp from any to any port { 22, 80 }

# Giden tüm trafiğe izin ver (Keep state ile)
pass out on $wifi_if all keep state

C. Anchor Dosyasını Tanıtma

Ana /etc/pf.conf dosyasına gidip kendi anchor'ınızı eklemeniz gerekir:

Bash
anchor "com.user.firewall"
load anchor "com.user.firewall" from "/etc/pf.anchors/com.user.firewall"

3. macOS'ta PF'i Yönetmek (Terminal Komutları)

macOS'ta pfctl komutları şu şekildedir:

  • PF'i Başlatmak: sudo pfctl -E

  • PF'i Durdurmak: sudo pfctl -D

  • Kuralları Test Etmek (Hata Kontrolü): sudo pfctl -vnf /etc/pf.conf

  • Kuralları Yeniden Yüklemek: sudo pfctl -f /etc/pf.conf

  • Logları İzlemek: macOS'ta PF logları varsayılan olarak pflog0 arayüzüne gider. İzlemek için:

    sudo tcpdump -n -e -ttt -i pflog0


4. macOS Başlangıcında PF'i Otomatik Çalıştırma

macOS'ta PF, bilgisayar yeniden başladığında genellikle devre dışı kalır. Bunu kalıcı hale getirmek için bir LaunchDaemon kullanmanız gerekir.

  1. /Library/LaunchDaemons/com.apple.pfctl.plist dosyasının varlığını kontrol edin.

  2. Eğer yoksa veya pasifse, bu .plist dosyasını pfctl -e -f /etc/pf.conf komutunu çalıştıracak şekilde düzenleyip launchctl ile sisteme yüklemelisiniz.


5. Önemli İpucu: Apple'ın Sandbox Yapısı

macOS'ta PF kullanırken, sistemin kendi Application Layer Firewall (Sistem Ayarları'ndaki buton) ile çakışabileceğini unutmayın. PF daha alt seviyede (Network Layer) çalışırken, Apple'ın kendi firewall'u uygulama bazlı (Application Layer) çalışır. Güçlü bir güvenlik için ikisinin birlikte çalışmasında sakınca yoktur ancak kurallar birbirini ezmemelidir.


Bölüm 2: İleri Seviye Ağ Yönetimi (NAT ve Port Yönlendirme)

  • Senaryo: İnternet paylaşımı ve yerel ağdaki bir servisi dış dünyaya açma.

  • Sistem Hazırlığı: sysctl ile IP Forwarding (paket yönlendirme) özelliğini aktif etme.

  • NAT Yapılandırması: Yerel ağdaki cihazları internete çıkarma kuralları.

  • Port Yönlendirme (RDR): Dışarıdan gelen HTTP/SSH isteklerini iç IP’lere yönlendirme tekniği.

  • Test Aşaması: Kuralların doğruluğunu test etme ve aktif etme süreci.

PF'in en güçlü yanlarından biri olan NAT (Network Address Translation) ve Port Yönlendirme, macOS cihazınızı bir yönlendiriciye (router) veya bir güvenlik kapısına dönüştürmenize olanak tanır.



macOS'ta PF ile NAT ve Port Yönlendirme

macOS üzerinde NAT işlemi genellikle internet bağlantısını paylaşmak (Internet Sharing) veya yerel bir sanal makineye/sunucuya dışarıdan erişim sağlamak için kullanılır.

1. Sistem Hazırlığı: IP Forwarding

PF kurallarına geçmeden önce, macOS çekirdeğinin (kernel) paketleri bir arayüzden diğerine yönlendirmesine izin vermelisiniz.

  • Geçici olarak etkinleştirmek için:

    sudo sysctl -w net.inet.ip.forwarding=1

  • Kalıcı hale getirmek için:

    /etc/sysctl.conf dosyasını düzenleyin (yoksa oluşturun) ve şu satırı ekleyin:

    net.inet.ip.forwarding=1


2. NAT Yapılandırması (İnternet Paylaşımı)

Eğer Wi-Fi üzerinden aldığınız interneti Ethernet üzerinden bağlı bir cihaza dağıtmak istiyorsanız şu mantığı kullanırız:

Senaryo: en0 (Wi-Fi - İnternet), en1 (Ethernet - Yerel Ağ)

/etc/pf.anchors/com.user.nat dosyasını oluşturun:

Bash:
# Arayüz Tanımları
ext_if = "en0"
int_if = "en1"

# NAT Kuralı: İç ağdan gelen paketlerin IP'sini dış arayüzün IP'si ile değiştir
nat on $ext_if from $int_if:network to any -> ($ext_if)

# Trafiğe izin ver
pass out on $ext_if from $int_if:network to any keep state
pass in on $int_if from $int_if:network to any keep state

3. Port Yönlendirme (Port Forwarding / RDR)

Dış dünyadan gelen bir isteği, içerideki belirli bir IP ve porta yönlendirmek için rdr (redirect) kuralı kullanılır.

Senaryo: macOS bilgisayarınızın 8080 portuna gelen istekleri, içerideki bir web sunucusunun (192.168.1.50) 80 portuna yönlendirmek.

Aynı dosyaya (com.user.nat) şunu ekleyin:

Bash:
# Port Yönlendirme
rdr pass on $ext_if proto tcp from any to any port 8080 -> 192.168.1.50 port 80

4. Kuralları Aktif Etme

Yazdığınız bu kuralları sisteme tanıtmak için /etc/pf.conf dosyanıza şu satırları eklemeyi unutmayın:

Bash
nat-anchor "com.user.nat"
rdr-anchor "com.user.nat"
load anchor "com.user.nat" from "/etc/pf.anchors/com.user.nat"

Ardından kuralları yükleyin ve PF'i tetikleyin:

sudo pfctl -f /etc/pf.conf

sudo pfctl -e


5. Kritik İpucu: "No NAT" ve "Sticky Address"

  • No NAT: Bazı durumlarda (örneğin VPN ağları arasında) NAT yapılmasını istemeyebilirsiniz. Bu durumda kuralın başına no nat eklenir.

  • Sticky Address: Eğer yönlendirme yaptığınız cihazın oturum bilgilerini korumasını istiyorsanız, kuralın sonuna sticky-address ekleyerek istemcinin hep aynı dış IP üzerinden çıkmasını sağlayabilirsiniz.


Özet Komut Tablosu

AmaçKomut
NAT Durumusudo pfctl -s nat
Hata Ayıklamasudo pfctl -vv -nf /etc/pf.conf
Tüm Kuralları Temizlesudo pfctl -F all

Bölüm 3: Güvenlik ve Defans (Brute-Force Engelleme)

  • Tablo (Table) Gücü: Binlerce IP adresini performans kaybı yaşamadan yönetme.

  • Otomatik Koruma: SSH veya diğer servislere yapılan ardışık hatalı denemeleri (Brute-force) tespit etme.

  • Karantina Kuralları: Belirlenen limitleri aşan saldırganları otomatik olarak <bruteforce> tablosuna atma.

  • Manuel Müdahale: Tablodan IP silme, ekleme ve liste yönetimi.

  • İzleme (Logging): tcpdump kullanarak engellenen paketleri canlı izleme.



PF'in en güçlü özelliklerinden biri olan Tablolar (Tables), binlerce IP adresini bellekte (RAM) çok verimli bir şekilde tutmanızı sağlar. Bu sayede, sisteminize sürekli hatalı giriş denemesi yapan saldırganları otomatik olarak tespit edip karantinaya alabilirsiniz.


PF ile Brute-Force Saldırılarını Otomatik Engelleme

macOS terminalinize (SSH) veya bir servisinize sürekli deneme yanılma yoluyla girmeye çalışan botları durdurmak için şu adımları izleyebiliriz:

1. Tabloyu Tanımlama

Önce yasaklı IP'lerin tutulacağı bir havuz oluşturmamız gerekir. /etc/pf.anchors/com.user.security dosyasını oluşturun:

Bash:
# Brute-force saldırganları için bir tablo tanımla
table <bruteforce> persist

# Bu tablodaki tüm IP'lerin erişimini anında kes
block in quick from <bruteforce>

2. Akıllı Kural: SSH Koruması

SSH (Port 22) gibi kritik bir servisi korumak için "state" (durum) takibini limitlerle birleştireceğiz:

Bash:
# 30 saniye içinde 5'ten fazla yeni bağlantı kurmaya çalışan IP'yi <bruteforce> tablosuna ekle
pass in on en0 proto tcp from any to any port 22 \
    flags S/SA keep state \
    (max-src-conn 10, max-src-conn-rate 5/30, \
    overload <bruteforce> flush global)
  • max-src-conn 10: Aynı IP'den aynı anda en fazla 10 bağlantı olabilir.

  • max-src-conn-rate 5/30: 30 saniye içinde en fazla 5 yeni bağlantı denemesi yapılabilir.

  • overload <bruteforce>: Bu sınırı aşan IP adresini otomatik olarak <bruteforce> tablosuna atar.

  • flush global: Saldırganın mevcut tüm bağlantılarını anında koparır.


3. Tabloları Manuel Yönetmek

Bazen belirli bir IP'yi kendiniz engellemek veya yanlışlıkla engellenen bir IP'yi (örneğin kendinizi) kurtarmak isteyebilirsiniz. Bunun için pfctl -t komutunu kullanırız:

  • Tablo İçeriğini Görme:

    sudo pfctl -t bruteforce -T show

  • Tabloya IP Ekleme:

    sudo pfctl -t bruteforce -T add 192.168.1.100

  • Tablodan IP Silme:

    sudo pfctl -t bruteforce -T delete 192.168.1.100

  • Tabloyu Tamamen Temizleme:

    sudo pfctl -t bruteforce -T flush


4. IP Listelerini Dosyadan Yükleme (Kara Liste)

Eğer elinizde bilinen saldırganların büyük bir listesi varsa (örneğin bir metin dosyası), PF bu listeyi tek seferde okuyabilir:

Bash:
# pf.conf içinde
table <spammers> persist file "/etc/blocked_ips.txt"
block in quick from <spammers>

5. Loglama ve İzleme (tcpdump)

PF'in kimi engellediğini canlı olarak görmek, kural yazarken en büyük yardımcınızdır. macOS'ta PF logları için sanal bir arayüz kullanırız:

sudo tcpdump -n -e -ttt -i pflog0

  • -n: IP'leri isme çözmez (daha hızlıdır).

  • -e: Paket başlıklarını (engellenme nedenini) gösterir.

  • -i pflog0: PF log arayüzünü dinler.



Yorumlar

Bu blogdaki popüler yayınlar

Android Telefon/Tablet Ekranını Pardus ETAP 23 Yüklü Akıllı Tahtaya Yansıtma

Pardus Etap 23’de Unutulmuş Etap Yetkili Parolasını Sıfırlama

Pardus Etap 23 Yazıcı Kurulumu