Makinemizin güvenlik duvarı(firewall) olarak kullanabileceğimiz bu servis, makinemize gelen trafiği, istediğimiz şekilde yönlendirmemiz veya istemediğimiz bağlantılardan gelen trafiğin makinemizdeki servislere veya portlara erişimini engellememiz için çok rahat kullanabileceğimiz bir kullanım sunuyor. Iptables'ın yerini alabilecek olan bu servisin çok kullanışlı bir kaç özelliği bulunuyor.
Başlangıç olarak, Firewalld ile birlikte bölge(zone) kavramı geliyor. Bu kavram, bütün gelen(incoming) trafikleri varsayılan(default) kuralları olan belirli bölgelere aktarır. Bu bölgelere giden trafiğin hangi servisleri kullanabileceği ve hangi portları kullanabileceği gibi bir çok kural(rule) mevcut. Aynı zamanda belirlenen ağ arayüzünden(network interface) gelen trafiğin, belirli bir bölgeye gitmesini ve buradaki kurallara uygunsa izin vermesi, değilse reddetmesi için ayarlayabiliriz.

Firewalld gelen trafiğin hangi bölgelere gitmesi gerektiğini belirlerken sırasıyla iki adet soru sorar:
  1. Paketin geldiği kaynak(source) bir bölgede tanımlı mı? (Eğer tanımlıysa bu bölgenin kurallarını kullanır.)
  2. Paketin geldiği ağ arayüzü(network interface) için tanımlanmış bir bölge var mı? (Eğer varsa bu bölgenin kurallarını kullanır.)
Eğer yukarıdaki sorulara "hayır" cevabını alıyorsa "public" bölgesinin kuralları geçerli olur.

Firewalld ile otomatik olarak gelen dokuz adet zone bulunmaktadır:
  1. public: Varsayılan bölgedir. Sisteme yeni eklenen her ağ arayüzü bu bölgeyi kullanır. Varsayılan olarak, sadece ağ arayüzünden gelen "ssh","mdns" ve "dhcpv6-client" servislerinin trafiğine izin verir.
  2. home: Ev ağımız için kullanabileceğimiz bir bölgedir. Varsayılan olarak "ssh","mdns","samba-client" ve "dhcpv6-client" servislerinin trafiğine izin verir.
  3. work: İş ağımız için kullanabileceğimiz bir bölgedir. Varsayılan olarak "ssh","mdns" ve "dhcpv6-client" servislerinin trafiğine izin verir.
  4. dmz: Halka açık fakat ağdaki diğer kullanıcıların yetkilerinin sınırlı olduğu durumlar için tercih edebileceğimiz bir bölgedir.  Varsayılan olarak sadece "ssh" servisinin trafiğine izin verir.
  5. internal: İç ağdaki servislerin, birbiriyle iletişim kurmasını istediğimizde kullanabileceğimiz bir bölgedir. Varsayılan olarak "ssh","mdns","samba-client" ve "dhcpv6-client" servislerinin trafiğine izin verir.
  6. external: Dış ağdaki(internet ağı) servislerle kendi servislerimizi iletişime geçirmek istediğimizde kullanabileceğimiz bölgedir. Varsayılan olarak sadece "ssh" servisinin trafiğine verir. Aynı zamanda "masquerade" açıktır.
  7. trusted: Varsayılan olarak hiç bir servis,port ve kaynak tanımlı değildir. Bu bölgeye eklenen servislere ve portlara gelecek olan paketlere, aynı zamanda eklenen kaynaklardan gelecek olan paketlere izin verir.
  8. block: Varsayılan olarak hiç bir servis,port ve kaynak tanımlı değildir. Bu bölgeye eklenen servislere ve portlara gelecek olan trafik, aynı zamanda bu bölgeye eklenen kaynaklardan gelecek olan trafik engellenir.  Bu sırada karşı tarafa IPv4 için "icmp-host-prohibited" mesajı, IPv6 için ise "icmp6-adm-prohibited" mesajı gönderilir.
  9. drop: Varsayılan olarak hiç bir servis,port ve kaynak tanımlı değildir. Bu bölgeye eklenen servislere ve portlara gelecek olan trafik, aynı zamanda bu bölgeye eklenen kaynaklardan gelecek olan trafik engellenir.  Bu seçenekte ise karşı tarafa Pv4 için "icmp-host-prohibited" mesajı, IPv6 için ise "icmp6-adm-prohibited" mesajı gönderilmez.
