Een firewall zou op geen enkele Linux server mogen ontbreken. Ondanks dat firewalling geïmplementeerd wordt door de Linux kernel netfilter routines, zijn er nogal wat verschillen in de manier waarop de distributies firewalling implementeren. In dit artikel aandacht voor het relatief nieuwe firewalld dat voor dit doel op Red Hat en gerelateerde distributies gebruikt wordt. 

Voordat we ingaan op de eigenaardigheden van firewalld, is het de moeite waard om te kijken naar de oorzaken van het gebrek aan standaardisatie op het gebied van beheer van Linux firewalls. De paradoxale situatie is namelijk dat er wel degelijk een standaard interface is voor het beheer van firewall regels. Deze wordt geboden door het iptables commando. Iptables biedt een gestructureerd commando dat het mogelijk maakt om alle mogelijke firewall instellingen te regelen, maar tegelijk is het ook een commando waarmee niet iedereen even gemakkelijk overweg kan.

 Voor een getrainde en geroutineerde Linux gebruiker heeft een commando als iptables -I INPUT -s 10.0.0.0/24 -p tcp –dport 22 -j DROP natuurlijk weinig geheimen, maar vooral beginnende gebruikers hebben moeite met het gebruik van dergelijke wat ingewikkelder commando’s. Om die reden is een grote diversiteit aan firewall beheersinterfaces ontstaan. Ubuntu doet het met UFW, SUSE heeft SUSEfirewall en Red Hat heeft sinds kort firewalld.

 

 De firewalld service is geïntroduceerd om firewalling eenvoudiger te maken. Om dit te doen, biedt het commando twee beheersinterfaces. Met firewall-config kan eenvoudig een firewall bij elkaar geklikt worden vanuit een grafische interface. Met firewall-cmd doe je hetzelfde vanaf de command line. In dit artikel focussen we op het gebruik van firewall-cmd.

 

 Basiselementen

Alle regels die aangemaakt worden met firewall-cmd worden geïmplementeerd via de firewalld service. Deze service is standaard geactiveerd na een installatie van Red Hat of verwanten distributies sinds Red Hat Enterprise Linux 7 en Fedora 18. De regels worden aangemaakt met firewall-cmd. Om het werken met firewall-cmd eenvoudig te maken, maakt het commando gebruik van een aantal basis bouwblokken:

  • ·        Zone: netwerkinterfaces worden toegekend aan een zone. Standaard zones zijn beschikbaar om het eenvoudig te maken een interface te beheren. Denk daarbij aan zones zoals public, private en dmz.
  • ·         Service: firewalld werkt met services. Dit zijn xml bestanden waarin een aantal poorten gedefinieerd kan worden dat door firewalld beheerd moet worden. Listing 1 toont de inhoud van het bestand /usr/lib/firewalld/services/high-availability.xml, waarin je ziet hoe vanuit één service bestand meerdere poorten geopend kunnen worden.
  • ·         Ports: in het geval het nodig is om afzonderlijke poorten te beheren, gaat dat via de ports interface.

 

 

  

[root@server1 services]# cat high-availability.xml

<?xml version=”1.0″ encoding=”utf-8″?>

<service>

  <short>Red Hat High Availability</short>

  <description>This allows you to use the Red Hat High Availability (previously named Red Hat Cluster Suite). Ports are opened for corosync, pcsd, pacemaker_remote and dlm.</description>

  <port protocol=”tcp” port=”2224″/>

  <port protocol=”tcp” port=”3121″/>

  <port protocol=”udp” port=”5404″/>

  <port protocol=”udp” port=”5405″/>

  <port protocol=”tcp” port=”21064″/>

</service>

 Listing 1: Voorbeeld van een service bestand

 

 

Naast deze basis bouwblokken kent firewalld ook nog de rich rules. De reden voor het bestaan van rich rules is eenvoudig te begrijpen. Firewalld is namelijk ontworpen om eenvoudig te zijn en met deze eenvoud gaat nogal wat geavanceerde functionaliteit verloren. Rich rules zijn bedoeld om geavanceerde functionaliteit toch weer te kunnen introduceren.

 Laten we eens kijken naar wat voorbeelden. Om te beginnen is er het commando firewall-cmd –list-all (zie listing 2). Dit commando laat zien wat er op dit moment allemaal geconfigureerd is.

 

  

[root@server1 services]# firewall-cmd –list-all

