Slik konfigurerer du en Iptables-brannmur for å aktivere ekstern tilgang til tjenester i Linux - Del 8


Vi introduserer Linux Foundation-sertifiseringsprogrammet

Du vil huske fra del 1 – Om Iptables av denne LFCE (Linux Foundation Certified Engineer)-serien at vi ga en grunnleggende beskrivelse av hva en brannmur er: en mekanisme for å administrere pakker som kommer inn og forlater nettverket. Med "administrere" mener vi faktisk:

  1. For å tillate eller forhindre visse pakker å gå inn eller ut av nettverket vårt.
  2. For å videresende andre pakker fra ett punkt i nettverket til et annet.

basert på forhåndsbestemte kriterier.

I denne artikkelen vil vi diskutere hvordan du implementerer grunnleggende pakkefiltrering og hvordan du konfigurerer brannmuren med iptables, en frontend til netfilter, som er en innebygd kjernemodul som brukes til brannmur.

Vær oppmerksom på at brannmur er et stort emne, og denne artikkelen er ikke ment å være en omfattende veiledning for å forstå alt det er å vite om det, men snarere som et utgangspunkt for en dypere studie av dette emnet. Vi vil imidlertid gå tilbake til emnet i Del 10 av denne serien når vi utforsker noen få spesifikke brukstilfeller av en brannmur i Linux.

Du kan tenke på en brannmur som en internasjonal flyplass hvor passasjerfly kommer og går nesten 24/7. Basert på en rekke forhold, for eksempel gyldigheten av en persons pass, eller hans/hennes opprinnelsesland (for å nevne noen eksempler), kan han eller hun få lov til å reise inn eller forlate et bestemt land.

Samtidig kan flyplassoffiserer instruere folk til å flytte fra et sted på flyplassen til et annet om nødvendig, for eksempel når de skal gjennom tollvesenet.

Vi kan finne flyplassanalogien nyttig under resten av denne opplæringen. Bare husk følgende forhold mens vi fortsetter:

  1. Personer=Pakker
  2. Brannmur=flyplass
  3. Land #1=Nettverk #1
  4. Land #2=Nettverk #2
  5. Flyplassforskrifter håndhevet av offiserer=brannmurregler

Iptables – det grunnleggende

På det lave nivået er det kjernen selv som «bestemmer» hva de skal gjøre med pakker basert på regler gruppert i kjeder, eller setninger. Disse kjedene definerer hvilke handlinger som skal iverksettes når en pakke samsvarer med kriteriene spesifisert av dem.

Den første handlingen tatt av iptables vil bestå i å bestemme hva de skal gjøre med en pakke:

  1. Godta det (la det gå gjennom i nettverket vårt)?
  2. Vil du avvise den (hindre den fra å få tilgang til nettverket vårt)?
  3. Videresende den (til en annen kjede)?

Bare i tilfelle du lurte på hvorfor dette verktøyet kalles iptables, er det fordi disse kjedene er organisert i tabeller, med filtertabellen som den mest kjente og den som er brukes til å implementere pakkefiltrering med de tre standardkjedene:

1. INPUT-kjeden håndterer pakker som kommer inn i nettverket, som er beregnet på lokale programmer.

2. OUTPUT-kjeden brukes til å analysere pakker som stammer fra det lokale nettverket, og som skal sendes til utsiden.

3. FORWARD-kjeden behandler pakkene som skal videresendes til en annen destinasjon (som i tilfellet med en ruter).

For hver av disse kjedene er det en standardpolicy, som dikterer hva som skal gjøres som standard når pakker ikke samsvarer med noen av reglene i kjeden. Du kan se reglene som er opprettet for hver kjede og standardpolicyen ved å kjøre følgende kommando:

iptables -L

De tilgjengelige retningslinjene er som følger:

  1. GODKJEN → slipper pakken gjennom. Enhver pakke som ikke samsvarer med noen regler i kjeden er tillatt i nettverket.
  2. DROP → slipper pakken stille. Enhver pakke som ikke samsvarer med noen regler i kjeden, forhindres fra å komme inn i nettverket.
  3. AVVIS → avviser pakken og returnerer en informativ melding. Spesielt denne fungerer ikke som en standardpolicy. I stedet er det ment å utfylle reglene for pakkefiltrering.

Når det gjelder å avgjøre hvilken policy du vil implementere, må du vurdere fordelene og ulemperne ved hver tilnærming som forklart ovenfor – merk at det ikke finnes en enhetlig løsning. - alt løsning.

Legge til regler

For å legge til en regel i brannmuren, påkall iptables-kommandoen som følger:

iptables -A chain_name criteria -j target

