iptables i Linux: 25 nyttige kommandoer med eksempler

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, brukes all.
  • -s: Spesifiserer kilden til trafikken (IP-adresse eller vertsnavn).
  • --dport: Angir destinasjonsportnummeret.
  • -j: Her spesifiserer du målet for regelen (ACCEPT, DROP eller RETURN).

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