Ö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ınlanmıştır. Güncel sürümlerine slideshare.net/ibrahimucar39545464 adresinden ulaşabilir aynı zamanda bu site üzerinden takip edebilirsiniz.
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
- [email protected]
- 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önetilebilir kılar.
IPv4 ve IPv6 konfigürasyon desteği sağlamaktadır. FirewallD, Bridge Ethernet kartlarını destekler ve kalıcı konfigürasyon seçenekleri vardır. Servisler ve uygulamaların doğrudan firewall kuralı eklemesi için bir arabirim sunmaktadır.
FirewallD ve Iptables Karşılaştırmaları
Iptables ve FirewallD için gerekli başlıca farklılıklar şu şekildedir.
- Iptables servisi konfigürasyon dosyasını /etc/sysconfig/iptables dizini altında saklanmaktadır, buna istinaden firewalld bir çok konfigürasyon 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ız 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 icmp-host-prohibited mesajı döndürür, IPv6 için ise icmp6-adm-prohibited 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 2015-07-01 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# firewall-cmd --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# firewall-cmd --panic-on
kapatmak için,
root# firewall-cmd --panic-off
Güvenlik duvarının durumunu kontrol etmek isterseniz aşağıdaki komutu kullanmanız yeterli olacaktır.
root# firewall-cmd --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ırı yapıştırınız.
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 komut kullanarak ayarlar etkinleştirilir.
root# sysctl -p /etc/sysctl.conf
NOT : Bir ayarın kalıcı olarak ayarlanmasını istiyorsanız –permanent 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# firewall-cmd --get-default-zone
public
Sistem ağ arayüzleri, zone ‘lara atanmış kaynakları ve onlar hakkında bilgi almak isterseniz aşağıdaki komut kullanılabilir.
root# firewall-cmd --get-active-zones
public
interfaces: eth0
sources: 10.0.0.254/24
test
interfaces: eth1
sources: 192.168.100.0/24
Tüm kullanılabilir zone ‘ların listesini almak isterseniz aşağıdaki komutu kullanabilirsiniz.
root# firewall-cmd --get-zones
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# firewall-cmd --set-default-zone=home
success
root# firewall-cmd --get-default-zone
home
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 eth0 ağ arabirimini internal zone’a atamak için aşağıdaki komutu kullanmanız yeterli olacaktır.
root# firewall-cmd --zone=internal --change-interface=eth0
success
Yukarıdaki komutun aynısı sadece kalıcı olarak internet zone ‘unu eth0 ağ arayüzüne atamak için aşağıdaki komut kullanılabilir.
root# firewall-cmd --permanent --zone=internal --change-interface=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# firewall-cmd --zone=internal --remove-interface=eth0
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 internet zone ile ilişkili olduğunu görmekteyiz.
root# firewall-cmd --get-zone-of-interface=eth0
Belirtilen network aralığı ile ilişkili olan zone ‘ları listelemek isterseniz aşağıdaki komutu kullanabilirsiniz.
root# firewall-cmd --get-zone-of-source=192.168.100.0/24
no zone
Genel geçerli zone yapılandırmasını görmek istersek aşağıdaki komutu kullanabiliriz. Özel bir zone yapılandırmasını görmek isterseniz zone ismini –zone=zone_ismi parametresini kullanabilirsiniz.
root# firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources: 10.0.0.254/24
services: dhcpv6-client ssh https http ftp
ports:
masquerade: yes
forward-ports:
icmp-blocks:
rich rules:
Kalıcı olarak bir zone oluşturmak isterseniz aşağıdaki komutu kullanabilirsiniz. Örneğin, test adlı bir zone oluşturmak için,
root# firewall-cmd --permanent --new-zone=test
success
root# firewall-cmd --reload
success
Tamamen bir zone silmek isterseniz aşağıdaki komutu kullanabilirsiniz. Örneğin, oluşturulmuş olduğumuz test adlı zone ‘u silmek için,
root# firewall-cmd --permanent --delete-zone=test
success
Önceden tanımlanmış servisleri görüntülemek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --get-services
RH-Satellite-6 amanda-client bacula bacula-client dhcp dhcpv6 dhcpv6-client dns ftp high-availability http https imaps ipp ipp-client ipsec kerberos kpasswd ldap ldaps libvirt libvirt-tls mdns mountd ms-wbt mysql nfs ntp openvpn pmcd pmproxy pmwebapi pmwebapis pop3s postgresql proxy-dhcp radius rpc-bind samba samba-client smtp ssh telnet tftp tftp-client transmission-client vnc-server wbem-https
Aşağıdaki komut tüm zone ‘ların etkin listesini ve onlar hakkında detaylı bilgi verir.
root# firewall-cmd --list-all-zones
block
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
dmz
interfaces:
sources:
services: ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
drop
interfaces:
sources:
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
external
interfaces:
sources:
services: ssh
ports:
masquerade: yes
forward-ports:
icmp-blocks:
rich rules:
home
interfaces:
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
internal (active)
interfaces: eth1
sources:
services: dhcpv6-client ipp-client mdns samba-client ssh
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
public (default, active)
interfaces: eth0
sources: 10.0.0.254/24
services: dhcpv6-client ssh https http ftp
ports:
masquerade: yes
forward-ports:
icmp-blocks:
rich rules:
work
interfaces: eth2
sources:
services: dhcpv6-client ipp-client ssh
ports: 22/tcp
masquerade: yes
forward-ports: port=22:proto=tcp:toport=2222:toaddr=10.0.0.200
icmp-blocks:
rich rules:
rule family="ipv4" port port="22" protocol="tcp" accept
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# firewall-cmd --permanent --zone=test --add-source=192.168.100.0/24
success
root# firewall-cmd --reload
success
root# firewall-cmd --zone=test --list-all
test
interfaces: eth3
sources: 192.168.100.0/24
services:
ports:
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Bir zone içerisindeki kaynağı silmek istersek aşağıdaki komutu kullanabiliriz. Örneğin, test adlı zone içerisindeki ( 192.168.100.0/24 ) kaynağını silmek için,
root# firewall-cmd --permanent --zone=test --remove-source=192.168.100.0/24
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# firewall-cmd --zone=test --list-interfaces
eth3
Bir zone’a ağ arabirimi eklemek isterseniz aşağıdaki komutu kullanabilirsiniz. Örneğin, eth0 adlı ağ arabirimini test adlı zone’a eklemek için aşağıdaki birinci komut kullanılabilir. Kalıcı olarak eklemek isterseniz ikinci komutu kullanabilirsiniz.
root# firewall-cmd --zone=test --add-interface=eth0
success
root# firewall-cmd --permanent --zone=test --add-interface=eth0
success
NOT : NetworkManager ağ arabirimleri otomatik olarak zone’lara eklemektedir.
Bir zone içerisindeki kaynağı kalıcı olarak değiştirmek isterseniz aşağıdaki komutu kullanabilirsiniz. Ö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 kullanmanız yeterli olacaktır. Eğer kalıcı olarak ayarlamak istemezsek –permanent parametresini kaldırabilirsiniz.
root# firewall-cmd --permanent --zone=test --change-source=172.16.16.0/16
success
Bir zone alanına ait port numaralarını listelemek istersek aşağıdaki komutu kullanabilirsiniz.
root# firewall-cmd --zone=test --list-ports
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 belirtilemezse, varsayılan zone kullanılır.
root# firewall-cmd --zone=test --list-sources
172.16.16.0/16
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# firewall-cmd --zone=test --list-forward-ports
Servis Yönetimi
Örneğin, HTTP servisini sürekli belirtilen zone için izin vermek istersek aşağıdaki komutu kullanabiliriz. Daha sonra yaptığımız değişikliğin hemen aktif olmasını istersek ikinci komutu kullanabiliriz. Bu seçenek birden çok kez kullanılabilir.
root# firewall-cmd --permanent --zone=test --add-service=http
success
root# firewall-cmd --reload
success
root# firewall-cmd --zone=test --list-all
test
interfaces: eth3
sources: 172.16.16.0/24
services: dhcpv6-client ipp-client mdns samba-client ssh https http
ports:
masquerade: no
forward-ports:
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# firewall-cmd --permanent --zone=test --remove-service=http
success
Varsayılan olarak kullanılan zone içerisindeki servisleri listelemek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --list-services
dhcpv6-client ipp-client https http
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# firewall-cmd --zone=test --list-services
dhcpv6-client ipp-client mdns samba-client ssh https http
Bir zone’a ait port numaralarını listelemek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --zone=test --list-ports
443/tcp 22/tcp 80/udp
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# firewall-cmd --zone=test --list-forward-ports
Bir zone’a tanımlanmış icmp türlerini görüntülemek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --zone=test --list-icmp-blocks
Varsayılan olarak kullandığımız zone alanına yeni bir servis eklemek istersek aşağıdaki komutu kullanabiliriz. Kalıcı olarak eklemek için –permanent parametresini ekleyebiliriz.
root# firewall-cmd --new-service=ftp
success
Örneğin bir servisi sadece 10 saniye için varsayılan zone’a eklemek isterseniz aşağıdaki komutu kullanabilirsiniz. Daha sonra –list-all parametresini kullanarak servisin halen çalışıp/çalışmadığını test edebilirsiniz.
root# firewall-cmd --add-service=samba --timeout=10
success
Önceden tanımlanmış icmp türlerini görüntülemek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --get-icmptypes
destination-unreachable echo-reply echo-request parameter-problem redirect router-advertisement router-solicitation source-quench time-exceeded
Varsayılan olarak kullandığınız zone’a yeni bir icmp türünü eklemek isterseniz aşağıdaki komutu kullanabilirsiniz. Aşağıda –permanent parametresini kullanarak kuralın kalıcı olmasını sağladık.
root# firewall-cmd --permanent --add-icmp-block=destination-unreachable
success
root# firewall-cmd --reload
success
root# firewall-cmd --list-all
public (default, active)
interfaces: eth0
sources:
services: dhcpv6-client ssh http https ftp
ports:
masquerade: yes
forward-ports:
icmp-blocks: destination-unreachable
rich rules:
Örneğin, varsayılan zone’a eklemiş olduğumuz destination-unreachable imcp türünü silmek istersek aşağıdaki komutu kullanabiliriz. Aşağıda –permanent parametresini kullanarak kuralın kalıcı olmasını sağladık.
root# firewall-cmd --permanent --remove-icmp-block=destination-unreachable
success
Güvenlik Duvarı Servis Konfigürasyonu
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çerisinde 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="utf-8"?>
<service>
<short>HAProxy</short>
<description>HAProxy load-balancer</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# firewall-cmd --permanent --add-service=haproxy
success
root# firewall-cmd --reload
success
Varsayılan olarak kullanılan zone’a eklediğimiz haproxy servisini kaldırmak istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --permanent --remove-service=haproxy
success
root# firewall-cmd --reload
success
Port Yönetimi
Bir zone alanına kalıcı olarak 443/tcp portunu eklemek isterseniz aşağıdaki komutu kullanabilirsiniz. Örneğin, test adlı zone’a 443/tcp portunu ekleyelim. Kalıcı olarak eklemek istemezseniz –permanent parametresini kaldırabilirsiniz.
root# firewall-cmd --permanent --zone=test --add-port=443/tcp
success
root# firewall-cmd --reload
success
root# firewall-cmd --zone=test --list-all
test
interfaces: eth3
sources: 192.168.100.0/24
services: dhcpv6-client http ipp-client mdns samba-client ssh https
ports: 22/tcp 443/tcp
masquerade: no
forward-ports:
icmp-blocks:
rich rules:
Bir zone alanına eklediğiniz port numarasını silmek isterseniz aşağıdaki komutu kullanabilirsiniz. Eğer herhangi bir zone belirtilmez ise, varsayılan zone için uygulanacaktır.
root# firewall-cmd --permanent --zone=test --remove-port=443/tcp
success
Bir zone alanına eklediğimiz port numaralarını görmek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --zone=test --list-ports
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# firewall-cmd --permanent --zone=test --add-forward-port=port=22:proto=tcp:toport=3758
success
root# firewall-cmd --reload
success
root# firewall-cmd --zone=test --list-all
test
interfaces: eth3
sources: 192.168.100.0/24
services: dhcpv6-client http ipp-client mdns samba-client ssh https
ports: 22/tcp 443/tcp
masquerade: no
forward-ports: port=22:proto=tcp:toport=3758:toaddr=
icmp-blocks: destination-unreachable
rich rules:
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# firewall-cmd --permanent --zone=test --add-forward-port=port=22:proto=tcp:toport=3758:toaddr=192.168.100.50
success
Belirtilen zone için kaynağı herhangi biri olan 80 portuna gelen tüm istekleri 192.168.100.50 ip adresinin 9999 portuna yönlendir.
root# firewall-cmd --permanent --zone=test --add-forward-port=port=80:proto=tcp:toport=9999:toaddr=192.168.100.50
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# firewall-cmd --permanent --zone=test --add-forward-port=port=53:proto=udp:toport=3450
success
Yukarıdaki kullandığımız komutların içerisinde bulunan toaddr= parametresini kullanarak içerideki istediğimiz bir ip adresine port yönlendirme yapabiliriz. Belirtilen zone için 21 portuna gelen tüm istekleri içerideki 192.168.100.100 ip adresinin 3450 portuna yönlendir.
root# firewall-cmd --permanent --zone=test --add-forward-port=port=21:proto=udp:toport=3450:toadddr=192.168.100.100
Bir zone alanına eklediğiniz port yönlendirmeyi silmek isterseniz aşağıdaki komutu kullanabilirsiniz. Silmek istediğimiz yönlendirme kurallarını görüntülemek istersek aşağıdaki birinci komutu kullanabiliriz, daha sonra silmek istediğimiz kuralı ikinci komutu kullanarak silebiliriz. Benim silmek istediğim kurallar test adlı zone içerisinde yer almaktadır.
root# firewall-cmd --zone=test --list-all
test
interfaces: eth3
sources: 192.168.100.0/24
services: dhcpv6-client http ipp-client mdns samba-client ssh https
ports: 22/tcp 443/tcp
masquerade: no
forward-ports: port=80:proto=tcp:toport=9999:toaddr=192.168.100.50
port=22:proto=tcp:toport=3758:toaddr=192.168.100.50
icmp-blocks: destination-unreachable
rich rules:
root# firewall-cmd --permanent --zone=test --remove-forward-port=port=80:proto=tcp:toport=9999:toaddr=192.168.100.50
success
root# firewall-cmd --reload ; firewall-cmd --zone=test --list-all
success
test
interfaces: eth3
sources: 192.168.100.0/24
services: dhcpv6-client http ipp-client mdns samba-client ssh https
ports: 22/tcp 443/tcp
masquerade: no
forward-ports: port=22:proto=tcp:toport=3758:toaddr=192.168.100.50
icmp-blocks: destination-unreachable
rich rules:
Güvenlik Duvarı Kural Yönetimi
FirewallD ile kural yazımı örnekleri –direct ve –rich-rule parametrelerini kullanarak anlatacağım.
–direct : Kullanıcıların Iptables konseptini temel seviyede öğrenmesi için gereklidir. Kullanılması pek önerilmez.
–rich-rule : 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 girilmiş. Bu örnekte ise kaynağı herhangi bir ip adresinden gelen ve kaynağı herhangi bir ip adresine giden 22. (ssh) portuna erişime izin verilmiş.
root# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 22 -j ACCEPT
success
Bu örneğimizde ise kaynağı herhangi bir ip adresinden gelen ve kaynağı herhangi bir ip adresine giden hedefi 9000 portuna erişimini yasakla.
root# firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 9000-j DROP
success
Eklemiş olduğumuz direct kurallarını görüntülemek istersek aşağıdaki komutu kullanabiliriz.
root# firewall-cmd --zone=test --direct --get-all-rules
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 direct kuralını silmek istersek aşağıdaki gibi bir komut kullanabiliriz. Varsayılan zone için uygulanacaktır.
root# firewall-cmd --direct --remove-rule 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. Burdaki kural ‘da 192.168.0.0/24 network içerisinde bilgisayarlar 80 portuna erişebilecekler.
root# firewall-cmd --add-rich-rule '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# firewall-cmd --permanent --add-rich-rule '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# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="https" accept'
success
Aynı şekilde bir network aralığı için vnc-server servisine izin vermek istersek aşağıdaki komut kullanılabilir.
root# firewall-cmd --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" service name="vnc-server" 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ş. Burada –permanent parametresini ekleyerek kuralın kalıcı olmasını sağladık.
root# firewall-cmd --permanent --zone=test --add-rich-rule '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 komutu kullanabiliriz. Bu kuralı özel bir zone için eklemek istersek –zone=zone_ismi parametresini kullanabiliriz. Bu kuralı test adlı zone için uygulayalım.
root# firewall-cmd --permanent --zone=test --add-rich-rule 'rule family="ipv4"source address="192.168.100.50/24" service name="ssh" drop'
success
veya aşağıdaki gibi bir komut kullanarak bu ip adresinin ssh (22) servisini kullanmasını engelle aynı zamanda geri ona hata mesajı döndür diyebiliriz. 🙂
root# firewall-cmd --permanent --zone=test --add-rich-rule 'rule family="ipv4"source address="192.168.100.50/24" service name="ssh" reject'
success
Dikkat ettiyseniz yukarıdaki kurallarda hep 22 vb.. port numaraları veya ssh gibi kelimeler kullanılmış. Siz bunu isterseniz ssh veya karşılığı olan 22 port numarasını yazın iki seçenek aynı anlama geliyor. Hangisi kolayınıza geliyorsa onu kullanabilirsiniz.
root# firewall-cmd --permanent --zone=test --add-rich-rule 'rule family="ipv4"source address="192.168.100.50/24" service name="22" reject'
success
Eklemiş olduğumuz kuralları listelemek istersek aşağıdaki komutu kullanabiliriz. Dikkat ettiyseniz tüm kuralları test adlı zone için yazmıştık ve aşağıdaki komut ise belirttiğimiz zone içerisindeki kuralları gösterir.
root# firewall-cmd --zone=test --list-all
test
interfaces: eth3
sources: 192.168.100.0/24
services: dhcpv6-client http ipp-client mdns samba-client ssh https
ports: 22/tcp 443/tcp
masquerade: no
forward-ports: port=22:proto=tcp:toport=3758:toaddr=192.168.100.50
icmp-blocks: destination-unreachable
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" dropt'
Peki eklediğimiz bir kuralı nasıl silebiliriz. Aşağıdaki komutu kullanarak test adlı zone için yazmış olduğumuz kuralı silebiliriz.
root# firewall-cmd --permanent --zone=test --remove-rich-rule='rule family="ipv4" source address="192.168.0.0/24" service name="http" accept'
success
Grafik Arabirim (GUI) ile Güvenlik Duvarı Yönetimi
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önetebilmenizi 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) kurulu olması gerekiyor. Grafik arayüz (desktop) kurulumunu yazının ilerleyen kısımlarında anlatacağım.
Varsayılan olarak Centos 7 ve üzeri sistemlerde artık kurulu gelecektir fakat alt sürümlerinde olmayabilir. Bu durumda aşağıdaki komutu kullanarak grafik yönetim aracını sisteminize kurabilirsiniz.
root# yum update && yum upgrade -y
root# yum install firewall-config -y
Kurulum bittikten sonra aşağıdaki komut yardımıyla firewalld grafik arayüz programını çalıştırabilir ve firewalld güvenlik duvarını bu araç yardımıyla yönetebilirsiniz.
root# firewall-config
Ö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ında ve 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 (firewall-config) 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 yeni bir tane firewall kuralı oluşturuyoruz.
ardından yapacağınız işleme göre seçenekleri belirlemeniz gerekir. Benim örneğimde 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şikleri kaydediyoruz.
NOT : Configuration = Permanent seçilerek yapılacak ayarların kalıcı olarak ayarlanmasını sağlayabilirsiniz. Aksi takdirde sistem yeniden başlatılana kadar sürecektir.
NOT : Ayarların aktif olması için Options > Reload Firewalld butonuna tıklayabilirsiniz. Aynı zamanda firewall-cmd –reload komutunu kullanabilirsiniz.
Grafik Arayüz Programı ile Port Yönlendirmek
Bu örneğimde ise grafik arayüz programı ile port yönlendirme yer alıyor. İlk önce Port Forwarding sekmesine girilir ardından Add butonuna tıklayarak yeni bir kural oluşturulur. Aşağıdaki kural ise 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ıklayabilir aynı zamanda firewall-cmd –reload komutunu kullanabilirsiniz.
Grafik Arayüz Programı ile Varsayılan Zone Belirtmek
Varsayılan olarak kullanılan herhangi bir zone’u bir başka 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 arayüz 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ılarını ftp servisi için her 1 dakika için audit ile loglama yap.
root# firewall-cmd --add-rich-rule='rule service name="ftp" audit limit value="1/m" accept'
root# firewall-cmd --add-rich-rule='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# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.2" accept'
4. Kaynağı 192.168.2.3 ip adresinin tüm bağlantılarını engelle aynı zamanda geriye hata mesajı döndür.
root# firewall-cmd --add-rich-rule='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# firewall-cmd --add-rich-rule='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üğümü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ı anlık olarak izleyebilirsiniz.
root# tail -f /var/log/firewalld
2015-08-24 12:09:45 DEBUG2: firewall.core.ipXtables.ip6tables: /sbin/ip6tables -t mangle -P FORWARD ACCEPT2015-08-24 12:09:45 DEBUG1: PanicModeDisabled()
2015-08-24 12:09:49 DEBUG1: zone.getZones()
2015-08-24 12:11:19 DEBUG1: config.getServiceByName('bacula')
2015-08-24 12:11:19 DEBUG1: config.service.2.getSettings()
2015-08-24 12:11:19 DEBUG1: config.service.2.Get('org.fedoraproject.FirewallD1.config.service', 'default')
2015-08-24 12:11:19 DEBUG1: config.service.2.Get('org.fedoraproject.FirewallD1.config.service', 'builtin')
2015-08-24 12:11:25 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 tftp-log ismi ile oluştur denmiş.
root# firewall-cmd --add-rich-rule='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 ssh-log ismi ile oluştur denmiş.
root# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.100.50" service name="ssh" log prefix="ssh-log" level="info" limit value="1/m" drop'
Auditd
Aşağıdaki kuralda ise ftp servisine izin verilmiş ve her 1 dakika için auditd ile loglama yap denmiş.
root# firewall-cmd --add-rich-rule='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 ssh-log ismi ile oluştur denmiş.
root# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.4" service name="ssh" audit prefix="ssh-log" 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 hata kodları vardır. Örneğin (403 Forbbiden gibi gibi) hata kodları vardır. Firewalld güvenlik duvarına ait hata mesajları ve karşısındaki 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 |
—————————— ————-
ZONE_ALREADY_SET | 16 |
—————————— ————-
UNKNOWN_INTERFACE | 17 |
….
NOT : Daha fazlası içi 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 doğ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
–reload : Bu parametre değiştirilen ayarların hemen aktif olmasını sağlar.
–permanent : Bu parametre ise bir kuralı kalıcı olarak ayarlanmasını sağlar.
/usr/lib/firewalld/services : Bu dizin altında firewalld servisleri bulunuyor.
/usr/lib/firewalld/zones : Bu dizin içerisinde zone’lar bulunmaktadır.
/usr/lib/firewalld/icmptypes : Bu dizin içerisinde icmp türleri yer almaktadır.
/etc/firewalld/services : Bu dizin içerisine yeni servisler eklenebilir.
/etc/firewalld/firewalld.conf : Bu dosya zone’ların bilgilerini barındırır ve varsayılan hangi zone kullanılıyor onu gösterir.
firewall-cmd –get-zones : Tüm kullanılabilir zone’ları listeler.
firewall-cmd –get-services : Önceden tanımlanmış servisleri listeler.
firewall-cmd –get-icmptype : Önceden tanımlanmış icmp türlerini listeler.
firewall-cmd –get-default-zone : Varsayılan olarak kullanılan zone’u gösterir.
firewall-cmd –get-default-zone=test : Test adlı zone’u varsayılan olarak ayarlar. Yani varsayılan zone yapar.
firewall-cmd –get-active-zones : Aktif kullanılan zone’ları listeler.
firewall-cmd –get-zone-of-interface=eth0 : Hangi zone alanının eth0 ağ arabirimi ile ilişkili olduğunu gösterir.
firewall-cmd –list-all-zones : Tüm zone’ları listeler ve onlar hakkında birçok bilgi verir.
firewall-cmd –panic-on : Acil durumlarda tüm ağ trafiğini engeller. Aynı zamanda kapatmak için ise firewall-cmd –panic-off komutunu kullanabilirsiniz.
firewall-cmd –state : Güvenlik duvarının durumunu kontrol etmenizi sağlar.
firewall-cmd –zone=test –list-interfaces : Bir zone’a bağlı ağ arabirimlerini listeler.
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# iptables-save > firewalld_rules_ipv4
root# iptables-save > 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öyleyebiliriz. 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 ardından CTRL+O kombinasyonuna bastıktan sonra enter tuşuna basarak kaydedilir ardından CTRL+X kombinasyonuna basarak dosyadan çıkılır.
root# touch script_dosyam
root# nano script_dosyam
#!bin/bash
W=$(date +"%m-%d-%Y")
FILE="backup.$NOW.tar.gz"
echo "Bekleyiniz ! Dosyalar sıkıştırılıyor..."
# rest of script
tar cvf /root/backup.$NOW.tar.gz /etc/firewalld /var/log/firewalld
daha sonra aşağıdaki komut kullanılarak script dosyası test edilir.
root# bash script_dosyam
Bekleyiniz ! Dosyalar sıkıştırılıyor...
/etc/firewalld/
/etc/firewalld/firewalld.conf
/etc/firewalld/icmptypes/
/etc/firewalld/lockdown-whitelist.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ırıp yedek almayı 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 denmiş. Ayarlar yapıldıktan sonra ayarlar kaydedilerek çıkılır.
root# crontab -e
* 12 * * * /bin/bash /root/script_dosyam
Yedekten Geri Dönme
FirewallD kurallarını yedeklediğiniz dosyanın adını aşağıdaki gibi belirterek yedekten geri dönebilirsiniz.
root# iptables-restore < firewalld_rules_ipv4
root# iptables-restore < firewalld_rules_ipv6
Daha fazla bilgi için man sayfasına bakabilirsiniz.
Leave a Reply