(Masquerade: Bir ağ arayüzüne yönlendirilen paketlerin(Paketlerin "eth0" arayüzünden geldiğini düşünelim.), o ağ arayüzünden çıkış yaptıktan sonra(Çıkış yapılan arayüzü "eth1" olarak düşünelim.) kaynak adreslerinin, çıkış yaptığı ağ arayüzü olarak gösterilmesine denir.)

Kullanıma başlayabilmemiz için bazı kontroller yapalım:

Firewalld sistemimizde kurulu mu kontrol edelim:
yum list installed | grep firewalld
Eğer kurulu ise çalışıyor mu diye bakalım:
systemctl status firewalld
veya
firewall-cmd --stat
Eğer "running" çıktısı alıyorsak servisimiz çalışıyor demektir.

Sistem yeniden başlatılırsa servis başlayacak mı kontrol edelim:
systemctl list-unit-files | grep firewalld
Eğer "enable" ise sistem başladığında otomatik olarak servis başlatılacak demektir.
 
  • Eğer ilk kontrolde bir çıktı almıyorsak, kurulum yapmamız gerekmektedir.(1)
  • Eğer ikinci kontrolde "not running" çıktısı alıyorsak, servisimizi başlatmamız gerekmektedir.(2)
  • Eğer üçüncü kontrolde "disabled" çıktısı alıyorsak, sistemimiz yeniden başladığında servisimiz otomatik olarak başlamayacaktır. Bu ayarı "enable" yapmamız gerekmektedir.(2) 

1) Eğer firewalld sistemimizde kurulu değil ise kurulum için:
yum install firewalld -y
2) Sistem yeniden başlarsa otomatik olarak çalışabilecek hale getirelim ve servisi başlatalım:
systemctl enable firewalld
systemctl start firewalld
Kurulum sonrasında bütün sistem hakkında bilgi almak için:
firewall-cmd --list-all   #Kullanılan bütün sistem hakkında bilgi verir.
firewall-cmd --list-all-zones   #Bütün bölgeler hakkında bilgi verir.
firewall-cmd --list-interfaces   #Kullanılan ağ arayüzlerini gösterir.
firewall-cmd --list-port   #Kullanılan portları gösterir
firewall-cmd --list-servies   #Kullanılan tüm servisleri gösterir
firewall-cmd --get-services   #Kullanılabilecek tüm servisleri gösterir.
firewall-cmd --get-zones   #Kullanılabilecek tüm bölgeleri gösterir
firewall-cmd --get-default-zone   #Varsayılan bölgeyi gösterir.
firewall-cmd --get-active-zones   #Aktif bölgeleri gösterir.
(Diğer komutlara "man firewall-cmd"  veya "firewall-cmd --help" yazarak bakabiliriz.)

(Aşağıdaki komutlarda kullanacağımız "--permanent" parametresi, servis yeniden başlarsa veya "reload" edilirse bu ayarın kalıcı olmasını sağlar. Eğer bu parametreyi kullanmazsak sistemin "restart" veya "reload" edilmesi durumunda bu ayar uygulanmadan önceki haline döner.)

Bazı ayarların geçerli olması için "reload" atmamız gerekebilir. Bunun için iki yöntem vardır:
systemctl reload firewalld
veya
firewall-cmd --reload 
Varsayılan bölgeyi değiştirmek için:
firewall-cmd --set-default-zone=home
(Bu komutta "--permanent" kullanmamıza gerek yoktur. Varsayılan bölge ayrıca "/etc/firewalld/firewalld.conf" dosyasından değiştirilebilir.)

Bir ağ arayüzünü, belirli bir bölgeye atamak istersek:
firewall-cmd --permanent --zone=internal --add-interface=eth0
Bu komut ile "eth0" ağ arayüzünden gelen tüm trafiğin, "internal" bölgesinindeki kurallara uymasını sağlıyoruz.

Eğer bir ağ arayüzünü, belirlenen bölgeden kaldırmak istersek:
firewall-cmd --permanent --zone=internal --remove-interface=eth0
Bir ağ arayüzünün, hangi bölgeyle bağlantılı olduğunu öğrenmek istersek:
firewall-cmd --get-zone-of-interface=eth0
Belirli kaynaklar ile ilişki bölgeleri öğrenmek istersek:
firewall-cmd -get-zone-of-source=10.0.0.0/24
Yeni bir bölge oluşturmak istersek:
firewall-cmd --permanent --new-zone=gbd
Bir kaynağı, bölgeye eklemek istersek:
firewall-cmd --permanent --zone=gbd --add-source=10.0.0.0/24
Bu komut ile "10.0.0.0/24" kaynağından gelen tüm trafiğin "gbd" bölgesindeki kurallara uymasını sağlıyoruz.

