# Linux Systeembeheer/Firewalls
## Inleiding

Om aanvallen op een netwerk te voorkomen of tegen te houden is een firewall op de router onontbeerlijk. De Linux-kernel heeft een ingebouwde firewall die je kan manipuleren met het commando iptables. Nu is het opstellen van een goede firewall niet zo evident en daarom zijn er intussen tientallen applicaties beschikbaar die deze taak vergemakkelijken (o.a. Firestarter, ufw, enz.). Het gebruiken van die tools is echter niet zonder gevaar: de details van de werking blijven verborgen, de kwaliteit van de firewall is niet langer 100% zeker en het is wellicht niet langer mogelijk om alle functionaliteiten van iptables te gebruiken. Voor een goed begrip van de werking van Linux-firewalls is het daarom belangrijk met iptables te leren werken.

## Leerdoelen

* De basisstructuur van Linux firewalls begrijpen
** de begrippen “table” en “chain” kennen en begrijpen
** de standaard tables (filter, nat, mangle) en hun functie kennen
** de standaard chains (INPUT, OUTPUT, FORWARD) kennen en hun functie begrijpen
* Het commando iptables kunnen gebruiken om de Linux firewall te manipuleren
** de standaard policies (ACCEPT, DROP, REJECT, LOG) kennen en kunnen instellen
** regels en chains kunnen toevoegen en verwijderen
** filteropties kunnen gebruiken:
*** filteren op protocol, IP-adres, MAC-adres, netwerkinterface, protocol
*** TCP, UDP uitbreidingen
*** trafiek limiteren
*** connection tracking
*** Network Address Translation
* De firewall-configuratie kunnen aanpassen en persistent maken op een RedHat-achtig systeem
** firewall opstarten/stoppen: service iptables {start,stop,restart,status}
** firewall-configuratie opslaan: service iptables save
** De meegeleverde GUI-tools (system-config-firewall of system-config-securitylevel) voor firewall-beheer kunnen gebruiken

## Basisstructuur Linux Firewalls
### Iptables

Iptables is de front-end van het netwerk packet filter framework Netfilter. Netfilter is onderdeel van de Linux kernel en kan worden gebruikt om diverse acties met data packets uit te voeren, zoals: accepteren, weigeren, NAT, etc.
Met iptables kan de systeembeheerder de firewall configureren voor het IPv4-protocol. Andere protocols brengen andere programma's of modules met zich mee. Bijvoorbeeld:
* ip6tables (IPv6)
* arptables (ARP)
* ebtables (Ethernet frames)

### Tables en Chains

Het uitgangspunt van iptables is dat de regels waaruit een firewall bestaat zijn ingedeeld in drie tables of tabellen; filter, nat en mangle.
In elk van deze tabellen vindt u een aantal chains. Deze chains zijn de verzamelingen regels waaruit de firewall is opgebouwd. Welke chains u kunt gebruiken, is afhankelijk van de tabel.

#### De filter tabel

De filter tabel zorgt voor packet filtering en bestaat uit drie ingebouwde chains. Let overigens op de notatie van de chains, die is altijd in hoofdletters.
* INPUT
* OUTPUT
* FORWARD
De INPUT-chain wordt gebruikt om binnenkomende pakketjes te filteren, de OUTPUT-chain wordt gebruikt voor het verwerken van pakketjes die op de lokale machine gedefinieerd zijn en naar buiten verstuurd moeten worden en de FORWARD-chain verwerkt alle pakketjes die door de firewall gerouteerd worden.

#### De nat tabel