hvor,

  1. -A står for Legg til (legg til gjeldende regel på slutten av kjeden).
  2. kjedenavn er enten INPUT, OUTPUT eller FORWARD.
  3. mål er handlingen eller retningslinjene som skal gjelde i dette tilfellet (GODKJENT, AVVIS eller DROP).
  4. kriterier er settet med betingelser som pakkene skal undersøkes mot. Den er sammensatt av minst ett (mest sannsynlig flere) av følgende flagg. Alternativer innenfor parentes, atskilt med en vertikal strek, tilsvarer hverandre. Resten representerer valgfrie brytere:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

Vårt testmiljø

La oss lime alt dette i 3 klassiske eksempler ved å bruke følgende testmiljø for de to første:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

Og dette for det siste eksemplet

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
EKSEMPEL 1: Analyse av forskjellen mellom DROP- og REJECT-policyene

Vi vil først definere en DROP-policy for inndatapinger til brannmuren vår. Det vil si at icmp-pakker vil bli droppet stille.

ping -c 3 192.168.0.15
iptables -A INPUT --protocol icmp --in-interface eth0 -j DROP

Før vi fortsetter med REJECT-delen, vil vi tømme alle regler fra INPUT-kjeden for å sikre at pakkene våre blir testet av denne nye regelen:

iptables -F INPUT
iptables -A INPUT --protocol icmp --in-interface eth0 -j REJECT
ping -c 3 192.168.0.15

EKSEMPEL 2: Deaktivering/reaktivering av ssh-pålogginger fra dev2 til dev1

Vi vil ha å gjøre med OUTPUT-kjeden mens vi håndterer utgående trafikk:

iptables -A OUTPUT --protocol tcp --destination-port 22 --out-interface eth0 --jump REJECT

EKSEMPEL 3: Tillate/hindre NFS-klienter (fra 192.168.0.0/24) å montere NFS4-aksjer

Kjør følgende kommandoer i NFSv4-serveren/brannmuren for å lukke portene 2049 og 111 for all slags trafikk:

iptables -F
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

La oss nå åpne disse portene og se hva som skjer.

iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

Som du kan se, var vi i stand til å montere NFSv4-andelen etter å ha åpnet trafikken.

Sette inn, legge til og slette regler

I de forrige eksemplene viste vi hvordan du legger til regler til INPUT- og OUTPUT-kjedene. Skulle vi ønske å sette dem inn i en forhåndsdefinert posisjon i stedet, bør vi bruke -I (store bokstaver i)-bryteren i stedet.

Du må huske at reglene vil bli evaluert etter hverandre, og at evalueringen stopper (eller hopper) når en DROP- eller ACCEPT-policy samsvarer. Av den grunn kan du finne deg selv i behov for å flytte regler opp eller ned i kjedelisten etter behov.

Vi vil bruke et trivielt eksempel for å demonstrere dette:

La oss plassere følgende regel,

iptables -I INPUT 2 -p tcp --dport 80 -j ACCEPT

ved posisjon 2) i INPUT-kjeden (og flytter dermed forrige #2 som #3)

Ved å bruke oppsettet ovenfor vil trafikken bli sjekket for å se om den er dirigert til port 80 før det sjekkes for port 2049.

Alternativt kan du slette en regel og endre målet for de gjenværende reglene til REJECT (ved å bruke -R-bryteren):

iptables -D INPUT 1
iptables -nL -v --line-numbers
iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

Sist, men ikke minst, må du huske at for at brannmurreglene skal være vedvarende, må du lagre dem i en fil og deretter gjenopprette dem automatisk ved oppstart (ved å bruke den foretrukne metoden du velger eller den som er tilgjengelig for din distribusjon).

Lagre brannmurregler:

iptables-save > /etc/iptables/rules.v4		[On Ubuntu]
iptables-save > /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Gjenopprettingsregler:

iptables-restore < /etc/iptables/rules.v4		[On Ubuntu]
iptables-restore < /etc/sysconfig/iptables		[On CentOS / OpenSUSE]

Her kan vi se en lignende prosedyre (lagre og gjenopprette brannmurregler for hånd) ved å bruke en dummy-fil kalt iptables.dump i stedet for standarden som vist ovenfor.

iptables-save > iptables.dump

Slik gjør du disse endringene vedvarende på tvers av støvler:

Ubuntu: Installer pakken iptables-persistent, som vil laste inn reglene som er lagret i filen /etc/iptables/rules.v4.

apt-get install iptables-persistent

CentOS: Legg til følgende 2 linjer i filen /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: List tillatte porter, protokoller, adresser og så videre (atskilt med kommaer) i /etc/sysconfig/SuSEfirewall2.

For mer informasjon se selve filen, som er sterkt kommentert.

Konklusjon

Eksemplene i denne artikkelen dekker ikke alle klokkene og plystrene til iptables, men tjener hensikten med å illustrere hvordan du aktiverer og deaktiverer innkommende eller utgående trafikk.

For de av dere som er brannmurfans, husk at vi vil gå tilbake til dette emnet med mer spesifikke programmer i Del 10 av denne LFCE-serien.

Gi meg gjerne beskjed hvis du har spørsmål eller kommentarer.