iptables ile Zaman Bazlı Kural Tanımlama

Ağ güvenliği söz konusu olduğunda çoğu sysadmin “hep açık veya hep kapalı” mantığıyla çalışır. Ama gerçek dünyada işler çok daha nüanslı. Muhasebe departmanı sadece mesai saatlerinde sunucuya erişmeli, yedekleme scripti gece yarısı çalışmalı, SSH erişimi hafta sonları tamamen kapalı olmalı gibi gereksinimler sık sık karşınıza çıkar. İşte tam burada iptables’ın zamanlama yetenekleri devreye giriyor. time modülü sayesinde kurallarınızı saat, gün ve tarih bazında kısıtlayabilirsiniz. Bu yazıda bu mekanizmayı derinlemesine ele alacağız.

iptables time Modülü Nedir?

iptables, match extension’lar aracılığıyla genişletilebilir bir yapıya sahiptir. time modülü de bu extension’lardan biridir ve xt_time kernel modülü tarafından sağlanır. Kuralı değerlendirirken paketin geldiği zamana bakarak eşleşme sağlar ya da sağlamaz.

Temel çalışma mantığı şöyle: Bir paket geldiğinde iptables, zincirdeki kuralları sırayla kontrol eder. Eğer bir kuralda --match time kullanılmışsa, o anda sistem saatinin belirtilen zaman aralığına denk gelip gelmediğine bakılır. Eşleşirse kural uygulanır, eşleşmezse atlanır.

Öncelikle modülün yüklü olduğunu doğrulayalım:

# Modül yüklü mü kontrol et
lsmod | grep xt_time

# Yüklü değilse manuel yükle
modprobe xt_time

# Kalıcı hale getirmek için
echo "xt_time" >> /etc/modules-load.d/iptables.conf

Modül yoksa iptables komutlarınız --match time seçeneğini tanımayacak ve hata verecektir. Çoğu modern sistemde bu modül zaten yüklü gelir ama kontrol etmek iyi bir alışkanlıktır.

Temel Söz Dizimi ve Parametreler

-m time ile modülü aktif ettikten sonra kullanabileceğiniz parametreler şunlardır:

  • –timestart HH:MM[:SS]: Zaman aralığının başlangıç saati
  • –timestop HH:MM[:SS]: Zaman aralığının bitiş saati
  • –weekdays gün[,gün]: Hangi hafta günlerinde uygulanacağı (Mon, Tue, Wed, Thu, Fri, Sat, Sun veya 1-7)
  • –monthdays gün[,gün]: Ayın hangi günlerinde uygulanacağı (1-31)
  • –datestart YYYY[-MM[-DD[THH[:MM[:SS]]]]]: Tarih aralığı başlangıcı
  • –datestop YYYY[-MM[-DD[THH[:MM[:SS]]]]]: Tarih aralığı bitişi
  • –utc: Zaman karşılaştırmasını UTC cinsinden yap
  • –localtz: Yerel zaman dilimini kullan (varsayılan davranış)
  • –kerneltz: Kernel’in saat dilimini kullan

Önemli bir not: --timestart ve --timestop aynı gün içinde çalışır. Gece yarısını geçen aralıklar (örn. 22:00-06:00) beklendiği gibi çalışmaz, bu konuya ilerleyen bölümlerde döneceğiz.

İlk Pratik Örnek: Mesai Saati Kısıtlaması

Diyelim ki bir web yönetim paneline sadece mesai saatlerinde erişilmesini istiyorsunuz. Saat 08:00-18:00 arası, Pazartesi’den Cuma’ya:

# Önce mevcut kuralları görelim
iptables -L INPUT -n --line-numbers

# Yönetim paneli (8080 portu) için mesai saati kısıtlaması
iptables -A INPUT -p tcp --dport 8080 
  -m time --timestart 08:00 --timestop 18:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  -j ACCEPT

# Mesai saati dışında reddet
iptables -A INPUT -p tcp --dport 8080 -j DROP