Ook de nat table bestaat uit drie chains.
* PREROUTING
* OUTPUT
* POSTROUTING
Door middel van de nat table worden twee soorten NAT ondersteund. Om te beginnen is dit het veel gebruikte masquerading. Dit is de vorm van NAT waarin hosts op het privé-netwerk het internet op kunnen door gebruik te maken van het IP-adres van de firewall. Computers op internet zien in dat geval niets anders dan de firewall en zijn zich er niet van bewust dat er achter die firewall een volledig netwerk schuilt. Daarnaast is het ook mogelijk het omgekeerde te doen. Dit betekent dat u nodes op het interne netwerk met behulp van de nat tabel toegankelijk kunt maken voor de buitenwereld door er een geregistreerd IP-adres aan toe te wijzen. Dit verschijnsel wordt ook aangeduid als statisch NAT. Dit betekent dat u aan de interface van de router een tweede IP-adres toekent en er door middel van de nat tabel voor zorgt dat alles wat op dat secundaire IP-adres binnenkomt wordt doorgestuurd naar de betreffende host op het privénetwerk.
Van de drie chains wordt de PREROUTING chain gebruikt om pakketjes te behandelen zodra ze binnenkomen; dat wil zeggen nog voordat het routingproces er mee aan de slag kan. De OUTPUT-chain wordt gebruikt om pakketjes te behandelen die door het lokale systeem gegenereerd worden, nog voordat het routing proces er mee aan de slag gaat. De POSTROUTING chain tot slot wordt gebruikt om pakketjes te behandelen voordat ze het systeem verlaten, maar nadat het routingproces er mee aan de slag is geweest.

#### De mangle-tabel

De mangle-table zorgt voor TCP header wijzigingen en bestaat uit twee ingebouwde chains.
* PREROUTING
* OUTPUT
De PREROUTING chain behandelt alle inkomende pakketjes voordat ze gerouteerd worden, de OUTPUT chain behandelt uitgaande pakketjes voordat ze gerouteerd worden. De mangle-tabel wordt alleen in speciale gevallen gebruikt, bijvoorbeeld wanneer speciale services zoals Quality of Service (QoS) gebruikt worden om pakketjes een hogere prioriteit te geven.

### Regels

Bij het definiëren van een chain wordt gebruik gemaakt van verschillende regels (rules). Het is belangrijk dat in deze regels de juiste volgorde gebruikt wordt. In normale gevallen gaat een pakketje door alle regels in de chain. Dit is niet het geval als er een DENY of REJECT in de regel voorkomt. In dat geval wordt het pakketje direct tegengehouden. In alle andere gevallen worden dus alle regels verwerkt.
Als geen enkele regel een match oplevert met het betreffende pakketje, wordt de laatste regel in de chain toegepast. Deze regel staat ook bekend als de policy. In het Nederlands mag u dit gerust vertalen in “standaardbeleid”. Dit is dus de standaardregel die wordt toegepast voor alle pakketjes waarvoor geen specifieke regel gevonden kon worden.

### Policies

Er zijn standaard vier policies:
| Policy | Betekenis |
| ACCEPT | Iptables stopt de verdere verwerking van het pakket en geeft het door aan de applicatie of het besturingssysteem. |
| DROP | Iptables stopt de verdere verwerking van het pakket en dropt het. |
| REJECT | Doet hetzelfde als DROP maar met het verschil dat het een foutmelding weergeeft aan de verzender van het geblokkeerde pakket. |
| LOG | Eerst wordt het pakket doorgezonden naar de systemlog daemon om een log-notitie aan te maken, vervolgens wordt de volgende regel in de chain uitgevoerd. |

### Werken met tables en chains

