Linux Systeembeheer/Firewalls
Inleiding
bewerkenOm 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
bewerken- 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
bewerkenIptables
bewerkenIptables 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
bewerkenHet 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
bewerkenDe 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
bewerkenOok 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
bewerkenDe 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
bewerkenBij 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
bewerkenEr 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
bewerkenGeen documentatie is vollediger dan de iptables man page. Daarom:
$ man iptables
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.
$ iptables [-t table] -[ADIRLFNPX] chain rule-specification [options]
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
bewerkenenkele overzichten met frequente functies van de iptables
Queue Type | Queue Function | Packet Transformation Chain in Queue & Chain function | ||||||
---|---|---|---|---|---|---|---|---|
Filter | Packet filtering |
| ||||||
Nat | network adress translation |
| ||||||
mangle | TCP header modification |
|
target | description | most common options |
---|---|---|
accept |
|
N/A |
drop |
|
N/A |
log |
|
--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 |
|
--reject-with qualifier The qualifier tells what type of reject message is returned. Qualifiers include:
|
dnat |
| |
snat |
| |
masquerade |
|
[--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
bewerkenBedoeling 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 |
eth1 | 192.0.2.126 | 255.255.255.248 | DMZ, met publieke IP-adressen | |
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
bewerken- 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