Eklenilen bir kaynağı, bir bölgeden kaldırmak istersek:
firewall-cmd --permanent --zone=gbd --remove-source=10.0.0.0/24
Bir servisi, bir bölgeye eklemek istersek:
firewall-cmd --permanent --zone=public --add-service=postgresql
Bu komut ile "postgresql" servisine gelen trafiğin, "postgresql" servisine tanımlı tüm ayarlara bağlantısını, "public" alanının kurallarıyla kullanmasını sağlıyoruz. 

Bir servisi, bir bölgeden kaldırmak istersek:
firewall-cmd --permanent --zone=public --remove-service=mysql
Bir portu, bir bölgeye eklemek istersek:
firewall-cmd --permanent --zone=public --add-port=5432/tcp
Bu komut ile "5432/tcp" portuna gelen bağlantıların, "public" alanının kurallarına uymasını sağlıyoruz. (Eğer "udp" kullanılıyorsa "tcp" yerine "udp" yazılabilir.)

Bir portu, bir bölgeden kaldırmak istersek:
firewall-cmd --permanent --zone=public --remove-port=3306/tcp
Belirli bir porta gelen trafiği, başka bir porta yönlendirmek istersek:
firewall-cmd --permanent --zone=public --add-forward-port=port=5432:proto=tcp:toport=5410
Bu komut "5432" portuna gelen "tcp" trafiğini "5410" portuna yönlendirir. Bu işlem "public" alanına gelen tüm trafik için geçerlidir.

Belirli bir porta gelen trafiği, başka bir adrese ve bu adresin portuna yönlendirmek istersek:
firewall-cmd --permanent --zone=public --add-forward-port=port=5432:proto:tcp:toport=5410:toaddr=10.0.0.5
Bu komut "5432" portuna gelen "tcp" trafiğini "10.0.0.5" adresinin, "5410" portuna yönlendirir.

Belirli bir kaynaktan gelen trafiğin, belirli servislere veya portlara ulaşmasına izin vermek istiyorsak(add-rich-rule):
firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" source address="10.0.0.0/24" service name="postgresql" accept'
Bu komut ile "public" bölgesine, "ipv4" ile "10.0.0.0/24" kaynağından, "postgresql" servisine gelen trafiğe izin verebiliriz(accept). Eğer bir porta izin vermek istiyorsak "postgresql" yerine istediğimiz port numarasını yazabiliriz.

Eğer izin vermek yerine daha farklı işlemler uygulamasını istiyorsak bunun için başka parametreler mevcut:

accept: Trafiği kabul et.
reject: Trafiği reddet ve reddedildiği ile ilgili bilgi gönder.
drop: Trafiği reddet ama karşı tarafa bilgi verme.

Eğer bir "rich-rule" kaldırmak istersek(remove-rich-rule):
firewall-cmd --permanent --zone=public --remove-rich-rule='rule family="ipv4" source address="10.0.0.0/24" service name="postgresql" accept'
Yeni bir servis oluşturmak istersek:
firewall-offline-cmd --permanent --new-service=deneme
Eğer oluşturduğumuz servisin ayarlarını düzenlemek istersek:
firewall-cmd --permanent --service=myservice --set-description=description firewall-cmd --permanent --service=myservice --set-short=description
firewall-cmd --permanent --service=myservice --add-port=portid[-portid]/protocol
firewall-cmd --permanent --service=myservice --add-protocol=protocol
firewall-cmd --permanent --service=myservice --add-source-port=portid[-portid]/protocol
firewall-cmd --permanent --service=myservice --add-module=module
firewall-cmd --permanent --service=myservice --set-destination=ipv:address[/mask]

Bu eklenen servisler "/etc/firewalld/services/" dizininde ."XML" formatında saklanır. Eğer istersek bu ayarları manuel olarak bir editörle düzenleyebiliriz.

(Detaylı bilgi için Firewalld'nin kendi websitesinde döküman mevcut: Firewalld | How to add a service)
 

No comments

Add Comment

E-Mail addresses will not be displayed and will only be used for E-Mail notifications.

To prevent automated Bots from commentspamming, please enter the string you see in the image below in the appropriate input box. Your comment will only be submitted if the strings match. Please ensure that your browser supports and accepts cookies, or your comment cannot be verified correctly.
CAPTCHA

Standard emoticons like :-) and ;-) are converted to images.
Enclosing asterisks marks text as bold (*word*), underscore are made via _word_.

Submitted comments will be subject to moderation before being displayed.