Burada dikkat edilmesi gereken şey kural sırası. İlk kural mesai saatlerinde eşleşiyor ve ACCEPT ediyor. İkinci kural ise mesai dışında gelen tüm bağlantıları düşürüyor. iptables kuralları sıralı işlediği için bu mantık doğru çalışır.

SSH Erişimini Hafta İçiyle Sınırlandırma

Birçok organizasyonda hafta sonu SSH erişimi gereksizdir ve saldırı yüzeyini artırır. Şöyle bir senaryo kuralım:

# Hafta içi SSH'a izin ver (kaynak IP kısıtlamasıyla birlikte)
iptables -A INPUT -p tcp --dport 22 
  -s 192.168.1.0/24 
  -m time --timestart 07:00 --timestop 20:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  -j ACCEPT

# Hafta sonu ve mesai dışı için DROP
iptables -A INPUT -p tcp --dport 22 -j DROP

# Mevcut kurulumu doğrula
iptables -L INPUT -v -n

Bu yapı aynı zamanda IP kısıtlamasını da içeriyor. Zaman ve IP bazlı kontrol birleşince oldukça güçlü bir kural seti ortaya çıkıyor.

Gece Yarısını Geçen Aralıklar: Dikkat Edilmesi Gereken Kritik Nokta

iptables time modülünün en sık yanıltıcı davranışı, --timestart değeri --timestop değerinden büyük olduğunda ortaya çıkıyor. Örneğin gece vardiyası için 22:00-06:00 tanımlamak istediğinizde:

# BU ÇALIŞMAZ, beklediğiniz gibi davranmaz!
iptables -A INPUT -p tcp --dport 3306 
  -m time --timestart 22:00 --timestop 06:00 
  -j DROP

Yukarıdaki kural aslında 22:00 ile 06:00 arasında eşleşmez, aksine 06:00 ile 22:00 arasında eşleşir. Yani tam tersi çalışır. Bunun nedeni modülün aralığı matematiksel olarak değerlendirmesi: eğer başlangıç bitiş zamanından büyükse kural hiçbir zaman eşleşmez diye bir mantık yoktur, bunun yerine beklenmedik sonuçlar üretir.

Doğru yaklaşım iki ayrı kural yazmaktır:

# Gece yarısını geçen aralık için DOĞRU yöntem
# 22:00'den gece yarısına kadar
iptables -A INPUT -p tcp --dport 3306 
  -m time --timestart 22:00 --timestop 23:59 
  -j DROP

# Gece yarısından 06:00'a kadar
iptables -A INPUT -p tcp --dport 3306 
  -m time --timestart 00:00 --timestop 06:00 
  -j DROP

Bu yaklaşım biraz verbose görünse de en güvenli yöntemdir.

Yedekleme Penceresi Tanımlama

Yedekleme işlemleri genellikle ağa yük bindirir. Yedekleme sunucusuna sadece belirlenen saatler arasında bağlantı izni vermek sistemi korur:

#!/bin/bash
# Yedekleme güvenlik duvarı kuralları
# /etc/iptables/backup-rules.sh

BACKUP_SERVER="10.0.0.50"
BACKUP_PORT="873"  # rsync default port

# Gece 01:00 - 05:00 arası yedekleme sunucusundan rsync'e izin ver
iptables -A INPUT -p tcp 
  -s $BACKUP_SERVER 
  --dport $BACKUP_PORT 
  -m time --timestart 01:00 --timestop 05:00 
  --weekdays Mon,Tue,Wed,Thu,Fri,Sat,Sun 
  -j ACCEPT

# Yedekleme sunucusundan gelen SSH'a da aynı pencerede izin ver
iptables -A INPUT -p tcp 
  -s $BACKUP_SERVER 
  --dport 22 
  -m time --timestart 01:00 --timestop 05:00 
  -j ACCEPT