Geen documentatie is vollediger dan de iptables man page. Daarom:
Een compact overzicht van de meestgebruikte vlaggen en opties vindt u in de tabel hieronder.
Merk op dat om een nieuwe chain te definiëren, u als eerste moet aangeven tot welke tabel de chain behoort. Als u dit niet doet, wordt de nieuwe chain automatisch toegewezen aan de tabel filter.
| Vlag | Uitleg |
| -A, --append | Voegt een of meer rules toe achteraan aan de gespecificeerde chain. Als argument moet aangegeven worden op welke chain dit commando uitgevoerd moet worden en welke regel er aan toegevoegd moet worden. |
| -D, --delete | Verwijdert een of meer rules uit de aangegeven table. Als argument moet aangegeven worden in welke chain gewerkt wordt en welke regel uit de chain bewerkt moet worden. U kunt verwijzen naar de betreffende regel door middel van een regelnummer (gebruik de optie -L voor een overzicht van alle regelnummers). |
| -I, --insert | Voeg een regel toe in een chain. De syntaxis hiervoor is iptables -I chain regelnummer regel. |
| -R, --replace | Gebruik deze optie om een regel te vervangen. De syntaxis van deze optie is: -R chain regelnummer regelspecificatie. |
| -L, --list | Toont alle regels. Bij deze optie kan aangegeven worden dat alleen regels uit één bepaalde chain getoond moeten worden. Als dit niet gebeurd, worden alle regels uit alle chains getoond. |
| -F, --flush | Verwijdert alle regels uit een chain. |
| -N, --new-chain | Definieer een nieuwe chain. U mag zelf bepalen welke naam die chain moet krijgen. Uiteraard moet deze naam wel uniek zijn. |
| -P, --policy chain target | Stelt een standaard policy (bvb DROP, ACCEPT,...) in voor de chain. |
| -X, --delete chain | Verwijdert een zelfgemaakte chain. |
| Rule specs | Uitleg |
| -p, --protocol [!] protocol | Een protocol meegeven dat moet gecontroleerd worden. Dit kan zowel tcp, udp, ..., all zijn of een numerieke waarde (0 is all in dit geval). De waarde 'all' is de default warde. Een uitroepteken inverteert de controle. |
| -s, --source [!] address[/mask] | De bron. Het adres kan een netwerk naam, hostnaam, ip addres (met /mask) of zonder mask zijn (zowel de /255.255.255.255 als /32 notatie is goed) Het adres 0.0.0.0 dient als wildcard. Een uitroepteken inverteert de controle. |
| -src | zie -s |
| -d, --destination [!] address[/mask] | De besteming. Het adres kan een netwerk naam, hostnaam, ip addres (met /mask) of zonder mask zijn (zowel de /255.255.255.255 als /32 notatie is goed) Het adres 0.0.0.0 dient als wildcard. Een uitroepteken inverteert de controle. |
| -dst | zie -d |
| -j, --jump target | Dit specifiëert het doel van de regel, wat gebeurt er als een packet met de regel matcht. |
| -i, --in-interface [!] name | Naam van de interface via dewelke het packet werd ontvangen (enkel te gebruiken bij de INPUT, FORWARD, PREROUTING chains). Je kan de naam laten eindigen op een "+" teken als jokerteken. Een uitroepteken inverteert de controle. |
| -o, --out-interface [!] name | Naam van de interface via dewelke het packet zal verzonden worden (enkel te gebruiken bij de FORWARD, OUTPUT, POSTROUTING chains). Je kan de naam laten eindigen op een "+" teken als jokerteken. Een uitroepteken inverteert de controle. |
| --sport <port> | Source port, dit kan een enkele waarde zijn of een range hebben. Bvb: -p tcp --sport 234:240 |
| --dport <port> | Destination port, dit kan een enkele waarde zijn of een range hebben. Bvb: -p tcp --dport 235 |
| Algemeen | Uitleg |
| -n en -v | Voorbeeld: de huidige configuratie tonen: iptables -L -n -v (-n is numeric en -v is verbose) |
Een toegepast voorbeeld vindt u in het Bash script verder op deze pagina.

## samenvatting firewalls