public (default, active)

  interfaces: ens3

  sources:

  services: dhcpv6-client samba ssh

  ports: 3260/tcp

  masquerade: no

  forward-ports:

  icmp-blocks:

  rich rules:

Listing 2: Gebruik firewall-cmd –list-all om de huidige configuratie te bekijken.

 

 

De eenvoudigste manier om bepaalde services open te zetten, is door het toevoegen van een service. Dit doe je met de opdracht firewall-cmd –add-service. Om te weten welke services beschikbaar zijn, tik je eerst firewall-cmd –get-services. Op basis van deze informatie kan je dan een commando tikken als bijvoorbeeld firewall-cmd –add-service http. Hierbij moet je echter even opletten.

 Firewalld maakt onderscheid tussen de default configuratie en de run-time configuratie. Als je een commando gebruikt, zoals firewall-cmd –add-service http of firewall-cmd –add-port 3260/tcp, dan voeg je de betreffende service of poort toe aan de runtime configuratie. Deze configuratie zal bij een herstart van het firewalld proces verloren gaan. Wil je ervoor zorgen dat de configuratie ook na een herstart nog beschikbaar is? Voeg dan de parameter –permanent toe aan alle firewall-cmd commando’s die je gebruikt.

 

 Naast het werken met services en ports, heeft firewalld nog een aantal andere opties. Zo kan je eenvoudig verkeer filteren dat afkomstig is van een specifiek IP adres door gebruik te maken van de aanvullende optie –source, en is het ook vrij eenvoudig IP masquerading (NAT) aan te zetten door de optie –masquerade te gebruiken. Gebruik eenvoudigweg firewall-cmd –zone=external –add-masquerade om ervoor te zorgen dat al het verkeer dat uitgaat op de externe zone door middel van IP masquerading naar buiten gaat. Meer is er niet nodig om te zorgen dat IP adressen uit de private address range met een publiek IP adres naar buiten gaan. Denk er na bewezen succes nog wel even over na om het commando te herhalen met de optie –permanent.

 

 Geavanceerd gebruik

Als je enige ervaring hebt opgedaan met firewall-cmd, zal je erachter komen dat het commando een eenvoudige interface biedt waarmee je intuïtief kunt werken en eenvoudig beheerstaken uit kunt voeren, maar ook dat geavanceerde opties wat lastiger te configureren zijn. Wil je toch wat ingewikkelder configuraties maken, dan kan dat met behulp van rich rules. Rich rules worden toegevoegd met firewall-cmd –add-rich-rule, waarbij de rich rule zelf tussen quotes als argument meegegeven wordt (en ook bij rich rules de toevoeging –permanent niet vergeten moet worden). Omdat het werken met rich rules in eerste instantie best lastig kan zijn, biedt man 5 firewalld.richlanguage een overzicht met een aantal voorbeelden.

 Laten we eens kijken naar een voorbeeld waarin een rich rule wordt aangemaakt. Het commando firewall-cmd –add-rich-rule ‘rule familiy=”ipv4″ source address=”1.2.3.4″ forward-port to-address=”1.2.3.5″ to-port=”4012″ protocol=”tcp” port=”4011″‘ –permanent wordt gebruikt om adres dat afkomstig is van IP adres 1.2.3.4 en bestemd is voor poort 4011 door te sturen naar TCP poort 4012 op destination IP adres 1.2.3.5.

 

 Nu is dit commando natuurlijk alles behalve eenvoudig, maar je moet je realiseren dat de tegenhanger in iptables ook niet veel gemakkelijker is. Hier zou je namelijk moeten werken met twee regels waarbij je DNAT en SNAT moet specificeren om te zorgen dat de port forwarding op de juiste manier door de kernel afgehandeld wordt.

 

 In dit artikel heb je gelezen hoe je met firewall-cmd kunt werken om een firewall te beheren op Red Hat 7 en verwante distributies. Je hebt gezien dat het niet echt ingewikkeld is, maar tegelijkertijd wordt het met de toegenomen eenvoud lastiger om geavanceerde configuraties goed voor elkaar te krijgen.

 

 Vind je het allemaal maar niets? Gebruik dan systemctl mask firewalld en systemctl enable iptables om de iptables service weer aan te zetten. Je kunt dan gewoon weer gebruik maken van iptables commando’s, want ondanks de introductie van firewalld doen die het ook nog gewoon.