# Yedekleme sunucusunun diğer zamanlardaki bağlantılarını düşür
iptables -A INPUT -s $BACKUP_SERVER -p tcp --dport $BACKUP_PORT -j DROP

echo "Yedekleme kuralları uygulandı."
iptables -L INPUT -n | grep $BACKUP_SERVER

Tarih Bazlı Kurallar: –datestart ve –datestop

Zaman dilimlerinin ötesinde belirli tarih aralıkları için de kural tanımlayabilirsiniz. Bu özellik özellikle bakım pencereleri veya geçici erişim izinleri için çok kullanışlıdır:

# Yıllık bakım periyodunda (2 Ocak - 5 Ocak) harici erişimi kısıtla
iptables -A INPUT -p tcp --dport 443 
  ! -s 10.0.0.0/8 
  -m time 
  --datestart 2024-01-02T00:00:00 
  --datestop 2024-01-05T23:59:59 
  -j DROP

# Bunu tersine çevirerek: belirli tarihler arasında geçici erişim aç
iptables -A INPUT -p tcp --dport 8443 
  -s 203.0.113.25 
  -m time 
  --datestart 2024-06-01T09:00:00 
  --datestop 2024-06-30T17:00:00 
  -j ACCEPT

İkinci örnek gerçek dünyada çok yaygın: bir danışmana proje süresi boyunca erişim vermek. Proje bitince kuralı silmek yerine tarih bazlı tanımladığınızda otomatik olarak devre dışı kalır.

Ayın Belirli Günleri: –monthdays Kullanımı

Bazı finans sistemlerinde ay sonlarında özel bakım pencereleri gerekebilir:

# Ayın 28, 29, 30 ve 31. günlerinde (ay sonu) bakım erişimi
iptables -A INPUT -p tcp --dport 5432 
  -s 192.168.100.0/24 
  -m time 
  --monthdays 28,29,30,31 
  --timestart 02:00 
  --timestop 06:00 
  -j ACCEPT

# Bu saatler dışında sadece normal ofis ağından erişim
iptables -A INPUT -p tcp --dport 5432 
  -s 192.168.1.0/24 
  -m time --timestart 08:00 --timestop 18:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  -j ACCEPT

# Diğer tüm bağlantıları reddet
iptables -A INPUT -p tcp --dport 5432 -j DROP

Zaman Dilimi Sorunları ve UTC Kullanımı

Bu konuda çok sayıda sysadmin’in başı yanmıştır. Sistem saat dilimini değiştirdiğinizde veya yaz/kış saati geçişlerinde zaman bazlı kurallarınız yanlış çalışmaya başlayabilir.

En güvenli yaklaşım kuralları UTC cinsinden yazmaktır:

# Türkiye UTC+3, yaz saatinde UTC+3 (Türkiye 2016'da kalıcı yaz saatine geçti)
# Mesai saati 09:00-18:00 TRT = 06:00-15:00 UTC

iptables -A INPUT -p tcp --dport 8080 
  -m time 
  --timestart 06:00 
  --timestop 15:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  --utc 
  -j ACCEPT

iptables -A INPUT -p tcp --dport 8080 -j DROP

--utc bayrağını kullanmak, saat dilimi değişikliklerinden etkilenmemenizi sağlar. Sunucularınız farklı ülkelerdeyse ya da NTP sync sorunu yaşadıysanız UTC bazlı kurallar çok daha tutarlı davranır.

Mevcut sistem saatini ve UTC farkını kontrol etmek için:

# Sistem saati ve saat dilimi bilgisi
timedatectl status

# iptables tarafından görülen zaman
date
date -u  # UTC cinsinden

# Kernel zamanı (iptables'ın kullandığı)
hwclock --show

Zaman Bazlı Kuralları Kalıcı Hale Getirme

iptables kuralları varsayılan olarak reboot sonrasında kaybolur. Birkaç yöntemle kalıcı hale getirebilirsiniz:

