Sådan opsættes en Iptables-firewall for at muliggøre fjernadgang til tjenester i Linux - Del 8


Introduktion til Linux Foundation-certificeringsprogrammet

Du vil huske fra del 1 - Om Iptables i denne LFCE ( Linux Foundation Certified Engineer ) -serie, at vi gav en grundlæggende beskrivelse af, hvad en firewall er: en mekanisme til at styre pakker, der kommer ind og forlader netværket. Ved "styre" mener vi faktisk:

  1. At tillade eller forhindre, at visse pakker kommer ind i eller forlader vores netværk.
  2. At videresende andre pakker fra et punkt på netværket til et andet.

baseret på forudbestemte kriterier.

I denne artikel vil vi diskutere, hvordan man implementerer grundlæggende pakkefiltrering, og hvordan man konfigurerer firewall med iptables, en frontend til netfilter, som er et indbygget kernemodul, der bruges til firewalling.

Bemærk, at firewalling er et stort emne, og denne artikel er ikke beregnet til at være en omfattende guide til forståelse af alt, hvad der er at vide om det, men snarere som et udgangspunkt for en dybere undersøgelse af dette emne. Vi vil dog genoptage emnet i Del 10 i denne serie, når vi udforsker et par specifikke brugstilfælde af en firewall i Linux.

Du kan tænke på en firewall som en international lufthavn, hvor passagerfly kommer og går næsten 24/7. Baseret på en række betingelser, såsom gyldigheden af en persons pas eller hans/hendes oprindelsesland (for at nævne et par eksempler) kan han eller hun muligvis få lov til at komme ind eller forlade et bestemt land.

Samtidig kan lufthavnsofficerer instruere folk om at flytte fra et sted til lufthavnen, hvis det er nødvendigt, for eksempel når de har brug for at gennemgå toldvæsenet.

Vi kan finde lufthavnens analogi nyttig i resten af denne vejledning. Bare husk følgende forhold, når vi fortsætter:

  1. Personer = pakker
  2. Firewall = lufthavn
  3. Land nr. 1 = Netværk nr. 1
  4. Land nr. 2 = netværk nr. 2
  5. Lufthavnsbestemmelser håndhævet af officerer = firewallregler

Iptables - det grundlæggende

På det lave niveau er det selve kernen, der “ beslutter ” hvad de skal gøre med pakker baseret på regler grupperet i kæder eller sætninger . Disse kæder definerer, hvilke handlinger der skal udføres, når en pakke matcher de kriterier, der er angivet af dem.

Den første handling, der foretages af iptables, består i at beslutte, hvad de skal gøre med en pakke:

  1. Accepter det (lad det gå igennem i vores netværk)?
  2. Afvis det (forhindre det i at få adgang til vores netværk)?
  3. Videresende det (til en anden kæde)?

Bare hvis du spekulerede på, hvorfor dette værktøj kaldes iptables , er det fordi disse kæder er organiseret i tabeller, hvor filtertabellen er den mest kendte og den der er bruges til at implementere pakkefiltrering med sine tre standardkæder:

1. INPUT kæden håndterer pakker, der kommer ind i netværket, og som er bestemt til lokale programmer.

2. OUTPUT -kæden bruges til at analysere pakker med oprindelse i det lokale netværk, der skal sendes udefra.

3. FORWARD kæden behandler de pakker, der skal videresendes til en anden destination (som i tilfældet med en router).

For hver af disse kæder er der en standardpolitik, der dikterer, hvad der skal gøres som standard, når pakker ikke matcher nogen af reglerne i kæden. Du kan se de regler, der er oprettet for hver kæde, og standardpolitikken ved at køre følgende kommando:

# iptables -L

De tilgængelige politikker er som følger:

  1. ACCEPT → lader pakken igennem. Enhver pakke, der ikke matcher nogen regler i kæden, er tilladt i netværket.
  2. DROP → taber pakken stille. Enhver pakke, der ikke matcher nogen regler i kæden, forhindres i at komme ind i netværket.
  3. AFVIS → afviser pakken og returnerer en informativ besked. Denne fungerer især ikke som en standardpolitik. I stedet er det meningen at supplere reglerne for pakkefiltrering.

