red-hat 7 yeni güvenlik duvarı : firewalld
TRANSCRIPT
Ön Söz
FirewallD Nedir ?
FirewallD ve İptables Karşılaştırmaları
Zone Kavramı Nedir ?
Varsayılan Zone Tanımları
Başlangıç
Zone Yönetimi
Kaynak Yönetimi
Servis Yönetimi
Güvenlik Duvarı Servis Konfigurasyonu
Port Yönetimi
Port Yönlendirme
Güvenlik Duvarı Kural Yönetimi
Grafik Arabirim (GUI) ile Güvenlik Duvarı Konfigurasyonu
Örnek Uygulamalar
Grafik Arayüz Programı ile Port Engellemek
Grafik Arayüz Programı ile Port Yönlendirmek
Grafik Arayüz Programı ile Varsayılan Zone Belirtmek
Ağ Arabirimlere Bağlı Zone ‘ları Görüntülemek/Değiştirmek
Güncel Hayattan Pratik Örnekler
FirewallD Log Mekanizması
FirewallD Log Seçenekleri
FirewallD Log Kural Sözdizimi
Syslog
Auditd
FirewallD Hata Numaraları
FirewallD Konfigurasyon Yedekleme İşlemleri
Yedek Alma
Düzenli Full Konfigurasyon Yedekleme
Crontab ‘a Kural Girdisi Eklemek
Değişiklik Oldukça Düzenli Yedekleme
Yedekten Geri Dönme
Ön Söz Bu yazı RHEL 7 ile gelen FirewallD hakkında detay bilgi içermektedir.
Bu makale v1 formatında ilk olarak 15.09.2015 tarihinde yayımlanmıştır.
Güncel sürümlerin slideshare.net/ibrahimucar39545464 adresinden
ulaşabilirsiniz.
Makale ile ilgili önerilerinizi, düzeltmemi istediğiniz hususları benimle
paylaşmanız ve katkıda bulunmanız beni çok mutlu eder. İletişim kurmaktan
lütfen çekinmeyiniz.
İbrahim UÇAR
twitter.com/ucribrahim
Network teknolojilerini öğrenirken, araştırma yapmamda ve yazdıklarımı
derleyip bu makaleyi hazırlamamda katkı sunan Ozan UÇAR ‘a teşekkürlerimi
sunarım.
FirewallD Nedir ? Rhel 7 ile beraber Iptables firewall yerini alan FirewallD yada diğer bilinen adı
ile Dynamic Firewall bir çok yenilik sunuyor.
Dynamic firewall servisi olan Firewalld, güvenli tutulması gereken ağları ve
onların tanımladığı ağ arabirimlerini “zone” desteği ile dinamik ve esnek bir
şekilde yönetebilir kılar.
IPv4 ve IPv6 konfigurasyon desteği sağlamaktadır. FirewallD, Bridge Ethernet
kartlarını destekler ve kalıcı konfigurasyon seçenekleri vardır. Servisler ve
uygulamaların doğrudan firewall kuralı eklemesi için bir arabirim sunmaktadır.
FirewallD ve İptables Karşılaştırmaları
Iptables ve FirewallD için gerekli başlıca farklılıklar şu şekildedir,
Iptables servisi konfigurasyon dosyasını /etc/sysconfig/iptables dizini
altında saklamaktadır buna istinaden firewalld bir çok konfigurasyon
dosyasını XML formatında /usr/lib/firewalld/ dizini altında
saklamaktadır. Not: Red Hat Enterprise Linux sistemlerde varsayılan
olarak firewalld kurulu ise /etc/sysconfig/iptables dizini
bulunmamaktadır.
Iptables servisi ile her yeni değişiklik diğer tüm kuralların temizlenip
/etc/sysconfig/iptables dosyasından yeniden yüklenmesi anlamına
gelmektedir, buna karşın firewalld eski kuralların tamamını yeniden
yüklemez, sadece değişiklikleri yükler ve uygular. Bu şu demek oluyor
ki, firewalld çalışma anında bir değişiklik yaptığınızda varolan
bağlantıları asla koparmaz. Bu durum bir statefull firewall’dan beklenen
en şık hareket olur.
Her ikiside ıptables araçlarını kullanarak kernel packet filter ile konuşur.
Aşağıdaki şema bunu göstermektedir.
Zone Kavramı Nedir ? Dilimize “bölge” olarak çevirebileceğimiz zone tanımı, ağ bağlantıları için
güven düzeyini tanımlar. Bu bağlantı yalnızca bir zone‘a dahil olabiliyor, ancak
bir zone için birçok ağ bağlantısı kullanılabilir. Bunu örnekleri ile
açıklayacağım ve yazının devamında zone ifadesini kullanmayı tercih
ediyorum (daha teknolojik)
Varsayılan Zone Tanımları drop : Tüm gelen ağ paketlerini engeller. Yalnızca giden ağ bağlantıları için
izin verilir.
block : Tüm gelen ağ bağlantılarını engeller ve IPv4 için
icmphostprohibited mesajı döndürür, IPv6 için ise icmp6admprohibited
döndürür.
public : Ortak kullanım için oluşturulmuş bir zone. Sadece seçili gelen
bağlantılar kabul edilir.
external : Bu zone dış ağı yani internet ağını temsil etmektedir.
dmz : Kamuya açık ve iç ağınıza sınırlı erişimi olan bilgisayarlar için
arındırılmış. Yalnızca seçili gelen bağlantılar kabul edilir.
work : Güvenli çalışma için oluşturulmuş çalışma alanı.
home : Ev alanlarında kullanım için oluşturulmuş çalışma alanı.
internal : İç ağda kullanılmak üzere oluşturulmuş çalışma alanı.
trusted : Tüm ağ bağlantıları kabul edilir.
Başlangıç
Firewalld servisinin durumunu kontrol etmek isterseniz aşağıdaki komutu
kullanabilirsiniz.
root# systemctl status firewalld
firewalld.service firewalld dynamic firewall daemon
Loaded: loaded (/usr/lib/systemd/system/firewalld.service; enabled)
Active: active (running) since Wed 20150701 13:10:20 PDT; 42s ago
Main PID: 700 (firewalld)
CGroup: /system.slice/firewalld.service
700 /usr/bin/python Es /usr/sbin/firewalld nofork nopid
veya alternatif kullanabileceğiniz başka bir komut ise aşağıdaki gibidir.
root# firewallcmd stat
running
Firewalld servisini başlatmak/durdurmak veya yeniden başlatmak isterseniz
aşağıdaki komutları kullanabilirsiniz.
root# systemctl stop firewalld
root# systemctl start firewalld
root# systemctl restart firewalld
Tamamen firewalld güvenlik duvarını devre dışı bırakmak isterseniz aşağıdaki
komutu kullanabilirsiniz.
root# systemctl disable firewalld
aynı şekilde firewalld güvenlik duvarını yeniden etkinleştirmek için,
root# systemctl enable firewalld
Acil durumlarda tüm ağ trafiğini engellemek isterseniz aşağıdaki komutu
kullanabilirsiniz.
root# firewallcmd panicon
kapatmak için,
root# firewallcmd panicoff
Güvenlik duvarının durumunu kontrol etmek isterseniz aşağıdaki komutu
kullanmanız yeterli olacaktır.
root# firewallcmd state
running
Sistemde birkaç ağ arabirimi var ise, IP paketlerinin bir ağ arabiriminden bir
başka ağ arabirimine yönlendirmek isterseniz aşağıdaki satırı /etc/sysctl.conf
dosyasının içerisine girip en son satıra yapıştırın.
NOT : Routing gibi bir işlem yapılmayacak ise gerekli olan bir durum değildir.
net.ipv4.ip_forward = 1
Daha sonra aşağıdaki komutu kullanılarak ayarlar etkinleştirilir.
root# sysctl p /etc/sysctl.conf
NOT: Bir ayarın kalıcı olarak ayarlanmasını istiyorsanız permament parametresini
kullanabilirsiniz. Aksi takdirde yapılan ayarlar sistem yeniden başlatılana kadar
sürecektir.
NOT: Yapılan ayarların hemen aktif olmasını istiyorsanız reload parametresini
kullanabilirsiniz.
Zone Yönetimi Sistemde varsayılan hangi zone kullanıldığını öğrenmek isterseniz aşağıdaki
komutu kullanabilirsiniz.
root# firewallcmd getdefaultzone
public
Sistem ağ arayüzleri, zone ‘lara atanmış kaynakları veya onlar hakkında bilgi
almak isterseniz aşağıdaki komut kullanılabilir.
root# firewallcmd getactivezones
public
interfaces: eth0
sources: 10.0.0.254/24
test
sources: 192.168.100.0/24
public
interfaces: eth1
sources: 172.16.16.0/24
Tüm kullanılabilir zone ‘ların listesini almak isterseniz aşağıdaki komutu
kullanabilirsiniz.
root# firewallcmd getzones
block dmz drop external home internal public trusted work
Varsayılan olarak kullandığınız bir zone alanını başka bir zone ile değiştirmek
isterseniz aşağıdaki komutu kullanabilirsiniz. Varsayılan zone artık home
ismindeki zone olacaktır.
root# firewallcmd setdefaultzone=home
success
NOT : Varsayılan zone ayrıca /etc/firewalld/firewalld.conf dosyasından
değiştirilebilir.
Sistem ağ arabirimleri geçici yada kalıcı bir şekilde herhangi bir zone’a
atanabilir. Geçici olarak internal zone ‘unu eth0 ağ arayüzüne atamak için
aşağıdaki komutu kullanmanız yeterli olacaktır.
root# firewallcmd zone=internal changeinterface=eth0
success
Yukarıdaki komutun aynısı sadece kalıcı olarak internal zone ‘unu eth0 ağ
arayüzüne atamak için aşağıdaki komut kullanılabilir.
root# firewallcmd permanent zone=internal changeinterface=eth0
success
Bir zone’a eklediğiniz ağ arabirimini geçici olarak kaldırmak isterseniz
aşağıdaki komutu kullanabilirsiniz. Kalıcı olarak kaldırmak için permanent
parametresini ekleyebilirsiniz.
root# firewallcmd zone=internal removeinterface=eth0
success
Sistem eth0 ağ arabiriminin hangi zone ile ilişkili olduğunu öğrenmek
isterseniz aşağıdaki komutu kullanabilirsiniz. Aşağıdaki çıktıda eth0 ağ
arabiriminin internal zone ile ilişkili olduğunu görmekteyiz.
root# firewallcmd getzoneofinterface=eth0
internal
Belirtilen network aralığı ile ilişkili olan zone ‘ları listelemek isterseniz
aşağıdaki komutu kullanabilirsiniz.
root# firewallcmd getzoneofsource=192.168.100.0/24
no zone
Genel geçerli zone yapılandırmasını görmek istersek aşağıdaki komutu
kullanabiliriz.
root# firewallcmd zone=public listall
public (default, active)
interfaces: eth0
sources:
services: dhcpv6client ippclient mdns sambaclient ssh
ports:
masquerade: no
forwardports:
icmpblocks:
Kalıcı olarak bir zone oluşturmak isterseniz aşağıdaki komutu kullanabilirsiniz.
Örneğin, test adlı bir zone oluşturmak için,
root# firewallcmd permanent newzone=test
success
root# firewallcmd reload
success
Tamamen bir zone silmek isterseniz aşağıdaki komutu kullanabilirsiniz.
Örneğin, oluşturmuş olduğumuz test adlı zone ‘u silmek için,
root# firewallcmd permanent deletezone=test
success
Önceden tanımlanmış servisleri görüntülemek istersek aşağıdaki komutu
kullanabiliriz.
root# firewallcmd getservices
RHSatellite6 amandaclient bacula baculaclient dhcp dhcpv6 dhcpv6client dns
ftp highavailability http https imaps ipp ippclient ipsec kerberos kpasswd ldap ldaps libvirt libvirttls mdns
mountd mswbt mysql nfs ntp openvpn pmcd
pmproxy pmwebapi pmwebapis pop3s postgresql proxydhcp radius rpcbind
samba sambaclient smtp ssh telnet tftp tftpclient transmissionclient vncserver wbemhttps
Aşağıdaki komut tüm zone’ların etkin listesini ve zone‘lar hakkında detaylı bilgi
verir.
root# firewallcmd listallzones
block
interfaces:
sources:
services:
ports:
masquerade: no
forwardports:
icmpblocks:
rich rules:
dmz
interfaces:
sources:
services: ssh
ports:
masquerade: no
forwardports:
icmpblocks:
rich rules:
drop
interfaces:
sources:
services:
ports:
masquerade: no
forwardports:
icmpblocks:
rich rules:
external
interfaces:
sources:
services: ssh
ports:
masquerade: yes
forwardports:
icmpblocks:
rich rules:
home
interfaces:
sources:
services: dhcpv6client ippclient mdns sambaclient ssh
ports:
Kaynak Yönetimi Bir zone’a kalıcı olarak network aralığı eklemek isterseniz aşağıdaki komutu
kullanabilirsiniz. Örneğin, test adlı zone’a network aralığı eklemek için,
root# firewallcmd permanent zone=test addsource=192.168.100.0/24
success
root# firewallcmd reload
success
root# firewallcmd zone=test listall
home
interfaces:
sources: 192.168.100.0/24
services: dhcpv6client ippclient mdns sambaclient ssh
ports:
masquerade: no
forwardports:
icmpblocks:
rich rules:
Bir zone içerisindeki kaynağı silmek isterseniz aşağıdaki komut kullanılabilir.
Örneğin, test adlı zone içerisindeki ( 192.168.100.0/24 ) kaynağını silmek için,
root# firewallcmd permanent zone=test removesource=192.168.100.0/24
success
Bir zone’a bağlı ağ arabirimleri listelemek isterseniz aşağıdaki komutu
kullanabilirsiniz. Herhangi bir zone belirtilmezse, varsayılan zone kullanılır.
root# firewallcmd zone=test listinterfaces
eth0
Bir zone ‘a ağ arabirimi eklemek isterseniz aşağıdaki komutu kullanabilirsiniz.
Örneğin, eth0 a eth0 adlı ağ arabirimi test adlı zone’a eklemek için aşağıdaki
birinci komut kullanabilir. Kalıcı olarak ayarlamak isterseniz ikinci komutu
kullanabilirsiniz.
root# firewallcmd zone=test addinterface=eth0
success
root# firewallcmd permanent zone=test addinterface=eth0
success
NOT: NetworkManager ağ arabirimleri otomatik olarak zone’lara eklemektedir.
Bir zone içerisindeki kaynağı kalıcı olarak değiştirmek istersek aşağıdaki
komutu kullanabiliriz. Örneğin, (192.168.100.0/24) kaynağını
(172.16.16.0/24) kaynağı ile değiştirmek için aşağıdaki komutu kullanmamız
yeterli olacaktır. Eğer kalıcı olarak ayarlamak istemezsek permanent
parametresini kaldırabiliriz.
root# firewallcmd permanent zone=test changesource=172.16.16.0/24
success
Bir zone alanına ait port numaralarını listelemek istersek aşağıdaki komutu
kullanabiliriz.
root# firewallcmd zone=test listports
443/tcp 22/tcp 80/udp
Bir zone alanına bağlı kaynakları listelemek isterseniz aşağıdaki komutu
kullanabilirsiniz. Eğer herhangi bir zone belirtilmezse, varsayılan zone için
uygulanacaktır.
root# firewallcmd zone=test listsources
192.168.100.0/24
Bir zone için yönlendirilmiş port ’ların listesini görmek için aşağıdaki komut
kullanılabilir. Eğer herhangi bir zone belirtilmez ise varsayılan zone
kullanılacaktır.
root# firewallcmd zone=test listforwardports
Servis Yönetimi Örneğin, HTTP servisini sürekli belirtilen zone için izin vermek isterseniz
aşağıdaki komutu kullanabilirsiniz. Daha sonra yaptığınız değişikliği hemen
aktif olmasını isterseniz ikinci komutu kullanabilirsiniz. Bu seçenek birden çok
kez belirtilebilir.
root# firewallcmd permanent zone=test addservice=http
success
root# firewallcmd reload
success
root# firewallcmd zone=test listall
test
interfaces: eth0
sources: 192.168.100.0/24
services: dhcpv6client ippclient mdns sambaclient ssh http
ports:
masquerade: no
forwardports:
Belirtilen zone için mesela, HTTP servisini yasaklamak isterseniz aşağıdaki
komutu kullanabilirsiniz. Yasaklamaktan kastım belirtilen HTTP servisi bu
zone için kaldırıldığı zaman zaten bu servise kimse erişemeyecek, dolayısıyla
yasaklanmış olacaktır.
root# firewallcmd permanent zone=test removeservice=http
success
Varsayılan olarak kullanılan zone içerisindeki servisleri listelemek istersek
aşağıdaki komutu kullanabiliriz.
root# firewallcmd listservices
dhcpv6client ssh
Yukarıdaki komut varsayılan zone içerisindeki servisleri gösterir demiştik.
Aşağıdaki komut ise belirtilen zone içerisindeki servisleri gösterir.
root# firewallcmd zone=test listservices
dhcpv6client http ippclient mdns sambaclient ssh
Varsayılan olarak kullandığınız zone alanına yeni bir servis eklemek isterseniz
aşağıdaki komutu kullanabilirsiniz. Kalıcı olarak eklemek isterseniz
permanent parametresi ekleyebilirsiniz.
root# firewallcmd newservice=ftp
success
Örneğin bir servisi sadece 10 saniye için varsayılan zone ‘a eklemek
isterseniz aşağıdaki komutu kullanabilirsiniz. Daha sonra listall
parametresini kullanarak test edebilirsiniz.
root# firewallcmd addservice=samba timeout=10
success
Önceden tanımlanmış icmp türlerini görüntülemek istersek aşağıdaki komutu
kullanabiliriz.
root# firewallcmd geticmptypes
destinationunreachable echoreply echorequest parameterproblem redirect
routeradvertisement routersolicitation sourcequench timeexceeded
Varsayılan olara kullandığınız zone alanına yeni bir icmp türünü eklemek
isterseniz aşağıdaki komutu kullanabilirsiniz.
root# firewallcmd newicmptype=echoreply
success
Önceden tanımlanmış bir icmp türünü silmek istersek aşağıdaki komutu
kullanabiliriz. Kalıcı olarak silmek istersek permanent parametresi
ekleyebiliriz.
root# firewallcmd deleteicmptype=echoreply
success
Güvenlik Duvarı Servis Konfigurasyonu Firewalld paketi ile birlikte güvenlik duvarı yapılandırma hizmetleri
(ftp,httpd,ssh,) /usr/lib/firewalld/services dizininde tutulmaktadır. Eğer yeni
servisler eklemek isterseniz /etc/firewalld/services dizini içerisine
ekleyebilirsiniz. Eğer dosyalar aynı hizmet için her iki yerde kullanılıyorsa
/etc/firewalld/services dizinindeki dosyalar önceliklidir.
Örneğin, HAProxy servisi.
Aşağıdaki komutu kullanarak haproxy.xml adında bir dosya oluşturun ve
aşağıdaki satırı içerisine yapıştırın. Ayarları kaydetmek için CTRL+O
kombinasyonuna basıktan sonra enter tuşuna basılır ardından CTRL+X
kombinasyonuna basarak dosyadan çıkılır.
root# nano /etc/firewalld/services/haproxy.xml
<?xml version="1.0" encoding="utf8"?>
<service>
<short>HAProxy</short>
<description>HAProxy loadbalancer</description>
<port protocol="tcp" port="80"/>
</service>
Daha sonra aşağıdaki komutlar kullanılarak dosya için gerekli ayarlar yapılır.
root# cd /etc/firewalld/services
root# restorecon haproxy.xml
root# chmod 640 haproxy.xml
Varsayılan olarak kullanılan zone alanına oluşturduğumuz servisi eklemek
istersek aşağıdaki komutu kullanabiliriz. Eğer eklemek istediğimiz özel bir
zone varsa zone=zone_ismi parametresini kullanabiliriz.
root# firewallcmd permanent addservice=haproxy
success
root# firewallcmd reload
success
Varsayılan olarak kullanılan zone‘a eklediğimiz haproxy servisini kaldırmak
istersek aşağıdaki komutu kullanabiliriz.
root# firewallcmd permanent removeservice=haproxy
success
root# firewallcmd reload
success
Port Yönetimi Bir zone alanına kalıcı olarak 443/tcp portuna izin vermek isterseniz aşağıdaki
komutu kullanabilirsiniz. Örneğin, test adlı zone ‘a 443/tcp portunu izin
verelim. Kalıcı olarak eklemek istemezseniz permanent parametresini
kaldırabilirsiniz.
root# firewallcmd permanent zone=test addport=443/tcp
success
root# firewallcmd reload
success
root# firewallcmd zone=test listall
test
interfaces: eth0
sources: 192.168.100.0/24
services: dhcpv6client http ippclient mdns sambaclient ssh
ports: 22/tcp 443/tcp
masquerade: no
forwardports:
Bir zone alanına eklediğiniz port numarasını silmek isterseniz aşağıdaki
komutu kullanabilirsiniz. Eğer herhangi bir zone belirtilmezse, varsayılan zone
için uygulanacaktır.
root# firewallcmd permanent zone=test removeport=443/tcp
success
Bir zone alanına eklediğimiz port numaralarını görmek istersek aşağıdaki
komutu kullanabiliriz.
root# firewallcmd zone=test listports
443/tcp 22/tcp
Port Yönlendirme Güvenlik duvarında port yönlendirme yapmak isterseniz aşağıdaki adımları
takip edebilirsiniz.
Bir zone için port yönlendirme yapmak istersek aşağıdaki komutu
kullanabiliriz. Aşağıdaki komutun anlamı şudur, test adlı zone için tcp
protokolü ile 22 portuna gelen tüm istekleri 3758 portuna yönlendir.
root# firewallcmd permanent zone=test addforwardport=port=22:proto=tcp:toport=3758
success
root# firewallcmd reload
success
root# firewallcmd zone=test listall
test
interfaces: eth0
sources: 192.168.100.0/24
services: dhcpv6client http ippclient mdns sambaclient ssh
ports: 443/tcp 80/udp 22/tcp
masquerade: no
forwardports: port=22:proto=tcp:toport=4000:toaddr=
Belirtilen zone için tcp protokolü ile 22 portuna gelen tüm istekleri içerideki
192.168.100.50 ip adresinin 3758 portuna yönlendir.
root# firewallcmd permanent zone=test
addforwardport=port=22:proto=tcp:toport=3758:toadddr=192.168.100.50
success
Belirtilen zone için kaynağı herhangi biri olan 80 portuna gelen tüm istekleri
192.168.100.150 ip adresinin 9999 portuna yönlendir.
root# firewallcmd permanent zone=test
addforwardport=port=80:proto=tcp:toport=9999:toadddr=192.168.100.50
success
Bu sefer UDP protokolü üzerinden çalışan bir port yönlendirme kuralı girelim.
Belirtilen zone için 53 portuna gelen tüm istekleri 3450 portuna yönlendir.
root# firewallcmd permanent zone=test
addforwardport=port=53:proto=udp:toport=3450
success
Yukarıdaki komutun aynısı sadece toaddr= parametresini ekleyerek içerideki
istediğimiz bir ip adresine port yönlendirme yapabiliriz. Belirtilen zone için 53
portuna gelen tüm istekleri içerideki 192.168.100.100 ip adresinin 3450
portuna yönlendir.
root# firewallcmd permanent zone=test
addforwardport=port=53:proto=udp:toport=3450:toadddr=192.168.100.100
success
Bir zone alanına eklediğiniz port yönlendirmeyi silmek isterseniz aşağıdaki
komutu kullanabilirsiniz.
root# firewallcmd permanent zone=test
removeforwardport=port=53:proto=udp:toport=3450:toadddr=192.168.100.100
success
Güvenlik Duvarı Kural Yönetimi FirewallD ile kural yazımı örneklerini direct ve richrule parametrelerini
kullanarak anlatacağım.
direct : Kulllanıcıların Iptables konseptini temel seviyede öğrenmesi için
gereklidir. Kullanılması pek önerilmez.
richrule : Bilinen Iptables söz dizimi olmadan, en karmaşık firewall
kurallarını yazmak için yüksek seviyede zengin bir yazım seçeneği sunar.
Aşağıdaki örnekte direct parametresi kullanılarak varsayılan zone için bir
kural girelim. Bu örneğimizde kaynağı herhangi bir ip adresinden gelen
kaynağı herhangi bir ip adresine giden ve hedefi 22. (ssh) portuna erişimine
izin ver.
root# firewallcmd direct addrule ipv4 filter INPUT 0 p tcp dport 22 j ACCEPT
success
Bu örneğimizde ise kaynağı herhangi bir ip adresinden gelen kaynağı
herhangi bir ip adresine giden ve hedefi 9000 portuna erişimini yasakla.
root# firewallcmd direct addrule ipv4 filter INPUT 0 p tcp dport 9000 j DROP
success
Eklemiş olduğumuz direkt kullarını görüntülemek istersek aşağıdaki
kullanabiliriz.
root# firewallcmd zone=test direct getallrules
ipv4 filter INPUT 0 p tcp dport 22 j ACCEPT
ipv4 filter INPUT 0 p tcp dport 9000 j DROP
Eğer eklemiş olduğumuz direkt kuralını silmek istersek aşağıdaki komutu
kullanabiliriz.
root# firewallcmd direct removerule ipv4 filter INPUT 0 p tcp dport 22 j ACCEPT
success
Sıra geldi zengin (rich) kural yazımı ile ilgili örnek kurallar yazmaya.
Belirli bir network aralığı için örneğin http (80) servisine izin vermek isterseniz
aşağıdaki komut kullanılabilir.
root# firewallcmd addrichrule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
success
Yukarıdaki komutun aynısı sadece bu kuralı kalıcı olarak ayarlamak istersek
permanent parametresini ekleyebiliriz.
root# firewallcmd permanent addrichrule 'rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
success
Bir network aralığı için https (443) servisine izin verelim. Unutmayınız
permanent parametresini ekleyerek kuralın kalıcı olmasını sağlayabilirsiniz.
root# firewallcmd addrichrule 'rule family="ipv4" source address="192.168.0.0/24" service name="https" accept'
success
Aynı şekilde bir network aralığı için vncserver servisine izin vermek istersek
aşağıdaki komutu kullanabiliriz.
root# firewallcmd addrichrule 'rule family="ipv4" source address="192.168.0.0/24" service name="vncserver" accept'
success
Örneğin, test adlı bir zone için kural eklemek istersek aşağıdaki gibi bir komut
kullanabiliriz. Bu örneğimizde test adlı zone içerisindeki network aralığına ssh
(22) servisine izin verilmiş. Unutmayınız permanent parametresini ekleyerek
kuralın kalıcı olmasını sağladık.
root# firewallcmd permanent zone=test addrichrule 'rule family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'
success
Bir ip adresi için ssh (22) servisini kullanmasını engellemek istersek aşağıdaki
gibi bir komut kullanabiliriz. Bu kuralı özel bir zone için eklemek istersek
zone=zone_ismi parametresini kullanabiliriz.
root# firewallcmd permanent zone=test addrichrule 'rule family="ipv4" source address="192.168.100.50/24" service name="ssh" drop'
success
veya aşağıdaki gibi komut kullanarak bu ip adresinin ssh (22) servisini
kullanmasını engelle aynı zamanda geri ona hata mesajı döndür diyebiliriz. :)
root# firewallcmd permanent zone=test addrichrule 'rule family="ipv4" source address="192.168.100.50/24" service name="ssh" reject'
success
Yukarıdaki kurallarda hep 22 vb.. port numaraları yerine ssh gibi kelimeler
kullanılmış. Siz bunu isterseniz ssh veya karşılığı olan 22 port numarasını
yazın iki seçenek aynı anlamlara geliyor. Hangisi kolayınıza geliyorsa onu
kullanabilirsiniz.
root# firewallcmd permanent zone=test addrichrule 'rule family="ipv4" source address="192.168.100.50/24" service name="22" reject'
success
Varsayılan zone için eklemiş olduğumuz kuralları listelemek istersek aşağıdaki
komutu kullanabiliriz.
root# firewallcmd listall
public (default, active)
interfaces: eno16777736
sources:
services: dhcpv6client ssh
ports: 443/tcp
masquerade: yes
forwardports:
icmpblocks:
rich rules:
rule family="ipv4" source address="192.168.0.0/24" service
name="http" accept
rule family="ipv4" source address="192.168.0.0/24" service
name="ssh" accept'
Özel bir zone için eklediğimiz kuralları listelemek için aşağıdaki komutu
kullanabiliriz.
root# firewallcmd zone=test listall
test (active)
interfaces: eno33554984
sources: 192.168.0.0/24
services: dhcpv6client ippclient ssh
ports: 22/tcp
masquerade: yes
forwardports: port=22:proto=tcp:toport=2222:toaddr=192.168.100.50
icmpblocks:
rich rules:
rule family="ipv4" source address="192.168.100.253/24" service
name="21" accept
rule family="ipv4" source address="192.168.100.50/24" service
name="ssh" reject
rule family="ipv4" source address="192.168.0.0/24" service
name="http" accept
rule family="ipv4" source address="192.168.0.0/24" service
name="ssh" accept
rule family="ipv4" port port="22" protocol="tcp" accept
rule family="ipv4" source address="192.168.100.50/24" service
name="ssh" drop
Peki eklediğimiz bir kuralı nasıl silebiliriz. Aşağıdaki komutu kullanarak
varsayılan zone için belirttiğimiz kuralı silebiliriz.
root# firewallcmd permanent removerichrule='rule family="ipv4" source
address="192.168.0.0/24" service name="http" accept'
success
root# firewallcmd listall
public (default, active)
interfaces: eno16777736
sources: 192.168.0.0/24
services: dhcpv6client ssh
ports: 443/tcp
masquerade: yes
forwardports:
icmpblocks:
rich rules:
rule family="ipv4" source address="192.168.0.0/24" service
name="ssh" accept'
aynı zamanda özel bir zone için bir kural silmek istersek aşağıdaki komutu
kullanabiliriz. Kalıcı olarak silmek isterseniz permanent parametresini
ekleyebilirsiniz.
root# firewallcmd permanent zone=test removerichrule='rule
family="ipv4" source address="192.168.0.0/24" service name="ssh" accept'
success
Grafik Arabirim (GUI) ile Güvenlik Duvarı
Konfigurasyonu
Firewalld güvenlik duvarı komut satırından yönetildiği gibi aynı zamanda grafik
arayüz ile yönetilebilmektedir. Bu araç kullanıcı dostu olup çok kolay bir
şekilde firewalld güvenlik duvarını yönetebilmenize olanak sağlar. Bu grafik
arayüzü programını çalıştırabilmeniz için centos 7 işletim sisteminizde Masa
Üstü ortamının ( Desktop ) olması gerekiyor. Grafik arayüz kurulumunu
yazının ilerleyen konularında değineceğim.
Varsayılan olarak Centos 7 ve üzeri sistemlerde artık kurulu gelecektir fakat
alt sürümlerde olmayabilir. Bu durumda aşağıdaki komutu kullanarak grafik
yönetim aracını indirebilirsiniz.
root# yum update && yum upgrade y
root# yum install firewallconfig y
Kurulum bittikten sonra aşağıdaki komut yardımıyla firewalld grafik arayüz
programını açabilir ve firewalld güvenlik duvarını yönetebilirsiniz.
root# firewallconfig
Örnek Uygulamalar Firewall yönetiyorsanız sık yapmanız gereken işlemler arasında, port
filtrelemek, port yönlendirmek, ip adresi yada ip gruplarına çeşitli kurallar
tanımlamaktır. Aşağıda bunları grafik arabirim üzerinden yapmanızı
sağlayacak pratik uygulamalar ele aldım.
NOT: Yazının giriş kısmından sonraki bölümlerde komut satırından bu
işlemlerin nasıl yapılacağını açıkladım.
Grafik Arayüz Programı ile Port Engellemek Örneğin, İnternet ağından (yani public zone) 22. porta gelen trafiği engellemek
istiyorum. Bunun için ilk önce (firewallconfig) program açılır ve kural
oluşturmak istediğimiz zone seçilir. Zone seçildikten sonra Rich Rules
sekmesine girip Add butonuna tıklayarak bir tane firewall kuralı oluşturuyoruz.
ardından yapacağınız işleme göre seçenekleri belirlemeniz gerekir. Benim
örneğimden internetteki herhangi bir ip adresinden, sahip olduğum herhangi
bir ip adresin port tcp 22. porta gelen trafiği engellemek yer alıyor. Bu
doğrultuda aşağıdaki ayarlar yapıldıktan sonra OK butonu ile değişiklikleri
kaydediyoruz.
NOT : Configuration = Permanent seçilerek yapılacak ayarların kalıcı olarak
ayarlanmasını sağlayabilirsiniz. Aksi takdirde sistem yeniden başlatıldıktan
sonra yapılan ayarlar silinecektir.
NOT : Ayarların aktif olması için Options > Reload Firewalld butonuna
tıklayabilirsiniz veya firewallcmd reload komutunu kullanabilirsiniz.
Grafik Arayüz Programı ile Port Yönlendirmek Bu örnekte ise grafik arayüz programı ile port yönlendirme nasıl yapılır bunu
inceleyelim. İlk önce Port Forwarding sekmesine girilir ardından Add
butonuna tıklayarak yeni bir kural oluşturulur. Aşağıdaki kural ile internetteki
herhangi bir ip adresinden, sahip olduğum herhangi bir ip adresinin tcp 22
portuna gelen istekleri iç ağımdaki 192.168.100.50 ip adresinin 2222 portuna
yönlendirmiş oluyoruz.
NOT : Ayarların aktif olması için Options > Reload Firewalld butonuna
tıklayabilirsiniz veya firewallcmd reload komutunu kullanabilirsiniz.
Grafik Arayüz Programı ile Varsayılan Zone
Belirtmek Varsayılan olarak kullanılan herhangi bir zone ‘u başka bir zone ile
değiştirmek isterseniz aşağıdaki adımları takip edebilirsiniz. Bunu hem komut
satırından hemde aşağıdaki gibi grafik program ile yapabilirsiniz.
Grafik arayüzde Options > Change Default Zone > bölümüne girdikten sonra
aşağıdaki gibi istediğiniz bir zone seçerek onu varsayılan zone olarak
kullanabilirsiniz.
NOT : Aynı zamanda /etc/firewalld/firewalld.conf dosyasını açıp varsayılan
zone alanını değiştirebilirsiniz.
Ağ Arabirimlere Bağlı Zone ‘ları
Görüntülemek/Değiştirmek Herhangi bir zone alanına eklediğiniz ağ arabirimini görüntülemek veya
değiştirmek isterseniz Options > Change Zone of Connections > bölümüne
girip gerekli ayarları yapabilirsiniz.
Güncel Hayattan Pratik Örnekler
1. IPv4 ve IPv6 bağlantırını ftp servisi için her 1 dakika için audit ile loglama
yap.
root# firewallcmd addrichrule='rule service name="ftp" audit limit
value="1/m" accept'
2. IPv4 bağlantıları kaynağı 192.168.0.0/24 adresinden gelen tftp servisi için
syslog ile her 1 dakikada loglama yap.
root# firewallcmd addrichrule='rule family="ipv4" source
address="192.168.0.0/24" service name="tftp" log prefix="tftp" level="info"
limit value="1/m" accept'
3. Kaynağı 192.168.2.2 ip adresinin internete çıkarken geçen tüm
bağlantılarına izin ver.
root# firewallcmd addrichrule='rule family="ipv4" source
address="192.168.2.2" accept'
3. Kaynağı 192.168.2.3 ip adresinin tüm bağlantılarını engelle aynı zamanda
geriye hata mesajı döndür.
root# firewallcmd addrichrule='rule family="ipv4" source
address="192.168.2.3" reject'
5. Kaynağı 192.168.2.4 ip adresinin tüm bağlantılarını engelle.
root# firewallcmd addrichrule='rule family="ipv4" source
address="192.168.2.4" drop'
FirewallD Log Mekanizması Loglar sorun çözmede faydalandığımız ilk kaynaklardan biridir. Bir şeylerin
ters gittiğini gördüğünüzde, yada anormallikleri gözlemlemek istediğinizde
loglar hayat kurtarıcı olur.
FirewallD varsayılan olarak firewall kuralları, yönlendirme kuralları için log
tutmamaktadır. Fakat kendi kurallarınız için özel bir log dosyası
oluşturabiliyorsunuz. Bu konuya yazının ilerleyen kısımlarında değineceğim.
FirewallD hata ayıklama çıkışı varsayılan olarak /var/log/firewalld dosyasına
yazılır. Aşağıdaki komutu kullanarak /var/log/firewalld log dosyasının son
satırlarını görebilirsiniz.
root# tail f /var/log/firewalld
20150824 12:09:45 DEBUG2: firewall.core.ipXtables.ip6tables: /sbin/ip6tables t
mangle P FORWARD ACCEPT
20150824 12:09:45 DEBUG1: PanicModeDisabled()
20150824 12:09:49 DEBUG1: zone.getZones()
20150824 12:11:19 DEBUG1: config.getServiceByName('bacula')
20150824 12:11:2 DEBUG1: config.getZoneByName('public')
FirewallD Log Seçenekleri
FirewallD iki farklı log mekanizması bulunmaktadır. Bunlardan birisi auditd
diğeri ise syslog mekanizmasıdır. Varsayılan olarak syslog mekanizması
kullanılmaktadır. Fakat auditd ile loglama yapmak isterseniz bunu kuralda
belirtmeniz gerekir.
NOT : Firewalld loglama “s” saniye, “m” dakika, “h” saat, “d” gün olmak
üzere zaman zarfları bulunmaktadır. Bu zaman zarfları bir log dosyasının ne
zamanda bir loglanacağını belirtir.
FirewallD Log Kural Sözdizimi
Firewalld log kural yazımının söz dizimi aşağıdaki gibidir.
log [prefix="<prefix text>"] [level="<log level>"] [limit value="<rate/duration>"]
Syslog
Aşağıdaki komutu kullanarak oluşturulacak firewall kuralı için o kurala ait özel
bir log dosyası oluşturulabilir. Örneğin, aşağıdaki kuralda tftp bağlantısı için
izin kuralı tanımlanmış ve her 1 dakika için loglama yap ve logu tftplog ismi
ile oluştur denmiş.
root# firewallcmd addrichrule='rule family="ipv4" source address="192.168.0.0/24"
service name="tftp" log prefix="tftp" level="info" limit value="1/m" accept'
Aşağıdaki kuralda ise 192.168.100.50 ip adresinin dışarıya 22 portunun
erişimi engellenmiş ve her 1 dakika için loglama yap ve logu sshlog ismi ile
oluştur denmiş.
root# firewallcmd addrichrule='rule family="ipv4" source address="192.168.100.50"
service name="ssh" log prefix="sshlog" level="info" limit value="1/m" drop’
Audit Aşağıdaki kuralda ise ftp servisine izin verilmiş ve her 1 dakika için auditd ile
loglama yap denmiş.
root# firewallcmd addrichrule='rule service name="ftp" audit limit value="1/m"
accept'
Aşağıdaki kuralda kaynağı 192.168.2.4 ip adresinin 22 (ssh) port erişimini
yasakla ve her 1 dakika için auditd ile loglama yap ve logu sshlog ismi ile
oluştur denmiş.
root# firewallcmd addrichrule='rule family="ipv4" source address="192.168.2.4"
service name="ssh" audit prefix="sshlog" level="info" limit value="1/m" drop’
FirewallD Hata Numaraları Bazen log dosyalarını incelerken, karşımıza çıkan hataları kırmızı renkle çizili
olarak görürüz. Bunun gibi bazen hataların yanında kodlar olur veya hatalar
olmadan sadece kodları vardır. Örneğin ( 403 Forbidden vb. ) hata kodları
mevcuttur. Firewalld güvenlik duvarına ait hata mesajları ve karşısında hata
numaraları aşağıdaki gibidir.
Başlık Numara
ALREADY_ENABLED | 11 |
NOT_ENABLED | 12 |
COMMAND_FAILED | 13 |
NO_IPV6_NAT | 14 |
PANIC_MODE | 15 |
NOT : Daha fazlası için man sayfasına bakınız.
Centos 7 Desktop Kurulumu
Centos 7 işletim sistemine desktop kurmak isterseniz aşağıdaki adımları takip
edebilirsiniz. Firewalld güvenlik duvarını grafik arayüz programı ile yönetmek
isterseniz desktop kurmalısınız aksi takdirde program açılmayacaktır.
İlk önce aşağıdaki komutu kullanarak sistem depolarını güncelleyelim.
root# yum y update
Daha sonra aşağıdaki komutu kullanarak desktop için gerekli olan paketleri
kuralım. Aşağıdaki komutu duğrudan copy/paste yapıp kullanabilirsiniz.
root# yum groupinstall “GNOME Desktop” “Graphical Administration Tools”
Sıra geldi otomatik olarak desktop ekranın açılmasını sağlamak. Aşağıdaki
komutu kullanarak desktop ekranının otomatik olarak açılmasını
sağlayabilirsiniz. Aksi takdirde aynı komut satırını göreceksiniz.
root# ln sf /lib/systemd/system/runlevel5.target /etc/systemd/system/default.target
Sistem yeniden başlatıldıktan sonra aşağıdaki gibi Gnome Desktop masaüstü
ekranı ile karşılaşacaksınız.
Firewalld Parametreleri
permament : Bu parametre bir şeyi kalıcı olarak ayarlamak için kullanılır.
reload : Bu parametre değiştirilen ayarların hemen aktif olmasını sağlar.
/usr/lib/firewalld/services : Bu dizin altında servisler bulunuyor.
/usr/lib/firewalld/zones : Bu dizin içerisine bölgeler bulunuyor.
/usr/lib/firewalld/icmptypes : Bu dizin içerisinde icmp türleri yer alıyor.
/etc/firewalld/services : Bu dizin içerisine yeni servisler eklenebiliyor.
firewallcmd : Bu araç firewalld güvenlik duvarı komut istemcisi olarak
kullanılıyor.
/etc/firewalld/firewalld.conf : Bu dosya bölgelerin bilgilerini barındırır ve
varsayılan hangi zone kullanılıyor onu gösterir.
firewallcmd getzones : Zone’ları listeler ve hakkında bilgi verir.
firewallcmd getservices : Önceden tanımlanmış servisleri listeler.
firewallcmd geticmptype : Önceden tanımlanmış icmp türlerini listeler.
firewallcmd getdefaultzone : Varsayılan olarak kullanılan zone’u
gösterir.
firewallcmd getdefaultzone=test : Test adlı zone’u varsayılan zone
olarak ayarlar.
firewallcmd getactivezones : Aktif kullanılan bölgeleri listeler.
firewallcmd getzoneofinterface=eth0 : Hangi bölgenin eth0 ağ arabirimi
ile ilişkili olduğunu gösterir.
firewallcmd listallzones : Tüm bölgeleri listeler ve onlar hakkında birçok
bilgi verir.
FirewallD Konfigurasyon Yedekleme İşlemleri
Firewall’larımızın kuralları hayati öneme sahiptir, çeşitli felaket senaryolarında
geri dönmek, farklılıkları gözlemlemek için yedek almamız ciddi önem
taşımaktadır.
Yedek Alma Aşağıdaki komut ile genel geçerli olan FirewallD kurallarını yedekleyebilirsiniz.
Daha sonra cat komutu ile içerisindeki kuralları inceleyebilirsiniz.
root# iptablessave > firewalld_rules_ipv4
root# iptablessave > firewalld_rules_ipv6
Düzenli Full Konfigurasyon Yedekleme Bir shell script oluşturup daha sonra o script dosyasına her gün belirli saatler
ile yedekleme yapmasını söylebiliriz. Aşağıdaki örnek script dosyasının
içerisinde tar ile /etc/firewalld, /var/log/firewalld, dizinlerini bugünün tarihi ile
/home dizini altına yedekle demiş oluyoruz. Bunu yapmak için ilk önce içi boş
bir dosya oluşturulur daha sonra dosyanın içerisine nano, ee, vim, vi gibi
araçlar kullanılarak girilir ve dosyanın içerisine aşağıdaki kod eklenir arından
CTRL+O kombinasyonuna basarak kaydedilir ve CTRL+X kombinasyonuna
basarak çıkılır.
root# touch script_dosyam
root# nano script_dosyam
#!/bin/bash
NOW=$(date +"%m%d%Y")
FILE="firewalld_backup.$NOW.tar.gz"
echo "Biraz bekleyin dosyalar sıkıştırılıyor… :)"
# rest of script
tar cvf /home/firewalld_backup.$NOW.tar.gz /etc/firewalld /var/log/firewalld
root# bash script_dosyam
Biraz bekleyin dosyalar sıkıştırılıyor… :)
tar: Removing leading `/' from member names
/etc/firewalld/
/etc/firewalld/firewalld.conf
/etc/firewalld/icmptypes/
/etc/firewalld/lockdownwhitelist.xml
/etc/firewalld/services/
/etc/firewalld/zones/
/etc/firewalld/zones/public.xml
/etc/firewalld/zones/test.xml.old
/etc/firewalld/zones/public.xml.old
/etc/firewalld/zones/work.xml
/etc/firewalld/zones/work.xml.old
/etc/firewalld/direct.xml
/etc/firewalld/direct.xml.old
/var/log/firewalld
Crontab ‘a Kural Girdisi Eklemek
Yapmış olduğumuz bu bash script dosyasını her zaman gidip elle çalıştırmak
istemeyiz. Bunun için crontab’a görev tanımlayıp bizim yapacağımız işi ona
devredebiliriz. Bunu yapmak için ilk önce crontab içerisine girilir ardından
aşağıdaki gibi crontab girdisi eklenir.
NOT : Crontab girdisini dakika, saat, ayın günleri, ay, hafta günlerini
istediğiniz gibi ayarlayabilirsiniz.
Aşağıdaki örnekte her gün her hafta her ay öğlen saat 12 ‘de /bin/bash
/root/script_dosyam adlı komutu çalıştır. Daha sonra dosya kaydedilip çıkılır.
root# cronteb e
* 12 * * * /bin/bash /root/script_dosyam
Yedekten Geri Dönme FirewallD kurallarını yedeklediğimiz dosyanın adını aşağıdaki gibi belirterek
yedekten geri dönebiliriz.
root# iptablesrestore < firewalld_rules_ipv4
root# iptablesrestore < firewalld_rules_ipv6
NOT : Güncel sürümlerin slideshare.net/ibrahimucar39545464 adresinden
aynı zamanda lifeoverlinux.com sitesinden ulaşabilirsiniz.