# Mevcut kuralları kaydet (Debian/Ubuntu)
iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

# iptables-persistent paketi ile otomatik yükleme
apt-get install iptables-persistent

# Kuralları manuel olarak yeniden yükle
iptables-restore < /etc/iptables/rules.v4

CentOS/RHEL sistemlerde:

# Kuralları kaydet
service iptables save

# Ya da direkt dosyaya yaz
iptables-save > /etc/sysconfig/iptables

# Servis yeniden başlatıldığında otomatik yükle
systemctl enable iptables
systemctl start iptables

Bir script ile tüm zaman bazlı kuralları yönetmek daha pratik olabilir:

#!/bin/bash
# /usr/local/sbin/apply-timed-rules.sh
# Bu script system startup'ta çalıştırılır

set -e

LOG="/var/log/iptables-timed.log"
echo "[$(date)] Zaman bazlı kurallar uygulanıyor..." >> $LOG

# Mevcut zaman bazlı kuralları temizle (time modülü kullananlar)
iptables -L INPUT --line-numbers -n | grep "time" | awk '{print $1}' | sort -rn | xargs -I{} iptables -D INPUT {} 2>/dev/null || true

# SSH kısıtlaması - hafta içi 07:00-21:00
iptables -A INPUT -p tcp --dport 22 
  -m time --timestart 07:00 --timestop 21:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  --utc 
  -j ACCEPT

# Yedekleme penceresi
iptables -A INPUT -p tcp -s 10.0.0.50 --dport 873 
  -m time --timestart 22:00 --timestop 23:59 
  --utc 
  -j ACCEPT

iptables -A INPUT -p tcp -s 10.0.0.50 --dport 873 
  -m time --timestart 00:00 --timestop 04:00 
  --utc 
  -j ACCEPT

echo "[$(date)] Kurallar başarıyla uygulandı." >> $LOG

Kuralları Test Etme ve Debug

Zaman bazlı kurallar doğası gereği test edilmesi zor kurallardır. Şu anki saatte ne olduğunu anlamak için çeşitli yöntemler vardır:

# Mevcut kuralları sayaçlarla görüntüle
iptables -L INPUT -v -n

# Belirli bir portun nasıl işlendiğini izle
watch -n 2 'iptables -L INPUT -v -n | grep -E "8080|22|873"'

# Kural sayaçlarını sıfırla ve test et
iptables -Z INPUT

# Paket loglamak için LOG hedefi kullan
iptables -I INPUT -p tcp --dport 8080 
  -m time --timestart 08:00 --timestop 18:00 
  -j LOG --log-prefix "[TIME-MATCH] "

# Logları takip et
tail -f /var/log/kern.log | grep "TIME-MATCH"

Sistemin saatini geçici olarak değiştirerek test yapmak cazip görünse de bu tehlikeli olabilir. Bunun yerine tcpdump ile bağlantıyı izlemek ve kural sayaçlarını gözlemlemek daha güvenlidir.

Gerçek Dünya Senaryosu: Çok Katmanlı Zaman Politikası

Bir şirketin ağ güvenlik politikasını tamamen uygulayan örnek bir kural seti:

#!/bin/bash
# Şirket güvenlik duvarı - zaman bazlı politikalar
# /usr/local/sbin/company-firewall.sh

INTERNAL_NET="192.168.0.0/16"
MGMT_NET="10.10.0.0/24"
DB_SERVER="10.10.0.100"
BACKUP_SERVER="10.10.0.200"

echo "Önceki zaman bazlı kurallar temizleniyor..."
iptables -F INPUT

# Loopback her zaman açık
iptables -A INPUT -i lo -j ACCEPT

# Mevcut bağlantılara izin ver
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

# ICMP sınırlı erişim
iptables -A INPUT -p icmp --icmp-type echo-request 
  -m limit --limit 10/min -j ACCEPT

