Proxmox kurulumunu tamamladınız, sanal makineleriniz çalışıyor, konteynerleriniz ayağa kalktı. Peki ağ güvenliğini düşündünüz mü? Çoğu sysadmin, Proxmox güvenlik duvarını ya hiç yapılandırmıyor ya da sadece birkaç temel kural ekleyip geçiyor. Oysa Proxmox’un yerleşik güvenlik duvarı, hem host seviyesinde hem de her VM/CT için bağımsız kural tanımlamanıza olanak tanıyan oldukça güçlü bir araç. Bu yazıda, Proxmox Firewall’u sıfırdan yapılandırmayı, kural yönetimini ve gerçek dünya senaryolarını ele alacağız.
Proxmox Güvenlik Duvarı Mimarisi
Proxmox Firewall, arka planda iptables (ve daha yeni sistemlerde nftables) kullanır. Ancak bu kuralları doğrudan iptables ile yönetmek yerine Proxmox’un kendi kural sözdizimini kullanırsınız. Üç katmanlı bir yapı söz konusu:
- Datacenter Seviyesi: Tüm cluster’a uygulanan genel kurallar ve güvenlik grupları
- Node Seviyesi: Belirli bir fiziksel Proxmox sunucusuna ait kurallar
- VM/CT Seviyesi: Her sanal makine veya konteynerin kendi güvenlik duvarı kuralları
Bu katmanlı yapı, “önce datacenter kuralları, sonra node kuralları, sonra VM kuralları” şeklinde çalışmaz. Her katman birbirinden bağımsız değerlendiriliyor ve kurallar zincir mantığıyla işleniyor. Datacenter seviyesinde tanımladığınız bir güvenlik grubu, istediğiniz VM’e referans olarak eklenebiliyor.
Bir de IP Sets kavramı var. Belirli IP adreslerini veya subnet’leri gruplandırıp kurallarda isim olarak kullanabilirsiniz. Örneğin “management_ips” adında bir set oluşturup tüm yönetim erişim kurallarında bu seti kullanabilirsiniz. IP değiştiğinde sadece seti güncellemeniz yeterli.
Güvenlik Duvarını Etkinleştirme
Varsayılan olarak Proxmox Firewall kapalı gelir. Etkinleştirmek için önce datacenter seviyesinde, sonra ilgili node veya VM’de açmanız gerekiyor. Web arayüzünden Datacenter > Firewall > Options yolunu izleyebilirsiniz. Ama biz komut satırından da nasıl yapıldığına bakalım.
Firewall yapılandırma dosyaları şu dizinlerde bulunur:
- /etc/pve/firewall/cluster.fw: Datacenter genel kuralları
- /etc/pve/nodes//host.fw: Node seviyesi kurallar
- /etc/pve/firewall/.fw: VM veya CT bazlı kurallar
Bu dosyaları doğrudan düzenleyebilirsiniz ama dikkatli olun, sözdizimi hatası cluster’ı etkileyebilir.
# Datacenter firewall durumunu kontrol etmek
cat /etc/pve/firewall/cluster.fw
# Node firewall durumunu kontrol etmek
cat /etc/pve/nodes/pve/host.fw
# Belirli bir VM'in firewall dosyasını görüntülemek (örneğin VMID 100)
cat /etc/pve/firewall/100.fw
Cluster firewall dosyasını etkinleştirmek için:
# cluster.fw dosyasına OPTIONS bölümü ekleyin
cat >> /etc/pve/firewall/cluster.fw << 'EOF'
[OPTIONS]
enable: 1
EOF
Node seviyesinde firewall’ı açmak için de benzer şekilde host.fw dosyasını düzenlemeniz gerekiyor:
# Node firewall yapılandırması
cat > /etc/pve/nodes/pve/host.fw << 'EOF'
[OPTIONS]
enable: 1
nf_conntrack_max: 262144
nf_conntrack_tcp_timeout_established: 432000
[RULES]
# SSH erişimine izin ver
IN ACCEPT -p tcp --dport 22 -source 192.168.1.0/24 -log info
# Proxmox web arayüzü
IN ACCEPT -p tcp --dport 8006 -source 192.168.1.0/24 -log info
# Diğer tüm gelen trafiği reddet
IN DROP -log warning
EOF
IP Sets Oluşturma ve Yönetimi
IP Sets, kural yönetimini çok daha sürdürülebilir kılar. Özellikle birden fazla VM’de aynı kaynak IP’lere izin veriyorsanız, IP setleri size büyük kolaylık sağlar.
# cluster.fw dosyasına IP set tanımı ekleyin
cat >> /etc/pve/firewall/cluster.fw << 'EOF'
[IPSET management_hosts]
192.168.1.10 # Admin workstation
192.168.1.11 # Jump server
192.168.1.12 # Monitoring server
10.0.0.0/8 # Internal network
[IPSET web_servers]
10.10.1.0/24 # Web tier subnet
10.10.2.5 # Load balancer
EOF
IP setlerini kuralda kullanmak için “+” prefix’ini kullanıyorsunuz:
# IP set kullanan kural örneği
# IN ACCEPT -p tcp --dport 22 -source +management_hosts
Güvenlik Grupları
Güvenlik grupları, tekrar kullanılabilir kural setleri oluşturmanıza yarar. Bir web sunucusu için gereken tüm kuralları tek bir grupta tanımlayıp, her web sunucusu VM’ine bu grubu referans olarak ekleyebilirsiniz.
# cluster.fw dosyasına güvenlik grubu ekleyin
cat >> /etc/pve/firewall/cluster.fw << 'EOF'
[group web_server_rules]
IN ACCEPT -p tcp --dport 80 -log info
IN ACCEPT -p tcp --dport 443 -log info
IN ACCEPT -p tcp --dport 22 -source +management_hosts -log info
OUT ACCEPT -p tcp --dport 80
OUT ACCEPT -p tcp --dport 443
OUT ACCEPT -p tcp --dport 53 -proto udp
OUT ACCEPT -p udp --dport 53
[group database_server_rules]
IN ACCEPT -p tcp --dport 5432 -source +web_servers -log info
IN ACCEPT -p tcp --dport 22 -source +management_hosts -log info
IN DROP -log warning
EOF
VM Seviyesinde Firewall Kuralı Tanımlama
Her VM için ayrı .fw dosyası oluşturursunuz. Diyelim ki VMID 101 bir web sunucusu:
cat > /etc/pve/firewall/101.fw << 'EOF'
[OPTIONS]
enable: 1
dhcp: 1
macfilter: 1
ipfilter: 1
policy_in: DROP
policy_out: ACCEPT
[RULES]
# Güvenlik grubunu dahil et
GROUP web_server_rules -i net0
# ICMP'ye izin ver (monitoring için)
IN ACCEPT -p icmp -source +management_hosts
# HTTP/HTTPS - herkese açık
IN ACCEPT -p tcp --dport 80
IN ACCEPT -p tcp --dport 443
# SSH - sadece yönetim ağından
IN ACCEPT -p tcp --dport 22 -source +management_hosts -log info
# Outbound DNS
OUT ACCEPT -p udp --dport 53
OUT ACCEPT -p tcp --dport 53
# NTP
OUT ACCEPT -p udp --dport 123
# Outbound HTTP/HTTPS (paket güncellemeleri için)
OUT ACCEPT -p tcp --dport 80
OUT ACCEPT -p tcp --dport 443
EOF
Veritabanı sunucusu için VMID 102:
cat > /etc/pve/firewall/102.fw << 'EOF'
[OPTIONS]
enable: 1
dhcp: 0
macfilter: 1
ipfilter: 1
policy_in: DROP
policy_out: DROP
log_level_in: warning
log_level_out: warning
[RULES]
# PostgreSQL - sadece web tier'dan
IN ACCEPT -p tcp --dport 5432 -source +web_servers -log info
# Redis - sadece uygulama sunucularından
IN ACCEPT -p tcp --dport 6379 -source 10.10.1.0/24 -log info
# SSH - sadece yönetimden
IN ACCEPT -p tcp --dport 22 -source +management_hosts -log info
# ICMP monitoring
IN ACCEPT -p icmp -source +management_hosts
# Outbound DNS ve NTP
OUT ACCEPT -p udp --dport 53
OUT ACCEPT -p udp --dport 123
# Backup sunucusuna yedek
OUT ACCEPT -p tcp --dport 9104 -dest 10.0.0.50
EOF
Kural Doğrulama ve Test Etme
Kuralları yazdıktan sonra doğrulama yapmak kritik. Proxmox’un pvesh aracını kullanarak mevcut kuralları sorgulayabilirsiniz:
# Datacenter firewall kurallarını listele
pvesh get /cluster/firewall/rules
# Belirli bir VM'in firewall kurallarını listele
pvesh get /nodes/pve/qemu/101/firewall/rules
# IP setlerini görüntüle
pvesh get /cluster/firewall/ipset
# Güvenlik gruplarını listele
pvesh get /cluster/firewall/groups
Kuralların gerçekten uygulanıp uygulanmadığını iptables ile kontrol edin:
# Proxmox'un oluşturduğu iptables zincirlerini listele
iptables -L -n -v | grep -A 20 "PVEFW"
# Belirli bir VM'e ait zinciri görüntüle (VMID 101)
iptables -L PVEFW-101-IN -n -v
iptables -L PVEFW-101-OUT -n -v
# Firewall log'larını takip et
tail -f /var/log/kern.log | grep PVEFW
# veya journalctl ile
journalctl -f -k | grep PVEFW
Gerçek Dünya Senaryosu: Üç Katmanlı Web Uygulaması
Şimdi gerçekçi bir örnek üzerinden gidelim. Bir e-ticaret uygulaması kuracaksınız ve şu yapıyı planlıyorsunuz:
- VMID 200: HAProxy Load Balancer (internete açık)
- VMID 201-202: PHP-FPM uygulama sunucuları
- VMID 203: MySQL veritabanı
- VMID 204: Redis cache
- VMID 205: Elasticsearch
Önce bu yapı için IP setleri ve güvenlik grupları oluşturalım:
cat >> /etc/pve/firewall/cluster.fw << 'EOF'
[IPSET app_servers]
10.10.2.10 # app-01
10.10.2.11 # app-02
[IPSET cache_servers]
10.10.3.10 # redis-01
[IPSET search_servers]
10.10.4.10 # elasticsearch-01
[group lb_rules]
# HTTP/HTTPS - tüm internete açık
IN ACCEPT -p tcp --dport 80
IN ACCEPT -p tcp --dport 443
# Health check
IN ACCEPT -p tcp --dport 8080 -source +management_hosts
# Yönetim
IN ACCEPT -p tcp --dport 22 -source +management_hosts -log info
IN DROP -log warning
[group app_server_rules]
# Sadece load balancer'dan HTTP
IN ACCEPT -p tcp --dport 9000 -source 10.10.1.10
IN ACCEPT -p tcp --dport 22 -source +management_hosts -log info
IN ACCEPT -p icmp -source +management_hosts
IN DROP -log warning
[group cache_rules]
IN ACCEPT -p tcp --dport 6379 -source +app_servers -log info
IN ACCEPT -p tcp --dport 22 -source +management_hosts
IN DROP -log warning
EOF
Şimdi her VM için yapılandırma:
# Load Balancer (VMID 200)
cat > /etc/pve/firewall/200.fw << 'EOF'
[OPTIONS]
enable: 1
policy_in: DROP
policy_out: ACCEPT
[RULES]
GROUP lb_rules
EOF
# Uygulama Sunucusu (VMID 201 ve 202 için aynı)
cat > /etc/pve/firewall/201.fw << 'EOF'
[OPTIONS]
enable: 1
policy_in: DROP
policy_out: DROP
[RULES]
GROUP app_server_rules
# Veritabanına erişim
OUT ACCEPT -p tcp --dport 3306 -dest 10.10.3.20
# Redis'e erişim
OUT ACCEPT -p tcp --dport 6379 -dest 10.10.3.10
# Elasticsearch'e erişim
OUT ACCEPT -p tcp --dport 9200 -dest 10.10.4.10
# DNS ve NTP
OUT ACCEPT -p udp --dport 53
OUT ACCEPT -p udp --dport 123
# Paket güncellemeleri
OUT ACCEPT -p tcp --dport 80
OUT ACCEPT -p tcp --dport 443
EOF
Log Yönetimi ve İzleme
Firewall logları, güvenlik olaylarını tespit etmenin en önemli yollarından biri. Proxmox, log seviyelerini kural bazında ayarlamanıza izin veriyor:
- nolog: Log tutma
- debug: Tüm detaylar
- info: Bilgi seviyesi
- notice: Dikkat edilmesi gerekenler
- warning: Uyarı seviyesi
- err: Hata seviyesi
- crit: Kritik
- alert: Alarm
- emerg: Sistem kullanılamaz
Log’ları merkezi bir sisteme göndermek için rsyslog yapılandırması:
# /etc/rsyslog.d/proxmox-firewall.conf
cat > /etc/rsyslog.d/proxmox-firewall.conf << 'EOF'
# PVEFW loglarını ayrı dosyaya yaz
:msg, contains, "PVEFW" /var/log/pvefw.log
# Aynı zamanda uzak syslog sunucusuna gönder
:msg, contains, "PVEFW" @10.0.0.100:514
& stop
EOF
systemctl restart rsyslog
# Log rotasyonu için logrotate config
cat > /etc/logrotate.d/pvefw << 'EOF'
/var/log/pvefw.log {
daily
rotate 30
compress
delaycompress
missingok
notifempty
postrotate
/usr/bin/systemctl kill -s HUP rsyslog.service 2>/dev/null || true
endscript
}
EOF
Alias Kullanımı
Alias’lar, IP adreslerine ve port numaralarına anlamlı isimler vermenizi sağlar. Bu, kuralları okumayı ve yönetmeyi çok kolaylaştırır:
# cluster.fw dosyasına alias ekle
cat >> /etc/pve/firewall/cluster.fw << 'EOF'
[ALIASES]
# Sunucu aliasları
backup_server 10.0.0.50
monitoring_server 10.0.0.51
ntp_server 10.0.0.1
dns_server1 10.0.0.2
dns_server2 8.8.8.8
EOF
Artık kurallarınızda IP yerine alias adını kullanabilirsiniz:
# Alias kullanan kural örneği
# OUT ACCEPT -p udp --dport 123 -dest backup_server
# IN ACCEPT -p tcp -source monitoring_server
Otomatik Kural Yedekleme
Firewall kuralları /etc/pve altında tutulduğu için Proxmox’un kendi cluster filesystem’i (pmxcfs) tarafından yönetiliyor. Ama yine de ayrı bir yedekleme scripti işe yarar:
#!/bin/bash
# /usr/local/bin/backup-fw-rules.sh
BACKUP_DIR="/root/fw-backups"
DATE=$(date +%Y%m%d-%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/firewall-backup-${DATE}.tar.gz"
mkdir -p "${BACKUP_DIR}"
# Tüm firewall dosyalarını yedekle
tar -czf "${BACKUP_FILE}" /etc/pve/firewall/ /etc/pve/nodes/*/host.fw 2>/dev/null
# 30 günden eski yedekleri sil
find "${BACKUP_DIR}" -name "firewall-backup-*.tar.gz" -mtime +30 -delete
echo "Firewall yedekleme tamamlandı: ${BACKUP_FILE}"
# Yedek boyutunu kontrol et
BACKUP_SIZE=$(du -sh "${BACKUP_FILE}" | cut -f1)
echo "Yedek boyutu: ${BACKUP_SIZE}"
chmod +x /usr/local/bin/backup-fw-rules.sh
# Cron'a ekle - her gün gece yarısı
echo "0 0 * * * root /usr/local/bin/backup-fw-rules.sh >> /var/log/fw-backup.log 2>&1" > /etc/cron.d/fw-backup
Yaygın Sorunlar ve Çözümleri
Sorun 1: Firewall etkinleştirildikten sonra bağlantı kesilmesi
Bunu önlemek için önce kuralları test modunda uygulayın. Şu en yaygın hata: node firewall’ı etkinleştirip SSH kuralını eklemeyi unutmak. Her zaman önce kuralları hazırlayın, sonra etkinleştirin:
# Test için önce enable: 0 ile dosyayı oluşturun
# Kuralları gözden geçirin
# Sonra enable: 1 yapın
# Değişikliği uygulayın
# Acil durum: Firewall'ı konsoldan devre dışı bırakmak
# Proxmox node'una doğrudan erişimle:
echo "enable: 0" > /etc/pve/nodes/$(hostname)/host.fw
# veya
pve-firewall stop
Sorun 2: Conntrack tablo dolması
Yoğun trafikli ortamlarda conntrack tablosu dolabilir:
# Mevcut conntrack durumunu kontrol et
conntrack -L | wc -l
cat /proc/sys/net/netfilter/nf_conntrack_count
cat /proc/sys/net/netfilter/nf_conntrack_max
# host.fw OPTIONS bölümüne ekle:
# nf_conntrack_max: 524288
# nf_conntrack_tcp_timeout_established: 86400
Sorun 3: VM’ler arası trafik engellenmesi
Aynı bridge üzerindeki VM’ler varsayılan olarak birbirini görebilir. Eğer bu trafiği de kontrol etmek istiyorsanız:
# VM'nin .fw dosyasına aşağıdaki OPTIONS ekle
# Hem gelen hem giden için VM'e ait tüm bridge trafiği işlensin
# [OPTIONS]
# enable: 1
# ipfilter: 1
# macfilter: 1
Performans Optimizasyonu
Çok sayıda kural olduğunda firewall performansı etkilenebilir. Birkaç önerim:
- Sık eşleşen kuralları listenin başına koyun
- IP setlerini bireysel kurallar yerine tercih edin
- Gereksiz log’ları kapatın, özellikle DROP kurallarında “nolog” kullanmayı düşünün
- conntrack timeout değerlerini trafiğe göre optimize edin
# Firewall istatistiklerini kontrol et
iptables -L -n -v | grep PVEFW | sort -k1 -rn | head -20
# En çok eşleşen kuralları bul
iptables -L PVEFW-101-IN -n -v --line-numbers | sort -k1 -rn
Sonuç
Proxmox Firewall, doğru yapılandırıldığında altyapınızın güvenliğini ciddi ölçüde artırır. Katmanlı yapısı sayesinde hem genel politikalar hem de VM bazlı ince ayarlar yapabiliyorsunuz. En önemli nokta şu: önce planla, sonra uygula. Özellikle production ortamında, firewall kurallarını canlıya almadan önce mutlaka test edin ve konsol erişiminizin her zaman açık olduğundan emin olun.
IP setleri ve güvenlik gruplarını aktif kullanmak, kural yönetimini çok daha sürdürülebilir kılıyor. 50 VM için ayrı ayrı kural yazmak yerine birkaç grup oluşturup bunları referans almanız, hem zaman kazandırıyor hem de tutarlılığı sağlıyor. Log yönetimini de ihmal etmeyin, bir güvenlik olayını ancak loglarınız olduğunda geriye dönük inceleyebilirsiniz.
Son olarak şunu söyleyelim: Proxmox Firewall, enterprise firewall ürünleriyle birebir karşılaştırılamaz. Uygulama katmanı denetimi, deep packet inspection gibi özellikler için ek çözümlere ihtiyaç duyabilirsiniz. Ama temel ağ segmentasyonu ve erişim kontrolü için Proxmox’un yerleşik firewall’u son derece yeterli ve kullanımı kolay bir araç.