enkele overzichten met frequente functies van de iptables
| Queue Type | Queue Function | Packet Transformation Chain in Queue & Chain function |
| Filter | Packet filtering | ForwardFilters packets to servers accessible by another NIC on the firewall. InputFilters packets destined to the firewall. OutputFilters packets originating from the firewall |
| Nat | network adress translation | preroutingAddress translation occurs before routing. Facilitates the transformation of the destination IP address to be compatible with the firewall's routing table. Used with NAT of the destination IP address, also known as destination NAT or DNAT. postroutingAddress translation occurs after routing. This implies that there was no need to modify the destination IP address of the packet as in pre-routing. Used with NAT of the source IP address using either one-to-one or many-to-one NAT. This is known as source NAT, or SNAT. outputNetwork address translation for packets generated by the firewall. (Rarely used in SOHO environments) |
| mangle | TCP header modification | prerouting postrouting output forward Modification of the TCP packet quality of service bits before routing occurs. (Rarely used in SOHO environments) |
| target | description | most common options |
| accept | iptables stops further processing. The packet is handed over to the end application or the operating system for processing | N/A |
| drop | iptables stops further processing. The packet is blocked | N/A |
| log | The packet information is sent to the syslog daemon for logging iptables continues processing with the next rule in the table As you can't log and drop at the same time, it is common to have two similar rules in sequence. The first will log the packet, the second will drop it. | --log-prefix "string" Tells iptables to prefix all log messages with a user defined string. Frequently used to tell why the logged packet was dropped |
| reject | Works like the DROP target, but will also return an error message to the host sending the packet that the packet was blocked | --reject-with qualifier The qualifier tells what type of reject message is returned. Qualifiers include: icmp-port-unreachable (default) icmp-net-unreachable icmp-host-unreachable icmp-proto-unreachable icmp-net-prohibited icmp-host-prohibited tcp-reset echo-reply |
| dnat | Used to do destination network address translation. ie. rewriting the destination IP address of the packet | --to-destination ipaddress Tells iptables what the destination IP address should be |
| snat | Used to do source network address translation rewriting the source IP address of the packet The source IP address is user defined | --to-source <address>[-<address>][:<port>-<port>] Specifies the source IP address and ports to be used by SNAT. |
| masquerade | Used to do Source Network Address Translation. By default the source IP address is the same as that used by the firewall's interface | [--to-ports <port>[-<port>]] Specifies the range of source ports to which the original source port can be mapped. |

## Labo-opdracht: Een bastion firewall opzetten

Bedoeling is een firewallscript uit te werken voor een zgn. “bastion firewall” dat een lokaal netwerk, bestaande uit een DMZ (demilitarized zone) met publiek toegankelijke servers en een intranet dat niet toegankelijk is van buitenaf. Onderstaande figuur en adressentabel verduidelijken de opstelling.
| Host | Interface | IP-adres | Network Mask | Opmerkingen |
| router | eth0 | 172.16.1.253 | 255.255.255.252 | verbonden met router van ISP |
| router | eth1 | 192.0.2.126 | 255.255.255.248 | DMZ, met publieke IP-adressen |
| router | eth2 | 10.0.0.1 | 255.0.0.0 | Itern netwerk, met private IP-adressen |
| apollo | eth0 | 192.0.2.123 | 255.255.255.248 | Webserver |
| mars | eth0 | 192.0.2.124 | | Mailserver |
| ns1 | eth0 | 192.0.2.121 | | DNS1 |
| ns2 | eth0 | 192.0.2.122 | | DNS2 |
Opm. 192.0.2.0 is het zgn. TEST-NET, een klasse-C netwerk dat is voorbehouden voor het gebruik in voorbeelden, handleidingen, enz. Je mag het beschouwen als een publiek IP netwerk, maar het komt nergens “in het echt” voor.
Zet een firewall op met volgende eigenschappen:
* pakketten die tegengehouden worden (DROP), moeten ook gelogd worden. Maak daarvoor een nieuwe chain aan.
* pc's op het intranet kunnen de services van de DMZ gebruiken (gebruik zo strikt mogelijke regels).
* pc's op het intranet kunnen vrij naar “buiten” (via NAT).
* computers van buiten kunnen de services van de DMZ gebruiken (ook met zo strikt mogelijke regels).
* computers van buiten kunnen GEEN verbinding aangaan met computers op het intranet.
* blokkeer flooding op de DMZ services.
* op de router draaien geen services, dus alle verkeer van en naar de router zelf moet geblokkeerd worden.

## Bibliografie

* https://linux.about.com/od/commands/l/blcmdl8_iptable.htm
* https://www.yolinux.com/TUTORIALS/ManPage_ipchains.html
* https://www.lammertbies.nl/comm/info/nl_iptables.html
* https://www.centos.org/docs/5/html/Deployment_Guide-en-US/ch-iptables.html
* https://www.lammertbies.nl/picture/iptables-flow.png
* Leerboek Linux deel 3 (Sander Van Vugt)
* https://www.linuxhomenetworking.com/wiki/index.php/Quick_HOWTO_:_Ch14_:_Linux_Firewalls_Using_iptables