Utforsk iptables: Din guide til brannmursikkerhet på Linux
Når det gjelder å sikre en Linux-enhet, finnes det et bredt spekter av verktøy tilgjengelig. Blant dem er iptables, et kraftig kommandolinjeverktøy som fungerer som en brannmur. Dette gir deg både fleksibilitet og solid beskyttelse.
Selv om iptables er et kommandolinjeverktøy og kan virke litt overveldende i starten, er det verdt å investere tid i å lære det. Denne artikkelen er designet for å hjelpe systemadministratorer og Linux-entusiaster ved å gå gjennom de viktigste iptables-kommandoene, supplert med praktiske eksempler.
Hva er iptables?
iptables er en programvarebasert brannmur som er integrert i Linux. Den lar brukere definere regler for å styre internettrafikken, både direkte og indirekte. Ved hjelp av iptables kan du konfigurere regler som enten blokkerer eller tillater trafikk basert på ulike kriterier, som portnummer, kilde-IP-adresse og nettverksgrensesnitt.
Når reglene er definert, blir all trafikk evaluert mot dem. Ved hver ny tilkobling vil iptables sjekke om det finnes en matchende regel. Hvis en regel passer, blir den anvendt på tilkoblingen. Hvis det ikke finnes noen relevante regler, vil standardregelen gjelde.
For å bruke iptables, bruker du følgende kommando i terminalen:
$ iptables -L -n -v
Her er en forklaring av parametrene:
-L
: Viser alle definerte regler.-n
: Bruker numerisk output for raskere ytelse.-v
: Viser output i detaljert format.
Hvis du kjører iptables uten parametre, vil du se følgende melding:
iptables v1.8.7 (nf_tables): no command specified Try `iptables -h' or 'iptables --help' for more information.
Hvis du får en feilmelding som kommandoen «iptables» ikke funnet
, må du installere iptables. Du kan installere iptables ved å bruke kommandoen:
$ sudo apt-get install iptables
Hvis iptables allerede er installert, får du en utskrift som denne:
#output Reading package lists... Done Building dependency tree... Done Reading state information... Done iptables is already the newest version (1.8.7-1ubuntu5). iptables set to manually installed. 0 upgraded, 0 newly installed, 0 to remove, and 35 not upgraded.
Hva er en brannmur?
Brannmurer er en sentral del av sikkerhetsinfrastrukturen for systemer, nettverk og personlige datamaskiner. De finnes både som maskinvare- og programvareløsninger, og fungerer ved å anvende definerte regler.
De fleste brannmurer er høyst konfigurerbare, noe som gir deg mulighet til å opprette og endre regler. For eksempel kan portbasert filtrering brukes til å kontrollere hvilke pakker som tillates å komme inn i systemet via de ulike portene. Du kan også tillate eller blokkere tjenester basert på kilde-IP-adresse eller nettverksgrensesnitt.
Linux-systemer leveres med iptables som en innebygd brannmur. Du kan også velge å bruke en dedikert Linux-brannmur i tillegg, for å styrke sikkerheten.
Hvorfor bruke iptables for å konfigurere brannmuren?
Det finnes mange brannmurer, som for eksempel ufw og firewalld. Hvorfor velge iptables?
Fordelene med iptables:
- Gir stor fleksibilitet. Du kan spesifisere regler helt ned på pakkenivå.
- Er relativt enkelt å bruke når du forstår grunnprinsippene.
- Gjør det enkelt å blokkere uønsket trafikk.
- Kan omdirigere pakker til alternative IP-adresser.
- Bidrar til å beskytte systemet mot DoS-angrep.
Og mye mer!
Forstå iptables-arkitekturen og dens relasjon til Netfilter
For å bruke iptables effektivt, er det viktig å forstå dens arkitektur. Dette gir en klar oversikt over de forskjellige komponentene i iptables, slik at du kan bruke dem til å definere brannmurregler.
Iptables er nært knyttet til Netfilter. Netfilter kan betraktes som en «storebror» til iptables, og tilbyr et utvidet funksjonssett for brannmuradministrasjon. iptables fungerer som en av metoder for å realisere Netfilters brannmurfunksjonalitet.
iptables er et kommandolinjegrensesnitt til Netfilter-kroker på kjernenivå. Disse krokene interagerer direkte med Linux-nettverksstakken og kan påvirke pakker på et dypt nivå.
Slik ser iptables-arkitekturen ut:
Tabeller
iptables-arkitekturen begynner med tabeller. Tabellene er ansvarlig for å organisere regler. Hver tabell er klassifisert ut fra typen beslutninger som tas. Tabellene forenkler pakkebehandlingen ved å knytte en spesifikk metode for pakkehåndtering til dem.
De viktigste tabellene i iptables er:
- Filtertabell: Definerer regler for pakkefiltrering, som bestemmer om en pakke skal nå sin destinasjon.
- NAT-tabell: Bestemmer hvordan adresseoversettelse (NAT) skal utføres, og ruter pakker basert på NAT-nettverk.
- Mangletabell: Håndterer pakker som krever spesialbehandling, som endring av pakkeoverskrifter eller TTL-verdier.
- Råtabell: Lar deg jobbe med tilstandsaspektet til iptables brannmur. Du kan rute pakker basert på tilstanden før Linux-kjernen begynner å spore dem.
Kjeder
Innenfor tabellene finnes «kjeder».
Kjeder gir mulighet for detaljert inspeksjon av pakker på ulike stadier. Du kan for eksempel analysere dem ved ankomst til en port eller et nettverksgrensesnitt. Dette gjør det mulig å ta avgjørelser om pakken før den overføres til systemets prosess.
De ulike kjedene inkluderer:
- PREROUTING-kjede: Håndterer innkommende pakker ved ankomst til nettverksgrensesnittet.
- INPUT-kjede: Håndterer innkommende tilkoblinger før de når den lokale prosessen.
- OUTPUT-kjede: Håndterer pakker som sendes fra lokale prosesser.
- FORWARD-kjede: Administrerer pakker som ikke er ment for lokale systemer, men videresendes til andre systemer.
- POSTROUTING-kjede: Behandler pakker som forlater nettverksgrensesnittet.
Ikke alle kjeder er tilgjengelige i alle tabeller. For eksempel er FORWARD-kjeden kun tilgjengelig i mangle-, filter- og sikkerhetstabellen. POSTROUTING-kjeden finnes i mangle- og nat-tabellen. OUTPUT-kjeden er den eneste som er tilgjengelig i alle tabeller.
Mål
Når en pakke ankommer, går den gjennom kjeder for å finne den regelen som passer best. Hvis en regel matcher, utføres den tilhørende handlingen, og pakken sendes til målet. Målet er det som endelig bestemmer hva som skjer med pakken.
I mange tilfeller vil ikke en pakke matche noen definert regel. Da kommer standardpolicyen, som også er et mål, inn i bildet.
De vanligste målene er ACCEPT
, DROP
og REJECT
. Disse er de avsluttende målene som bestemmer pakkens skjebne:
ACCEPT
: Godtar pakken.DROP
: Forkaster pakken uten å gi beskjed til avsenderen.REJECT
: Avviser pakken og informerer avsenderen om det.
Det finnes også ikke-avsluttende mål, som brukes til å lagre informasjon om pakken.
Vanlige iptables-kommandoer med eksempler
Før du starter med iptables-kommandoer, må du sørge for at:
- Du har administratorrettigheter til å kjøre kommandoene. Du kan bruke sudo foran kommandoen hvis du får feilmelding.
- Denne artikkelen er ikke ment som en komplett guide for å konfigurere iptables på Ubuntu.
- Vi bruker kommandoer for IPv4. For IPv6 må du bruke ip6tables.
Sjekk iptables-statusen
For å se gjeldende status for iptables, bruker du kommandoen:
$ iptables -L -n -v
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Denne utskriften viser mye informasjon. Den indikerer også at brannmuren ikke er aktiv. Dette er fordi alle kjedene er satt til ACCEPT
, og det finnes ingen regler.
Du må legge til regler for å aktivere brannmuren.
Legg til regler i en kjede
Når du legger til en regel, legges den alltid til i en kjede. Du bruker da alternativet -A
(Add). Syntaksen er:
$ sudo iptables -A
Hvis du kun skriver det, får du følgende:
iptables v1.8.7 (nf_tables): option "-A" requires an argument Try `iptables -h' or 'iptables --help' for more information.
Argumentene du kan bruke for å legge til regler er:
-i
: Spesifiserer nettverksgrensesnittet regelen skal gjelde for (f.eks. ppp0, eth0).-p
: Definerer nettverksprotokollen for regelen (f.eks. ICMP, TCP, UDP). Hvis regelen skal gjelde for alle protokoller, brukesall
.-s
: Spesifiserer kilden til trafikken (IP-adresse eller vertsnavn).--dport
: Angir destinasjonsportnummeret.-j
: Her spesifiserer du målet for regelen (ACCEPT
,DROP
ellerRETURN
).
Det er viktig å bruke kommandoen i følgende rekkefølge:
$ sudo iptables -A <chain-name> -i <interface-name> - p <protocol-name> - s <source> --dport <port no.> -j <target>
Lagre endringer i iptables
Etter at du har lagt til en regel, kan du lagre endringene med kommandoen iptables -save
.
$ sudo iptables -save
Resultatet er:
[email protected]:~$ sudo iptables-save # Generated by iptables-save v1.8.7 on Sun May 14 13:37:34 2023 *filter :INPUT ACCEPT [0:0] :FORWARD ACCEPT [0:0] :OUTPUT ACCEPT [0:0] -A INPUT -p tcp -m tcp --dport 22 -j ACCEPT -A INPUT -p tcp -m tcp --dport 80 -j ACCEPT -A INPUT -p tcp -m tcp --dport 443 -j ACCEPT -A INPUT -p tcp -m tcp --dport 392 -j REJECT --reject-with icmp-port-unreachable -A OUTPUT -o lo -j ACCEPT COMMIT # Completed on Sun May 14 13:37:34 2023
Lagre regler manuelt
Som standard lagrer ikke iptables regler permanent. Hvis du starter datamaskinen på nytt, vil alle regler fjernes. Du må bruke følgende kommandoer for å sikre at du ikke trenger å rekonfigurere iptables etter en omstart.
For IPv4-regler, skriv kommandoen:
$ sudo iptables-save > /etc/iptables/rules.v4
Og for IPv6-regler, skriv kommandoen:
$ sudo iptables-save > /etc/iptables/rules.v6
Lagre regler automatisk
For å lagre regler automatisk etter en omstart, må du installere pakken iptables-persistent
.
Dette gjøres ved å kjøre kommandoen:
$ sudo apt-get install iptables-persistent
Da vil du se et vindu som dette. Trykk enter ved <Ja>.
Når du jobber med IPv4-tabellen, vil det kun vises IPv4-regler. Jobber du med IPv6, vil det relevante vinduet vises.
Merk: Denne pakken laster bare dine lagrede iptables-regler. Så hver gang du endrer iptables, må du lagre det med kommandoen iptables -save
.
Laste inn regler etter omstart
Når reglene er lagret, må du gjenopprette dem med følgende kommando:
$ sudo iptables-restore < /etc/iptables/rules.v4
Og
$ sudo iptables-restore < /etc/iptables/rules.v6
Aktiver trafikk på localhost / aktiver loopback
For å aktivere trafikk på localhost, bruk kommandoen:
$ sudo iptables -A INPUT -i lo -j ACCEPT
Her står lo
for loopback-grensesnittet for all lokal vertskommunikasjon.
På samme måte kan vi tillate at pakker går gjennom loopback-grensesnittet:
$ sudo iptables -A OUTPUT -o lo -j ACCEPT
For å sjekke hvordan det endret reglene, kjør iptables -L -n -V
:
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- lo * 0.0.0.0/0 0.0.0.0/0 Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination
Aktiver trafikk på spesifikke porter
Du kan aktivere trafikk for å ACCEPT
eller REJECT
på bestemte porter.
For eksempel er SSL-, HTTP- og SSH-porter essensielle for at applikasjonene dine skal fungere. Du kan legge til regler for ACCEPT
-pakker gjennom portnumrene for å sikre at de fungerer som de skal.
For SSL, bruk kommandoen:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
For HTTPS, bruk kommandoen:
$ sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPT
For å tillate all HTTPS-trafikk via eth0
-grensesnittet:
$ iptables -A INPUT -i eth0 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
For SSH, bruk kommandoen:
$ sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPT
Og for å godta ALL innkommende SSH-trafikk på eth0
-grensesnittet:
$ iptables -A INPUT -i eth0 -p tcp --dport 22 -m state --state NEW,ESTABLISHED -j ACCEPT $ iptables -A OUTPUT -o eth0 -p tcp --sport 22 -m state --state ESTABLISHED -j ACCEPT
Et annet eksempel er å aktivere porttrafikk på en spesifikk port for en tilpasset app. La oss si port 233. For å åpne tilkoblinger på den porten, bruk:
$ sudo iptables -A INPUT -p tcp --dport 233 -j ACCEPT
Du kan også deaktivere tilkoblinger på en bestemt port med målet REJECT
.
La oss blokkere alle tilkoblinger på port 392:
$ sudo iptables -A INPUT -p tcp --dport 392 -j REJECT
For å sjekke endringene, kjør kommandoen iptables -L -n -v
.
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:233 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable Chain FORWARD (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT all -- * lo 0.0.0.0/0 0.0.0.0/0
Slett eksisterende regler
For å slette eksisterende regler, bruker du kommandoen:
$ iptables -F
Eller:
$ iptables --flush
Merk: Hvis du ikke har lagret reglene dine, vil de gå tapt, og du vil ikke kunne hente dem med iptables -restore
.
Slett regler med linjenumre
For å slette en bestemt regel, trenger du listen over regler med tall:
$ sudo iptables -L --line-numbers
#output Chain INPUT (policy ACCEPT) num target prot opt source destination 1 ACCEPT tcp -- anywhere anywhere tcp dpt:ssh 2 ACCEPT tcp -- anywhere anywhere tcp dpt:http 3 ACCEPT tcp -- anywhere anywhere tcp dpt:https 4 ACCEPT tcp -- anywhere anywhere tcp dpt:233 5 REJECT tcp -- anywhere anywhere tcp dpt:392 reject-with icmp-port-unreachable
For å fjerne regel nummer 4 for INPUT-kjeden:
$ sudo iptables -D INPUT 4
Hvis du igjen kjører iptables -n -v -L
får du:
#output Chain INPUT (policy ACCEPT 0 packets, 0 bytes) pkts bytes target prot opt in out source destination 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
Vis kun INPUT- eller OUTPUT-kjederegler
For å se kun INPUT-kjederegler, bruk:
$ sudo iptables -L INPUT -n -v --line-numbers
#ouput Chain INPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination 1 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:22 2 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:80 3 0 0 ACCEPT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:443 4 0 0 REJECT tcp -- * * 0.0.0.0/0 0.0.0.0/0 tcp dpt:392 reject-with icmp-port-unreachable
For kun å se OUTPUT-kjederegler:
$ sudo iptables -L OUTPUT -n -v --line-numbers
#output Chain OUTPUT (policy ACCEPT 0 packets, 0 bytes) num pkts bytes target prot opt in out source destination