Når det kommer til at beslutte, hvilken politik du vil gennemføre, skal du overveje fordele og ulemper med hver tilgang som forklaret ovenfor - bemærk, at der ikke er en størrelse, der passer -all løsning.

For at tilføje en regel til firewallen skal du påkalde kommandoen iptables som følger:

# iptables -A chain_name criteria -j target

hvor,

  1. -A står for Append (tilføj den aktuelle regel til slutningen af kæden).
  2. chain_name er enten INPUT, OUTPUT eller FORWARD.
  3. mål er den handling eller politik, der skal anvendes i dette tilfælde (ACCEPT, AFVIS eller DROP).
  4. kriterier er det sæt betingelser, som pakkerne skal undersøges med. Den består af mindst et (sandsynligvis flere) af følgende flag. Valgmuligheder inden for parenteser, adskilt af en lodret bjælke, svarer til hinanden. Resten repræsenterer valgfri afbrydere:

[--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.

Lad os lime alt det i 3 klassiske eksempler ved hjælp af følgende testmiljø til 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 sidste eksempel

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

Vi definerer først en DROP -politik for input-ping til vores firewall. Det vil sige, icmp-pakker vil blive droppet stille.

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

Inden vi fortsætter med REJECT -delen, skyller vi alle regler fra INPUT-kæden for at sikre, at vores pakker bliver testet af denne nye regel:

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

Vi beskæftiger os med kæden OUTPUT , da vi håndterer udgående trafik:

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

Kør følgende kommandoer i NFSv4-serveren/firewallen for at lukke porte 2049 og 111 for al slags trafik:

# 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

Lad os nu åbne disse porte og se, hvad der sker.

# 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, kunne vi montere NFSv4-aktien efter åbning af trafikken.

I de foregående eksempler viste vi, hvordan vi tilføjede regler til kæderne INPUT og OUTPUT . Hvis vi i stedet ønsker at indsætte dem i en foruddefineret position, skal vi i stedet bruge -I (store bogstaver).

Du skal huske, at reglerne evalueres efter hinanden, og at evalueringen stopper (eller springer), når en DROP eller ACCEPT -politik matches. Af den grund kan du finde dig selv i behovet for at flytte regler op eller ned i kædelisten efter behov.

Vi vil bruge et trivielt eksempel til at demonstrere dette:

Lad os placere følgende regel,

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

i position 2) i INPUT-kæden (flyttes således forrige nr. 2 som nr. 3)

Ved hjælp af opsætningen ovenfor kontrolleres trafik for at se, om den er rettet til port 80 , før der kontrolleres for port 2049 .

Alternativt kan du slette en regel og ændre målet for de resterende regler til REJECT (ved hjælp af kontakten -R ):

# 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

Sidst, men ikke mindst, bliver du nødt til at huske, at for at firewallreglerne skal være vedvarende, skal du gemme dem i en fil og derefter gendanne dem automatisk ved opstart (ved hjælp af den foretrukne metode efter eget valg eller den, der er tilgængelig til din distribution).

Gemme firewallregler:

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

Gendannelsesregler:

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

Her kan vi se en lignende procedure (gemme og gendanne firewallregler manuelt) ved hjælp af en dummy-fil kaldet iptables.dump i stedet for den standard som vist ovenfor.

# iptables-save > iptables.dump

For at gøre disse ændringer vedvarende på tværs af støvler:

Ubuntu : Installer pakken iptables-persistent , som indlæser de regler, der er gemt i filen /etc/iptables/rules.v4 .

# apt-get install iptables-persistent

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

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE : Liste over tilladte porte, protokoller, adresser osv. (adskilt af kommaer) i /etc/sysconfig/SuSEfirewall2 .

For mere information henvises til selve filen, som er stærkt kommenteret.

Konklusion

Eksemplerne i denne artikel, selvom de ikke dækker alle klokker og fløjter af iptables, tjener formålet med at illustrere, hvordan man aktiverer og deaktiverer trafik indkommende eller udgående trafik.

For dem af jer, der er firewallfans, skal man huske på, at vi vil genoptage dette emne med mere specifikke applikationer i del 10 i denne LFCE -serie.

Du er velkommen til at fortælle mig, hvis du har spørgsmål eller kommentarer.