# SSH: Yönetim ağından hafta içi mesai + 1 saat
iptables -A INPUT -p tcp --dport 22 
  -s $MGMT_NET 
  -m time --timestart 07:00 --timestop 19:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  --utc 
  -j ACCEPT

# Veritabanı: Sadece iç ağdan, mesai saatleri
iptables -A INPUT -p tcp --dport 5432 
  -s $INTERNAL_NET 
  -m time --timestart 06:00 --timestop 15:00 
  --weekdays Mon,Tue,Wed,Thu,Fri 
  --utc 
  -j ACCEPT

# Yedekleme sunucusu: Her gün gece
iptables -A INPUT -p tcp 
  -s $BACKUP_SERVER 
  --dport 873 
  -m time --timestart 21:00 --timestop 23:59 
  --utc 
  -j ACCEPT

iptables -A INPUT -p tcp 
  -s $BACKUP_SERVER 
  --dport 873 
  -m time --timestart 00:00 --timestop 05:00 
  --utc 
  -j ACCEPT

# Web servisleri her zaman açık
iptables -A INPUT -p tcp -m multiport --dports 80,443 -j ACCEPT

# Diğer her şeyi logla ve düşür
iptables -A INPUT -j LOG --log-prefix "[FIREWALL-DROP] " --log-level 4
iptables -A INPUT -j DROP

echo "Politika uygulandı."
iptables -L INPUT -v -n --line-numbers

Olası Sorunlar ve Çözümleri

Pratikte karşılaşılan yaygın sorunlar şöyle sıralanabilir:

  • NTP senkronizasyon sorunu: Sunucu saati yanlışsa kurallar da yanlış saatlerde devreye girer. chronyc tracking veya ntpq -p ile senkronizasyonu kontrol edin.
  • Modül yüklü değil hatası: iptables: No chain/target/match by that name hatası genellikle xt_time modülünün yüklü olmadığını gösterir. modprobe xt_time ile çözülür.
  • Kural sırası karışıklığı: iptables -L INPUT --line-numbers ile kural sırasını gözden geçirin. Zaman bazlı kurallar genel DROP kurallarından önce gelmeli.
  • Yaz/kış saati geçişi: --utc kullanmıyorsanız saat geçişlerinde bir saatlik sapma yaşanabilir. Türkiye artık yaz saatini kalıcı kullandığı için bu daha az sorun çıkarıyor ama çok uluslu ortamlarda dikkatli olun.
  • –timestart ve –timestop aynı değer: Bazı kernel versiyonlarında bu uç durum beklenmedik davranışlar üretebilir. 00:00-23:59 şeklinde tam gün tanımlayın.

Sonuç

iptables time modülü, statik firewall kurallarının ötesinde dinamik ve akıllı güvenlik politikaları oluşturmanıza olanak tanır. Mesai saati kısıtlamalarından yedekleme pencerelerine, geçici danışman erişimlerinden ay sonu bakım prosedürlerine kadar pek çok gerçek dünya senaryosunda bu mekanizma hayat kurtarır.

Yazıda ele aldığımız noktalara bakacak olursak: temel söz dizimini ve parametreleri öğrendik, gece yarısını geçen aralıklar gibi tuzaklara dikkat çektik, UTC kullanımının neden önemli olduğunu gördük ve kalıcılık ile test süreçlerini inceledik.

Pratikte en önemli tavsiyem şu: Zaman bazlı kuralları her zaman bir betik üzerinden yönetin, tek tek elle girmeyin. Hem tekrarlanabilirlik hem de hata ayıklama açısından büyük fark yaratır. Kuralları script’e döktüğünüzde hem dokümantasyon hem de otomasyon kazanmış olursunuz.

Son olarak, bu kuralları production’a almadan önce test ortamında mutlaka deneyin ve LOG hedefiyle birkaç dakika izleyin. Zaman bazlı kurallar sessiz sedasız çalıştığı için yanlış yapılandırma uzun süre fark edilmeyebilir.

Yorum yapın