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:
Firewalld ile otomatik olarak gelen dokuz adet zone bulunmaktadır:
Kullanıma başlayabilmemiz için bazı kontroller yapalım:
Firewalld sistemimizde kurulu mu kontrol edelim:
Sistem yeniden başlatılırsa servis başlayacak mı kontrol edelim:
1) Eğer firewalld sistemimizde kurulu değil ise kurulum için:
(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:
Bir ağ arayüzünü, belirli bir bölgeye atamak istersek:
Eğer bir ağ arayüzünü, belirlenen bölgeden kaldırmak istersek:
Eklenilen bir kaynağı, bir bölgeden kaldırmak istersek:
Bir servisi, bir bölgeden kaldırmak istersek:
Bir portu, bir bölgeden kaldırmak istersek:
Belirli bir porta gelen trafiği, başka bir adrese ve bu adresin portuna yönlendirmek istersek:
Belirli bir kaynaktan gelen trafiğin, belirli servislere veya portlara ulaşmasına izin vermek istiyorsak(add-rich-rule):
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):
Firewalld gelen trafiğin hangi bölgelere gitmesi gerektiğini belirlerken sırasıyla iki adet soru sorar:
- Paketin geldiği kaynak(source) bir bölgede tanımlı mı? (Eğer tanımlıysa bu bölgenin kurallarını kullanır.)
- 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.)
Firewalld ile otomatik olarak gelen dokuz adet zone bulunmaktadır:
- 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.
- 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.
- work: İş ağımız için kullanabileceğimiz bir bölgedir. Varsayılan olarak "ssh","mdns" ve "dhcpv6-client" servislerinin trafiğine izin verir.
- 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.
- 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.
- 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.
- 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.
- 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.
- 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.
Kullanıma başlayabilmemiz için bazı kontroller yapalım:
Firewalld sistemimizde kurulu mu kontrol edelim:
yum list installed | grep firewalldEğer kurulu ise çalışıyor mu diye bakalım:
systemctl status firewalldEğer "running" çıktısı alıyorsak servisimiz çalışıyor demektir.
veya
firewall-cmd --stat
Sistem yeniden başlatılırsa servis başlayacak mı kontrol edelim:
systemctl list-unit-files | grep firewalldEğ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 -y2) Sistem yeniden başlarsa otomatik olarak çalışabilecek hale getirelim ve servisi başlatalım:
systemctl enable firewalldKurulum sonrasında bütün sistem hakkında bilgi almak için:
systemctl start firewalld
firewall-cmd --list-all #Kullanılan bütün sistem hakkında bilgi verir.(Diğer komutlara "man firewall-cmd" veya "firewall-cmd --help" yazarak bakabiliriz.)
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.
(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 firewalldVarsayılan bölgeyi değiştirmek için:
veya
firewall-cmd --reload
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=eth0Bu 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=eth0Bir ağ arayüzünün, hangi bölgeyle bağlantılı olduğunu öğrenmek istersek:
firewall-cmd --get-zone-of-interface=eth0Belirli kaynaklar ile ilişki bölgeleri öğrenmek istersek:
firewall-cmd -get-zone-of-source=10.0.0.0/24Yeni bir bölge oluşturmak istersek:
firewall-cmd --permanent --new-zone=gbdBir kaynağı, bölgeye eklemek istersek:
firewall-cmd --permanent --zone=gbd --add-source=10.0.0.0/24Bu 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/24Bir servisi, bir bölgeye eklemek istersek:
firewall-cmd --permanent --zone=public --add-service=postgresqlBu 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=mysqlBir portu, bir bölgeye eklemek istersek:
firewall-cmd --permanent --zone=public --add-port=5432/tcpBu 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/tcpBelirli 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=5410Bu 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.5Bu 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=denemeEğ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