Installerer iptables ubuntu. Det grunnleggende om iptables gjennom øynene til en baby i Debian

Så i dag skal vi finne ut hva slags beist denne IPTables er og hvordan vi skal håndtere det, erobre og dempe det? :)

IPTables er et kommandolinjeverktøy som er standardgrensesnittet for å kontrollere driften av brannmuren (brannmur eller brannmur) NETFilter for Linux-kjerner, fra og med versjon 2.4. Superbruker (root)-privilegier kreves for å bruke IPTables-verktøyet.

Noen ganger refererer IPTables til selve NETFilter-brannmuren. Med dens hjelp kan du administrere ganske fleksibelt (i dette tilfellet behandlingen av pakker som kommer til oss eller utgår fra oss).

For eksempel kan du nekte én datamaskin tilgang til Internett, en annen kan bare tillate tilgang til nettsteder, den tredje kan "videresending" (tildele) en forhåndsbestemt port, og sende "mistenkelige" pakker tilbake til avsenderen (selv om den bryter seg selv ). Du kan endre tjenesteinformasjonen til IP-pakker "on the fly" (sender, mottaker, TTL, etc.) og mye mer som du bare ikke kan forestille deg.

For det første, det du trenger å vite om brannmurer er at de er designet for beskyttelse, så du må huske på at den siste regelen ( Politikk) bør være "forby resten". For det andre, men ikke minst, rediger alltid regler eller Telnet nøye.

Tilfeller der fjernkontrollreglene ble konfigurert, og etter å ha brukt reglene, en uoppmerksom admin ble "avskåret" fra serveren, er ikke isolert! Og det er bra hvis serveren er et steinkast unna, men hva om den er et sted i det fjerne riket?


Hvordan en brannmur fungerer

Når en pakke kommer til brannmuren vår, blir den først truffet, fanget opp av den aktuelle driveren, og deretter sendt til kjernen. Pakken sendes deretter gjennom en serie tabeller og sendes deretter enten til en lokal applikasjon eller til en annen maskin.

Rekkefølgen på pakken er vist i tabellen nedenfor:

Steg bord Kjede Merk
1 Kabel (dvs. Internett)
2 Nettverksgrensesnitt (f.eks. eth0)
3 mangle PREROUTING Vanligvis brukes dette trinnet til å gjøre endringer i pakkehodet, for eksempel for å endre TOS-bitene osv.
4 nat PREROUTING Denne kjeden brukes til adresseoversettelse av destinasjonsnettverk. Kgjøres senere i en annen kjede. Enhver form for filtrering i denne kjeden kan kun utføres i unntakstilfeller.
5 Ta beslutning om videre dirigering, d.v.s. på dette tidspunktet bestemmes det hvor pakken skal gå - til en lokal applikasjon eller til en annen node på nettverket.
6 mangle FRAMOVER Pakken går deretter inn i FORWARD-kjeden til mangletabellen, som kun skal brukes i unntakstilfeller når det er nødvendig å gjøre noen endringer i pakkehodet mellom to rutebeslutningspunkter.
7 Filter FRAMOVER Bare de pakkene som går til en annen vert går inn i FORWARD-kjeden. All transittrafikkfiltrering skal utføres her. Ikke glem at trafikken flyter gjennom denne kjeden i begge retninger. Sørg for å ta hensyn til denne omstendigheten når du skriver filtreringsregler.
8 mangle POSTRUTING Denne kjeden er ment å gjøre endringer i pakkehodet etter at den siste rutebeslutningen er tatt.
9 nat POSTRUTING Denne kjeden er primært ment fore. Ikke bruk den til unødvendig filtrering. Maskerading utføres også her.
10 Utdatanettverksgrensesnitt (f.eks. eth1)
11 Kabel (la det være LAN)

Som du kan se, går pakken gjennom flere stadier før den sendes videre. På hvert trinn kan pakken stoppes, enten det er iptables-kjeden eller noe annet, men vi er hovedsakelig interessert i iptables.

Merk at det ikke er noen grensesnittspesifikk kjeding eller noe lignende. ALLE pakker som går gjennom brannmurruteren vår, går gjennom FORWARD-kjeden. Ikke bruk INPUT-kjeden til å filtrere transittpakker, de går bare ikke dit. Bare data beregnet på samme vert beveger seg gjennom denne kjeden.


Iptables regler

Jeg vil gi et eksempel på en del av ruterkonfigurasjonen min: vlan332 er grensesnittet som jeg får tilgang til Internett via, vlan333 er tilgang til leverandørens lokale nettverk, og 172.30.2.5 er datamaskinen min.

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE

#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --til 172.30.2.5

#Åpen port
iptables -A INPUT -p tcp --dport 53 -j GODTAR #DNS TCP
iptables -A INPUT -p udp --dport 53 -j GODKJENNER #DNS UDP
iptables -A INPUT -p tcp --dport 80 -j GODKJENNER #WEB-server

# Alle andre innkommende "drop" (slett)
iptables -A INPUT -i vlan332 -j DROP

Hva betyr alt dette? Først av alt, for enkelhets skyld har jeg delt opp konfigurasjonen i "seksjoner" med kommentarer, dvs. i en seksjon er det regler for NAT, i en annen - portvideresending (PAT), i den tredje - tillater vi serverporter, etc.

Vurder de første og andre reglene (de er bare forskjellige i nettverksgrensesnitt):

iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE

Basert på den legger vi til en ny regel for postrouting-kjeden (-A POSTROUTING) til nat-tabellen (-t nat), som vil være den siste regelen i kjeden på det tidspunktet kommandoen utføres (dvs. på slutten ). Regelen vil bli brukt på det utgående grensesnittet vlan332 (-o vlan332) og vil bli sendt til MASQUERADE (-j MASQUERADE) disse NAT-ene.

I menneskelige termer bør alt som vil forlate vlan332-grensesnittet skjules bak NAT. Dette betyr at når du forlater ruteren vår, vil avsenderens adresse bli indikert av serveren vår, og ikke sluttdatamaskinen til brukeren som forespørselen ble sendt fra. til forespørselen, vil den omvendte prosedyren bli utført og pakken vil bli videresendt til den opprinnelige avsenderen, som den vil bli beskrevet i detalj i artikkelen om NAT.

La oss gå videre til neste gruppe regler, nemlig delen merket som "torrent". Denne delen inneholder reglene for port forwarding (PAT - Port Address Translation), dvs. slik at du fra Internett-siden kan koble til porten på datamaskinen bak ruteren vår. Uten dette vil mange applikasjoner ikke kunne fungere ordentlig, for eksempel torrent fildelingsnettverk, DC ++ og noen applikasjoner som krever innkommende tilkoblinger fra Internett. La oss analysere regelen ved å bruke eksemplet med portvideresending (tildeling) for en Torrent-klient

iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --til 172.30.2.5

Som i forrige regel spesifiserer vi tabellen og kjeden (-A PREROUTING -t nat), vi angir den tillatte protokolltypen. I den gjeldende TCP-regelen (-p tcp) (i en annen UDP-regel, selv om de kan spesifiseres i en regel, lyktes jeg dessverre ikke selv med den offisielle litteraturen og har ennå ikke funnet en løsning).

Destinasjonsport 9000 (--dport 9000), innkommende vlan332-grensesnitt. Med handlingen DNAT (-j DNAT) indikerer vi at du må endre mottakerens adresse til 172.30.2.5 (--til 172.30.2.5) dvs. - datamaskinen vår. Det viser seg at alle innkommende TCP-tilkoblinger på port 9000 skal omdirigeres til IP 172.30.2.5.

iptables -A INPUT -p tcp --dport 53 -j GODTAR #DNS TCP

Vi angir INPUT-kjeden, TCP-protokollen, portnummer 53 (brukes for drift av DNS-tjenester) og handlingen - tillate... Du kan legge merke til at UDP brukes til DNS-spørringer, og dette vil være riktig. For å overføre informasjon om soner (domener) brukes TCP, og siden min server er primær for flere soner, tillot jeg tilgang via TCP.

Den siste regelen, som jeg sa ovenfor, bør være å forby alt annet som ikke falt under filtrene. Jeg skrev iptables -A INPUT -i vlan332 -j DROP de. slett alle innkommende pakker til vlan332-grensesnittet.

Siden denne brannmuren ikke har en permanent konfigurasjon, må reglene legges inn manuelt ved omstart. Dette spiller ingen rolle, siden det er shell-skript (analogt med bat- og cmd-filer i Windows), og når de utføres, vil de kjøre kommandoene som er skrevet i dem.

For å gjøre dette, lag en fil i etc-katalogen kalt firewall.sh med kommandoen nano /etс/firewall.sh, dvs. la oss åpne den direkte i editoren. La oss legge inn alle reglene vi trenger der og lagre dem ved å trykke Ctrl + X.

Her er noen fungerende konfigurasjonsregler som du kan finne nyttige i din daglige bruk. Den første linjen (#! / Bin / sh) kreves da den spesifiserer hvordan disse instruksjonene skal tolkes.

#! / bin / sh
PATH = / usr / sbin: / sbin: / bin: / usr / bin

# Fjern alle eksisterende regler for alle tabeller og kjeder
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Tillat all trafikk
iptables -A INPUT -i lo -j GODKJEN # loopback
iptables -A INPUT -i eth0 -j ACCEPT # Internt grensesnitt til LAN
iptables -A INPUT -i eth2 -j ACCEPT # Internt grensesnitt til LAN 2

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE # Aktiver NAT mot Internett
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE # Aktiver NAT mot ISP (ISP-nettverk)

#PORT FORVIDING
#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --til 172.30.2.5 # Portvideresending til IP
iptables -A PREROUTING -t nat -p udp --dport 9000 -i vlan332 -j DNAT --til 172.30.2.5

#VPN-tilkoblinger, tillat PPP-tilkoblinger osv.
iptables -A INPUT -p tcp -m tcp --dport 1723 -j GODKJENNER
iptables -A INPUT -p gre -m state --state RELATED, ETABLISHED -j ACCEPT

# Åpne serverporter
iptables -A INPUT -p tcp --dport 23 -j ACCEPT # Tillat SSH-tilgang

# Slett alt annet innkommende ("slipp" - forkast)
iptables -A INPUT -i vlan332 -j DROP

# Aktivering av videresending, uten dette vil ikke pakkerouting forekomme
echo 1> / proc / sys / net / ipv4 / ip_forward

Etter det gjør vi filen kjørbar, dvs.:
chmod + x /etc/firewall.sh(henrette).

For å få denne filen til å fungere automatisk ved lasting, vil vi skrive stien til den i "startup"-filen. Åpne nano /etc/rc.local og legg til linjen /etc/firewall.sh før exit 0.Hvis du trenger å bruke VLAN (virtuelle grensesnitt og nettverk), må du skrive denne linjen i filen / etc / network / grensesnitt som opp sh / etc /firewall.sh til vlan-grensesnittet, for eksempel:

# VLAN til INET
auto vlan332
iface vlan332 inet statisk
adresse xxx.xxx.xxx.xxx
nettmaske 255.255.255.252
# gateway xxx.xxx.xxx.xxx
vlan_raw_device eth1
opp sh /etс/firewall.sh

Dette er nødvendig fordi først "autoload" vil finne sted, og først etter en stund vil VLAN-grensesnittene våre stige, og hvis det ikke er noe grensesnitt, vil ikke regelen bli opprettet.

Dessverre kan jeg ikke fullstendig beskrive arbeidet til denne fantastiske brannmuren, men det er utmerket dokumentasjon på den på russisk (oversettelse av den originale utviklerveiledningen), her er adressen.

Det vil ikke være vanskelig, etter å ha lest en del av den eller satt en spesifikk oppgave, å løse de fleste problemene knyttet til denne brannmuren og skriveregler selv.

Nøkkelbegrepene i iptables er:

    Regel - består av et kriterium, en handling og en teller. Hvis pakken samsvarer med kriteriet, brukes en handling på den og telles. Kriteriet kan eksistere eller ikke eksisterer - da er kriteriet "alle pakker" implisitt antatt. Det er heller ikke nødvendig å spesifisere en handling - i fravær av en handling vil regelen kun fungere som en teller. Reglene for hver kjede utløses i den rekkefølgen de vises, så rekkefølgen er viktig.

    • Kriterium er et boolsk uttrykk som analyserer egenskapene til en pakke og/eller en forbindelse og bestemmer om denne spesielle pakken samsvarer med gjeldende regel. Kriteriene er forbundet med logisk "AND".

      Handling - en beskrivelse av handlingen som skal utføres med pakken og/eller tilkoblingen hvis de faller innenfor rammen av denne regelen. Handlingene vil bli beskrevet mer detaljert nedenfor.

      Teller er en komponent av en regel som gir regnskap for antall pakker som faller inn under kriteriet for denne regelen. Telleren tar også hensyn til det totale volumet av slike pakker i byte.

    En kjede er en ordnet sekvens av regler. Kjeder kan deles inn i custom og basic.

    • Basiskjeden er kjeden som er opprettet som standard når tabellen initialiseres. Hver pakke, avhengig av om den er ment for verten selv, generert av den, eller er forbigående, må gå gjennom det tildelte settet med basiskjeder av forskjellige tabeller. I tillegg skiller basiskjeden seg fra brukerkjeden ved at den har en "standardpolicy". Denne handlingen gjelder de pakkene som ikke har blitt behandlet av andre regler i denne kjeden og kjeder som kalles fra den. Basiskjedenavn er alltid store bokstaver (PREROUTING, INNPUT, FORWARD, OUTPUT, POSTROUTING).

      Tilpasset kjede - En brukeropprettet kjede. Den kan bare brukes innenfor sin egen tabell. Det anbefales at du ikke bruker store bokstaver for slike strenger for å unngå forvirring med grunnstrenger og innebygde handlinger.

    Et bord er en samling av grunnleggende og tilpassede kjeder, forent av et felles funksjonelt formål. Tabellnavn (samt kriteriemoduler) skrives med små bokstaver, siden de i prinsippet ikke kan komme i konflikt med navnene på brukerkjeder. Når du påkaller iptables-kommandoen, spesifiseres tabellen i formatet -t tabellnavn. Hvis det ikke er spesifisert, brukes filtertabellen.

Parsing:

# Dump tabellregler filter$ sudo iptables-save -c -t filter # Filtertabell * filter # INPUT, FORWARD, OUTPUT kjeder, deres retningslinjer og tellere: INNGANG GODKJENNER [19302: 9473669]: ACCEPTER VIDERE [0: 0]: GODKJENT OUTPUT [5462736: 4247599532] # Regel: "" - regelteller, "-A INPUT" - kjede, "-i em1 -p tcp -m tcp --dport 22" - kriterier, "-j ACCEPT" - handling[17: 1020] -A INNPUT -i em1 -p tcp -m tcp --dport 22 -j GODKJENNING FORVIKLING

Arkitektur

I nettfiltersystemet føres pakker gjennom kjeder. En kjede er en ordnet liste med regler, og hver regel kan inneholde kriterier og en handling eller overgang. Når en pakke passerer gjennom kjeden, sjekker nettfiltersystemet etter tur om pakken oppfyller alle kriteriene til neste regel, og i så fall utfører en handling (hvis det ikke er noen kriterier i regelen, utføres handlingen for alle pakker som går gjennom regelen). Det er mange alternativer for mulige kriterier. For eksempel samsvarer en pakke med kriteriet –kilde 192.168.1.1 hvis pakkehodet indikerer at avsenderen er 192.168.1.1. Den enkleste typen hopp, –hopp, hopper ganske enkelt pakken til begynnelsen av en annen kjede. Du kan også spesifisere en handling ved å bruke –jump. Standardhandlingene som er tilgjengelige i alle kjeder er ACCEPT (hopp over), DROP (slett), QUEUE (send for analyse til et eksternt program) og RETURN (retur for analyse til forrige kjede). For eksempel kommandoene

Iptables -A INPUT --kilde 192.168.1.1 --jump GODKJEN iptables -A INPUT --jump other_chain

betyr "legg til følgende regler på slutten av INPUT-kjeden: la pakker fra 192.168.1.1 gå gjennom, og alt som gjenstår er å sende for analyse til den andre_kjeden."

Kjeder

Det er 5 typer standardkjeder innebygd i systemet:

    PREROUTING - for den første behandlingen av innkommende pakker.

    INPUT - for innkommende pakker adressert direkte til den lokale prosessen (klient eller server).

    FORWARD - for innkommende pakker omdirigert ut (merk at de videresendte pakkene går gjennom PREROUTING-kjeden først, deretter FORWARD og POSTROUTING).

    OUTPUT - for pakker generert av lokale prosesser.

    POSTROUTING - for å fullføre utgående pakker.

Du kan også opprette og ødelegge dine egne kjeder ved å bruke iptables-verktøyet.

Tabeller

Kjedene er organisert i 4 tabeller:

    Rå - sett før pakken sendes til tilstandsdefinisjonssystemet. Det brukes sjelden for eksempel til å merke pakker som IKKE skal behandles av statssystemet. For å gjøre dette er NOTRACK-handlingen spesifisert i regelen. Inneholder PREROUTING og OUTPUT kjeder.

    Mangle - inneholder reglene for å endre (vanligvis overskriften) IP-pakker. Støtter handlingene TTL (Time to live), TOS (Type of Service) og MARK (for å endre TTL- og TOS-felt, og for å endre pakkemarkører), blant andre. Sjelden nødvendig og kan være farlig. Inneholder alle fem standardkjeder.

    Nat - Ser bare etter pakker som oppretter en ny tilkobling (i henhold til tilstandssystemet). Støtter handlinger DNAT, SNAT, MASQUERADE, REDIRECT. Inneholder PREROUTING-, OUTPUT- og POSTROUTING-kjedene.

    Filter - hovedtabellen, brukt som standard hvis navnet på tabellen ikke er spesifisert. Inneholder INPUT-, FORWARD- og OUTPUT-kjeder.

Kjeder med samme navn, men i forskjellige tabeller, er helt uavhengige objekter. For eksempel inneholder rå PREROUTING og mangle PREROUTING vanligvis et annet sett med regler; pakker går gjennom den rå PREROUTING-kjeden først og deretter gjennom PREROUTING-manglen.

stater

I nettfiltersystemet kan hver pakke som passerer gjennom tilstandsdeteksjonsmekanismen ha en av fire mulige tilstander:

    NYTT - pakken åpner en ny økt. Et klassisk eksempel er en TCP-pakke med SYN-flagget.

    ETABLERET - Pakken er en del av en eksisterende økt.

    RELATED - pakken åpner en ny økt knyttet til en allerede åpen økt. For eksempel, under en passiv FTP-økt, kobler klienten til port 21 på serveren, serveren forteller klienten nummeret til en andre, tilfeldig valgt port, og deretter kobler klienten til den andre porten for å overføre filer. I dette tilfellet er den andre økten (overføring av filer på den andre porten) knyttet til en allerede eksisterende økt (den opprinnelige tilkoblingen til port 21).

    Ugyldig - alle andre pakker.

Diagram over kryssingen av tabeller og kjeder

Forenklet diagram over kryssingen av tabeller og kjeder:

Detaljert diagram:

Grunnleggende konfigurasjon

Nedenfor er et eksempel på en grunnleggende statisk iptables-konfigurasjon. Når du lagrer og laster en slik konfigurasjon, må du ta hensyn til muligheten for å gjøre endringer i den fra andre tjenester, for eksempel Fail2ban. I tillegg, når du bruker IPv6-adressering, må konfigurasjonen for IPv6 utføres uavhengig av IPv4.

IPv4

sudo iptables-lagre

Lag et skript med en dump av iptables-regler:

sudo nano / etc / network / if-up.d / iptables-rules

Kopier følgende kode:

#! / sbin / iptables-restore -A INPUT -p icmp -j ACCEPT -A INPUT -i lo -j ACCEPT -A INPUT -j REJECT --reject-with icmp-host-prohibited -A FORWARD -m conntrack - ctstate RELATED, ETABLERT -j AKSEPTERT -A FREMOVER -p icmp -j GODKJENNER -A FREMOVER -j AVVIS --avvis-med icmp-host-forbudt # -A UTGANG -p icmp -j GODKJENNER # -A UTGANG -o lo - j AKSEPTERER # -A OUTPUT -j REJECT --reject-with icmp-host-prohibited BEGÅ

Vi legger til de nødvendige reglene, tar hensyn til iptables-save.

sudo chmod + x / etc / network / if-up.d / iptables-rules sudo / etc / network / if-up.d / iptables-rules

IPv6

Viser gjeldende konfigurasjon:

sudo ip6tables-lagre

Lag et skript med en dump av ip6tables-regler:

sudo nano / etc / network / if-up.d / ip6tables-rules

Kopier følgende kode:

#! / sbin / ip6tables-restore # Filtertabellen og dens kjeder* filter: INPUT ACCEPT [0: 0]: FORWARD ACCEPT [0: 0]: OUTPUT ACCEPT [0: 0] # Tillat relaterte og etablerte tilkoblinger-A INPUT -m conntrack --ctstate RELATED, ETABLISHED -j ACCEPT # Tillat tjeneste icmp trafikk-A INNGANG -p ipv6-icmp -j GODTAR # Tillat pålitelig trafikk til loopback-grensesnittet-A INNGANG -i lo -j GODTAR # Her kan du sette inn tilleggsregler for INPUT-kjeden # Ikke tillat alt annet for INPUT-A INPUT -j REJECT --reject-with icmp6-adm-prohibited # Rekkefølgen og betydningen av reglene for FORWARD- og OUTPUT-kjeder er den samme som for INPUT-A FORWARD -m conntrack --ctstate RELATED, ETABLISHED -j ACCEPT -A FORWARD -p ipv6-icmp -j ACCEPT -A FORWARD -j REJECT --reject-with icmp6-adm-prohibited # Filtrering av OUTPUT-kjeden frarådes på det sterkeste # -A OUTPUT -m conntrack --ctstate RELATED, ETABLISHED -j ACCEPT # -A OUTPUT -p ipv6-icmp -j GODTAR# -A OUTPUT -o lo -j GODKJENNER # -A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited BEGÅ

Vi legger til de nødvendige reglene, tar hensyn til ip6tables-save.

Lagre og lukk: Ctrl + O, Enter, Ctrl + X

Vi gjør skriptet kjørbart og laster iptables-reglene:

sudo chmod + x / etc / nettverk / if-up.d / ip6tables-rules sudo / etc / network / if-up.d / ip6tables-rules

Ytterligere regler

Nedenfor er noen av de mest brukte reglene. INPUT / OUTPUT-kjeder brukes til å filtrere lokal trafikk. For transittrafikk må du bruke FORWARD-kjeden.

Fjerntilgang

# remote.ssh -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 22 -j ACCEPT # remote.rdp -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 3389 -j ACCEPT # remote.vnc -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5900 -j ACCEPT

Web- og filtjenester

# web.http, web.https -A INPUT -p tcp -m conntrack --ctstate NYTT -m multiport -A INPUT -p tcp -m conntrack --ctstate NYTT -m tcp --dport 21 -j ACCEPT

E-post og direktemeldinger

# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 110, 995 -j ACCEPT # mail.imap, mail.imaps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 143, 993 -j ACCEPT # mail.smtp, mail.smtps -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 25, 465 -j ACCEPT # im.xmpp -A INPUT -p tcp -m conntrack --ctstate NEW -m multiport --dports 5222, 5223 -j ACCEPT # im.icq.oscar -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 5190 -j GODTAR

Nettverkstjenester

# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 1194 -j ACCEPT # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 3128 -j ACCEPT # network.dns -A INNPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 53 -j ACCEPT -A INNPUT -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPT # network.ntp -A INNPUT -p udp -m conntrack --ctstate NEW -A INNPUT -p udp -m conntrack --ctstate NYTT -m udp --dport 69 -j ACCEPT # network.dhserver.dhcp.discover-request-A INPUT -p udp -m conntrack --ctstate NYTT -m udp --sport 68 --dport 67 -j GODKJENNER # network.dhclient.dhcp.discover-request # -A OUTPUT -p udp -m conntrack --ctstate NYTT -m udp --sport 68 --dport 67 -j GODKJENNER # network.dhserver.dhcp.offer-ack # -A OUTPUT -p udp -m conntrack --ctstate NYTT -m udp --sport 67 --dport 68 -j GODKJENNER

Testing og feilsøking

Vise gjeldende konfigurasjon for IPv4 og IPv6:

sudo iptables-lagre sudo ip6tables-lagre

Hogst

Sporing

Kjernemoduler

Se innlastede moduler:

lsmod | grep -E "^ ip | ^ nf" | sortere

For å laste inn tilleggsmoduler er det praktisk å bruke autofullføring: 2x Tab

sudo modprobe nf sudo modprobe modules-load.d

Hver datamaskin som er koblet til nettverket er i potensiell fare. Det er mange trusler på nettverket, alt fra programmer som vil prøve å trenge inn i systemet på noen måte og slutter med hackere som ønsker å få tilgang til datamaskinen de trenger. Og programvaren som er installert på datamaskinen kan inneholde ennå ikke kjente og uopprettede sårbarheter, som kan bli et sikkerhetshull.

Hvis for hjemmedatamaskiner dette ikke er veldig relevant, siden de er koblet til nettverket gjennom rutere og NAT, som skjuler dem fra det eksterne nettverket, så er det for servere mer relevant enn noen gang. Linux-operativsystemet har en svært fleksibel og pålitelig iptables-brannmur innebygd i kjernen.

Det er ved hjelp av dette programmet at systemet er beskyttet mot eksterne inntrengninger, port forwarding, samt mange flere handlinger med trafikk. Men ulempen er at den er litt vanskelig å sette opp. Denne artikkelen vil dekke oppsett av iptables for dummies. Jeg håper at du etter det trygt kan bruke de grunnleggende egenskapene til iptables.

Iptables og Netfilter-undersystemet har vært innebygd i Linux-kjernen i ganske lang tid. Alle nettverkspakker som går gjennom datamaskinen, sendes av datamaskinen, eller er bestemt til datamaskinen, leder kjernen gjennom iptables-filteret. Der er disse pakkene mottagelige for kontroller og deretter for hver kontroll, hvis den blir bestått, utføres den spesifiserte handlingen. For eksempel sendes pakken videre til kjernen for å sendes til målprogrammet, eller kastes.

Typer pakker

Alle pakker er delt inn i tre typer: innkommende, utgående og bestått. Innboks er de som er sendt til denne datamaskinen, utgående er de som er sendt fra denne datamaskinen til nettverket. Og passerende er pakker som bare må videresendes, for eksempel hvis datamaskinen din fungerer som en ruter.

Følgelig, i iptables-filteret er alle pakker delt inn i tre lignende kjeder:

  • Inndata- behandler innkommende pakker og tilkoblinger. For eksempel, hvis en ekstern bruker prøver å koble til datamaskinen din via ssh eller et nettsted sender deg innholdet når nettleseren ber om det. Alle disse pakkene vil havne i denne kjeden;
  • framover- denne kjeden brukes til å passere forbindelser. Dette inkluderer pakker som sendes til datamaskinen din, men som ikke er ment for det, de blir ganske enkelt videresendt over nettverket til destinasjonen. Som sagt observeres dette på rutere eller for eksempel hvis datamaskinen din distribuerer wifi;
  • produksjon- denne kjeden brukes til utgående pakker og tilkoblinger. Dette inkluderer pakker som ble generert når du prøver å pinge et nettsted eller når du starter nettleseren og prøver å åpne et hvilket som helst nettsted.

Men hvis du tror at du bare kan lukke Input-kjeden helt for å øke sikkerheten, så tar du veldig feil. Nettverket bruker både input- og output-kjeder. For eksempel prøver du å pinge, data sendes gjennom utdata, men svaret kommer gjennom input. Det samme skjer når du surfer på nettsteder og andre aktiviteter. Men foroverkjeden kan ikke brukes i det hele tatt hvis datamaskinen din ikke er en ruter. Så iptables-konfigurasjonen må gjøres veldig nøye.

Regler og handlinger

Før du går videre til å lage en liste over iptables-regler, må du vurdere hvordan de fungerer og hva de er. For hver type pakke kan du angi et sett med regler som vil bli sjekket etter tur for samsvar med pakken, og hvis pakken samsvarer, bruk handlingen spesifisert i regelen på den. Regler danner en kjede, så input, output og forward kalles kjeder, eller regelkjeder. Det kan være flere handlinger:

  • AKSEPTERER- la pakken passere videre langs kjeden av regler;
  • MISTE- fjern pakken;
  • AVVIS- avvis pakken, en melding vil bli sendt til avsenderen om at pakken ble avvist;
  • LOGG- lage en registrering om pakken i loggfilen;
  • - send en pakke til en tilpasset applikasjon.

Regler kan sjekke alle treff, for eksempel etter ip, etter mottaker- eller avsenderport, pakkehoder og mye mer. Hvis en pakke ikke samsvarer med noen av reglene, brukes standardhandlingen på den, vanligvis ACCEPT.

Når vi har funnet ut av reglene, kan vi gå tilbake til kjedene. I tillegg til de som er oppført ovenfor, er det to ekstra kjeder med regler:

  • forhåndsruting- pakken går inn i denne kjeden før den behandles av iptables, systemet vet ennå ikke hvor den vil bli sendt, for å legge inn, ut eller videresende;
  • postrouting- alle beståtte pakker som allerede har passert videresendingskjeden er inkludert her.

Men det er ikke alt. Vi har også iptables-tabeller, som det også er ønskelig å forstå.

Ipatables

Det er et annet abstraksjonsnivå over regelkjedene i iptables, og det er tabeller. Det er flere tabeller i systemet, og de har alle et standard sett med input-, forward- og output-kjeder. Tabeller brukes til å utføre ulike handlinger på pakker, for eksempel for modifikasjon eller filtrering. Nå er ikke dette så viktig for deg, og det vil være nok å vite at filtreringen av iptables-pakker utføres i filtertabellen. Men vi skal dekke dem alle:

  • - designet for å fungere med råposer, mens de ennå ikke er behandlet;
  • mangle- beregnet for å modifisere pakker;
  • nat- Gir nat til å fungere hvis du vil bruke datamaskinen som ruter;
  • filter- hovedtabellen for pakkefiltrering, brukt som standard.

Med nesten alt i teorien, la oss nå se på iptables kommandolinjeverktøy, som brukes til å administrere iptables-systemet.

Iptables-verktøyet

Iptables og netfilter-undersystemet er innebygd i kjernen, men et sett med verktøy for å administrere alt dette er ikke alltid levert med systemet. For å installere verktøyet på Ubuntu, skriv inn:

sudo apt installer iptables

På Fedora-baserte distribusjoner er iptables-installasjonen litt annerledes:

sudo yum installer iptables

Når iptables-installasjonen er fullført, kan du gå videre til konfigurasjonen, men la oss først se på verktøyets syntaks. Vanligvis ser kommandoen slik ut:

-t bord handling kjede Ekstra alternativer

La oss nå se på iptables-parametrene, tabellen indikerer tabellen som det skal jobbes med, denne parameteren kan utelates, handlingen er ønsket handling, for eksempel opprette eller slette en regel, og tilleggsparametrene beskriver handlingen og regelen vil bli fremført.

Det gjenstår å vurdere hovedhandlingene som iptables lar deg utføre:

  • -EN- legg til en regel i kjeden;
  • -MED- sjekk alle reglene;
  • -D- fjern regelen;
  • -JEG- sett inn en regel med det nødvendige nummeret;
  • -L- vis alle reglene i gjeldende kjede;
  • -S- vis alle reglene;
  • -F- slett alle regler;
  • -N- lage en kjede;
  • -X- slett kjeden;
  • -P- angi standardhandlingen.

Ytterligere alternativer for regler:

  • -s- spesifiser protokollen, en av tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp,
    mh;
  • -s- spesifiser ip-adressen til enheten som sender pakken;
  • -d- spesifiser mottakerens ip-adresse;
  • -Jeg- input nettverksgrensesnitt;
  • -o- utgående nettverksgrensesnitt;
  • -j- velg en handling hvis regelen samsvarer.

Nå kan du fortsette å se på eksempler på hvordan iptables er konfigurert.

Iptables-konfigurasjonseksempler

Vi vil gå over noen grunnleggende eksempler slik at du kan konsolidere det du leser ovenfor.

Liste over regler

La oss først se hvordan iptables-regeloppslaget utføres, -L-alternativet er nok for dette:

Du kan også spesifisere ønsket kjede for å vise regler bare for den:

iptables -L INPUT

Ryddingsregler

Du kan ikke bare deaktivere iptables ved å stoppe iptables-regeloppdateringstjenesten gjennom systemd eller til og med fjerne settet med konfigurasjonsverktøy. Undersystemet fungerer på kjernenivå og er ikke avhengig av hva du har installert der. Derfor, hvis du gjør noe galt, må du fjerne reglene. For å gjøre dette, kjør:

Eller bare for en bestemt kjede:

sudo iptables -F-inngang

La meg minne deg på at alle disse handlingene utføres for standardtabellen - filter.

Standard regler

Som jeg allerede sa, hvis ingen regel passer for en pakke, blir standardhandlingen brukt på den. Det kan stilles inn ved å bruke -p-alternativet:

sudo iptables -p INPUT ACCEPT
$ sudo iptables -p OUTPUT ACCEPT
$ sudo iptables -p FORWARD DROP

I dette eksemplet tillater vi INPUT- og OUTPUT-kjeder, men tillater ikke FORWARD.

Blokkering av pakker

For å blokkere pakker kan vi bruke DROP-handlingen, vi kan filtrere pakker som må blokkeres etter mange kriterier, for eksempel protokoll, ip-adresse, nettmaske, port og mye mer.

Slik vil kommandoen se ut, som lar deg legge til en iptables-regel for å blokkere alle innkommende pakker fra 10.10.10.10:

sudo iptables -A INPUT -s 10.10.10.10 -j DROP

Og nå utgående pakker til samme adresse:

IP-områdelåsing gjøres på lignende måte. For å gjøre dette må du bruke nettverksmasken 10.10.10.0/24. Disse vil være alle adresser fra 10.10.10.0 til 10.10.10.255:

sudo iptables -A INPUT -s 10.10.10.0/24 -j DROP

Eller en utvidet versjon av masken:

sudo iptables -A INPUT -s 10.10.10.0/255.255.255.0 -j DROP

Du kan også blokkere alle innkommende ssh-tilkoblinger:

sudo iptables -A INPUT -p tcp --dport ssh -s 10.10.10.10 -j DROP

Som du kan se, er det veldig enkelt å legge til en iptables-regel.

Fjerner regler

Sletting av iptables-regler utføres på samme måte som å lage nye, bare i stedet for alternativ A, må du bruke alternativ D. Se først på listen over regler:

Slik kan du for eksempel slette iptables-regelen som ble opprettet den andre:

sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

Du kan også fjerne iptables fullstendig ved å kjøre kommandoen med -F-alternativet:

En pålitelig brannmur er en av de viktigste aspektene ved å beskytte ethvert moderne OS. De fleste Linux-distribusjoner inneholder flere forskjellige brannmurverktøy. Denne opplæringen er dedikert til en av de mest populære - iptables.

Så iptables er standard brannmur inkludert i de fleste Linux-distribusjoner som standard (nftables utvikles for å erstatte den). Faktisk er iptables brukergrensesnittet for å administrere netfiltersystemet, som igjen administrerer Linux-nettverksstakken. iptables sammenligner hver innkommende pakke mot et sett med etablerte regler, og bestemmer deretter hva de skal gjøre med den neste.

Jeg snakket om nøyaktig hvordan iptables fungerer. Denne artikkelen fokuserer på praktiske eksempler som viser hvordan du lager et grunnleggende regelsett for en Ubuntu 14.04-server.

Grunnleggende iptables-kommandoer

Denne delen inneholder grunnleggende kommandoer som kan brukes til å lage et komplekst sett med regler og kontrollere iptables-grensesnittet som helhet.

Huske: iptables-kommandoer må kjøres med root-privilegier. Dette betyr at du må gjøre ett av følgende:

  • logg inn som root-bruker;
  • bruk su eller sudo -i for å utvide rotskallet;
  • start alle kommandoer med sudo (anbefalt på Ubuntu).

Denne veiledningen bruker det siste alternativet.

Så først må du se på listen over gjeldende iptables-regler. -L-flagget brukes til dette:

sudo iptables -L
Kjedeinngang (policy ACCEPT)


målprot opt-kildedestinasjon
Kjede OUTPUT (policy ACCEPT)
målprot opt-kildedestinasjon

Som du kan se, inneholder listen tre standardkjeder (INPUT, OUTPUT og FORWARD), som hver har en standardpolicy (for øyeblikket ACCEPT). Du kan også se navnene på kolonnene. Men denne listen inkluderer ikke selve reglene, da Ubuntu ikke kommer med et standardsett med regler.

Ved å bruke -S-flagget kan denne listen vises i et annet format som gjenspeiler kommandoene som kreves for å aktivere regler og retningslinjer:

sudo iptables -S
-P INNGANG GODKJENT
-P FRAM GODKJENT
-P OUTPUT ACCEPT

For å replikere konfigurasjoner, er alt du trenger å gjøre å skrive inn sudo iptables på begynnelsen av hver resultatlinje. (Avhengig av konfigurasjonene kan denne prosedyren være litt mer komplisert når du kobler til eksternt; hvis reglene for å tillate gjeldende tilkobling ikke allerede er satt, er det ikke verdt å angi DROP-policyen.)

For å tilbakestille gjeldende regler (hvis noen), skriv inn:

sudo iptables -F

Igjen, standardpolicyen er veldig viktig på dette tidspunktet, fordi den ikke vil bli endret med den forrige kommandoen, selv om alle regler vil bli fjernet fra kjedene.

Før du tilbakestiller reglene på en ekstern tilkobling, må du sørge for at ACCEPT-policyen er satt i INPUT- og OUTPUT-kjedene. Dette gjøres slik:

sudo iptables -P INPUT ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F

Når du har opprettet reglene for å tillate eksterne tilkoblinger, kan du angi DROP-policyen. Så la oss gå direkte videre til å lage regler.

Lage iptables-regler

Som nevnt ovenfor fokuserer denne opplæringen på å jobbe med INPUT-kjeden, siden den er ansvarlig for innkommende trafikk. Først må du vurdere den allerede nevnte regelen - regelen som tillater den nåværende SSH-tilkoblingen.

Det ser slik ut:

sudo iptables -A INPUT -m conntrack --ctstate ETABLISHED, RELATED -j ACCEPT

Selvfølgelig kan det virke utrolig vanskelig i starten; For å forstå denne regelen, sjekk ut dens komponenter:

  • -EN INNGANG: -A-flagget legger til ( legge til) regel på slutten av kjeden. Denne delen av kommandoen forteller iptables å legge til regelen på slutten av INPUT-kjeden.
  • -m conntrack: i tillegg til et sett med grunnleggende funksjoner, har iptables også et sett med utvidelser, eller moduler, som er ansvarlige for tilleggsfunksjonene til brannmuren. Denne delen av kommandoen sier at brukeren trenger tilgang til funksjonene til conntrack-modulen. Denne modulen lar deg bruke kommandoer til å bestemme hva du skal gjøre med en pakke basert på forholdet til tidligere tilkoblinger.
  • — Staten: en av kommandoene som er tilgjengelige når du kaller opp conntrack-modulen. Denne kommandoen lar deg spore forholdet mellom pakker og andre pakker som er sett tidligere. Den er satt til ETABLISHED (som lar den godta pakker som er en del av en eksisterende tilkobling) og RELATED (aksepterer pakker som er knyttet til en allerede etablert tilkobling). Det er denne delen av regelen som er ansvarlig for gjeldende SSH-sesjon.
  • jAKSEPTERER: indikerer handlingen (målet) som skal utføres på pakken som samsvarer med regelen. I dette tilfellet vil iptables godta pakker som oppfyller de tidligere kriteriene.

Denne regelen bør plasseres i begynnelsen for å sikre at eksisterende tilkoblinger samsvarer med reglene, blir akseptert og går ut av kjeden uten å nå DROP-reglene.

Ved å be om listen over regler kan du se endringene:

sudo iptables -L
Kjedeinngang (policy ACCEPT)
målprot opt-kildedestinasjon
GODKJEN ALLE - hvor som helst hvor som helst ctstate RELATED, ETABLERT
Kjede FREM (policy GODKJENNER)
målprot opt-kildedestinasjon
Kjede OUTPUT (policy ACCEPT)
målprot opt-kildedestinasjon

Nå som du er kjent med den grunnleggende syntaksen, lag noen flere regler som godtar en bli med.

Godta andre viktige forbindelser

Tidligere mottok iptables kommandoen om ikke å droppe alle gjeldende tilkoblinger, og også å godta alle tilkoblinger relatert til dem. Nå må du lage regler som godtar tilkoblinger som ikke oppfyller kriteriene ovenfor.

La to porter være åpne: SSH-porten (denne opplæringen bruker standardport 22; hvis denne verdien er endret, ikke glem å angi den nye verdien); i tillegg, anta at denne datamaskinen kjører en webserver på port 80 som standard (ikke legg til denne regelen hvis den ikke er det).

Så linjene som må brukes for å lage slike regler ser slik ut:

sudo iptables -A INPUT -p tcp --dport 22 -j GODKJENNER
sudo iptables -A INPUT -p tcp --dport 80 -j GODTAR

Som du kan se, er de veldig like den første regelen; kanskje de har en enda enklere struktur. Nye alternativer:

  • stcp: Dette alternativet tillater pakker som bruker TCP (en strømorientert protokoll som brukes av de fleste applikasjoner fordi den tillater pålitelig kommunikasjon).
  • dport: Dette alternativet er tilgjengelig ved å bruke flagget -p tcp. Den spesifiserer den inngående porten som pakkeporten skal samsvare med. Den første regelen lar TCP-pakker rettet til port 22 passere, og den andre regelen aksepterer TCP-trafikk rettet til port 80.

Nå må vi lage en annen ACCEPT-regel for å sikre at serveren fungerer som forventet. Vanligvis samhandler tjenester ved å utveksle pakker; for å gjøre dette bruker de et pseudo-ringnettverksgrensesnitt kalt en loopback-enhet, som ruter trafikk tilbake til kilden og ikke til andre datamaskiner.

Det vil si at hvis tjeneste 1 trenger å etablere en forbindelse med tjeneste 2 som lytter etter tilkoblinger på port 4555, sender tjeneste 1 en pakke til port 4555 ved hjelp av en tilbakekoblingsenhet. Denne oppførselen må tillates fordi den er avgjørende for at mange programmer skal fungere skikkelig.

For å gjøre dette, legg til følgende regel:

sudo iptables -I INNPUT 1 -i lo -j GODTAR

Det skiller seg litt fra de tidligere reglene; vurdere det mer detaljert:

  • JegINNGANG 1: -I-flagget forteller iptables å sette inn regelen. Dette flagget er forskjellig fra -A-flagget (som ganske enkelt legger til regelen på slutten av kjeden); den angir kjeden som regelen skal settes inn i og plasseringen av regelen i den. I dette tilfellet må regelen settes inn helt i begynnelsen av INPUT-kjeden, som et resultat av at alle regler vil flytte en posisjon. Denne regelen bør plasseres i begynnelsen av kjeden, siden den er en av hovedreglene og ikke bør avhenge av andre.
  • Jeglo: Denne regelkomponenten lar pakker som bruker lo-grensesnittet passere ("lo" er et annet navn for en tilbakekoblingsenhet). Dette betyr at enhver pakke som bruker dette grensesnittet må aksepteres.

For å se gjeldende regler, bruk -S-flagget, siden -L-flagget ikke viser noe informasjon (for eksempel grensesnittet som regelen er bundet til, som er veldig viktig i tilfellet med den siste regelen):

sudo iptables -S
-P INNGANG GODKJENT
-P FRAM GODKJENT
-P OUTPUT ACCEPT
-A INNGANG -i lo -j GODTAR
-A INPUT -m conntrack --ctstate RELATED, ETABLISHED -j ACCEPT
-A INNGANG -p tcp -m tcp --dport 22 -j GODKJENNER
-A INNGANG -p tcp -m tcp --dport 80 -j GODKJENNER

Opprette DROP-regler

Så for øyeblikket er det laget 4 regler som aksepterer pakker basert på visse kriterier. Serveren blokkerer imidlertid ikke andre pakker for øyeblikket.

Hvis en pakke krysser INPUT-kjeden og ikke oppfyller noen av de fire reglene, vil standardpolicyen (ACCEPT) bli utført, som på en eller annen måte vil akseptere denne pakken. Nå må det endres.

Dette kan gjøres på to måter, som har betydelige forskjeller.

Den første måten er å redigere standard INPUT-kjeden; for å gjøre dette, skriv:

sudo iptables -P INPUT DROP

Denne policyen vil overvåke og forkaste alle pakker som ikke samsvarer med noen av reglene i INPUT-kjeden. En av konsekvensene av denne typen konstruksjon er at den vil slippe pakker selv etter at selve reglene er tømt.

Selvfølgelig øker dette sikkerhetsnivået til serveren; Dette kan imidlertid få alvorlige konsekvenser hvis brukeren ikke har noen annen måte å koble seg til serveren på. Oftere enn ikke tilbyr vertsleverandører en nettkonsoll for å koble til serveren i tilfelle slike problemer. Denne konsollen fungerer som en virtuell lokal tilkobling, så iptables vil ikke svare på den.

Du kan få serveren til å avbryte forbindelsen automatisk hvis reglene fjernes. Dette vil gjøre serveren sikrere og vanskeligere tilgjengelig. Det betyr også at du kan legge til regler på slutten av kjeden, og alle uønskede pakker vil bli droppet.

En alternativ tilnærming er å legge til en regel på slutten av kjeden for å forkaste alle ikke-matchende pakker samtidig som ACCEPT-policyen opprettholdes.

For å returnere ACCEPT-policyen til INPUT-kjeden, skriv inn:

sudo iptables -P INPUT ACCEPT

Nå kan du legge til en regel på slutten av denne kjeden som sletter alle ikke-matchende pakker:

sudo iptables -A INPUT -j DROP

Under normale driftsforhold vil resultatet være nøyaktig det samme som ved bruk av DROP-policyen. Denne regelen forkaster hver pakke som når den, noe som forhindrer pakker som ikke samsvarer med de spesifiserte reglene fra å nå serveren.

I utgangspunktet brukes den andre tilnærmingen når det er nødvendig å bevare ACCEPT-policyen som aksepterer trafikk. Det vil si at selv om alle reglene er slettet, kan brukeren fortsatt få tilgang til maskinen på nettverket. Denne tilnærmingen lar standardhandlingene utføres uten å måtte endre policyen som skal brukes på den tomme kjeden.

Dette betyr selvfølgelig også at enhver regel som må settes inn på slutten av kjeden må komme før forkastningsregelen. Dette kan gjøres enten ved å midlertidig fjerne tilbakestillingsregelen:

sudo iptables -D INPUT -j DROP
sudo iptables -A INPUT new_rule
sudo iptables -A INPUT -j DROP

eller ved å sette inn en ny regel på slutten av trinnet (men før tilbakestillingsregelen), spesifisere linjenummeret. For å legge til en regel på linje 4, skriv inn:

sudo iptables -I INPUT 4 new_rule

Hvis det er mange regler, er det ganske problematisk å beregne linjenummeret manuelt; i dette tilfellet kan iptables nummerere linjene:

sudo iptables -L --linjetall
Kjedeinngang (policy DROP)

1 GODKJENT alt - hvor som helst hvor som helst
2 GODKJEN ALLE - hvor som helst hvor som helst ctstate RELATED, ETABLERET
3 ACCEPT tcp - hvor som helst hvor som helst tcp dpt: ssh
4 ACCEPT tcp - hvor som helst hvor som helst tcp dpt: http
Kjede FREM (policy GODKJENNER)
num mål prot opt ​​kildedestinasjon
Kjede OUTPUT (policy ACCEPT)
num mål prot opt ​​kildedestinasjon

Dette sikrer at regelen er lagt inn på riktig linje.

Lagrer iptables-innstillinger

Som standard forblir alle ulagrede regler i kraft til neste server omstart; ulagrede regler vil gå tapt umiddelbart ved omstart.

I noen tilfeller er dette nyttig fordi det lar brukere som ved et uhell har låst seg ute, få tilgang til serveren. Imidlertid er det i de fleste tilfeller mer praktisk å lagre reglene og laste dem når serveren starter.

Dette kan gjøres på flere måter; den enkleste er å bruke iptables-persistent-pakken, som kan lastes ned fra standard Ubuntu-depot:

sudo apt-get oppdatering
sudo apt-get install iptables-persistent

Under installasjonen vil pakken spesifisere om du vil lagre gjeldende regler for videre automatisk lasting; hvis de gjeldende reglene har blitt testet ( lar deg opprette SSH-forbindelser) og oppfyller alle kravene, kan du lagre dem.

Når installasjonen er fullført, vil en ny tjeneste kalt iptables-persistent vises som starter når serveren startes på nytt og gjenopptar de angitte reglene.

Utfall

Denne veiledningen hjelper deg med å konfigurere brannmuren i henhold til brukerens krav. Selvfølgelig er det mange flere slike verktøy, og noen av dem kan være enklere å bruke; iptables er imidlertid et av de beste verktøyene der ute, om ikke annet fordi det demonstrerer noen av de grunnleggende strukturene til netfilter og er inkludert i mange systemer.

Tags:,

Flere ganger har jeg vært borti at selv folk som generelt ikke er dumme gjør absolutt utilgivelige feil. For eksempel åpner de porten som databasen kjører på til hele Internett. Dette er ofte tilfellet for DevOps-nybegynnere som har kodet hele livet, og nå inkluderer deres ansvar å sette opp servere også. Det er gode opplæringsprogrammer på nettet om grunnleggende brannmuroppsett i Linux og andre *nix, men ofte er dette ark for mange skjermer. Så forhåpentligvis vil noen finne denne mer konsise veiledningen nyttig.

Viktig! Det er veldig lett å feilaktig fyre av en bil på en slik måte at du ikke kommer inn i den igjen. Dette gjelder spesielt for nettskyhosting. For eksempel, hvis du i AWS lukker alle porter fra 1024 til 65536, stenges maskinen av en eller annen grunn etter en omstart. generelt alle havner. Hvis du er vert i skyene, er det best å konfigurere brannmuren gjennom det vertsbaserte webgrensesnittet.

Et raskt notat om terminologi. Brannmuren innebygd i Linux-kjernen kalles Netfilter, og iptables er verktøyet for å administrere denne brannmuren. Mange tror feilaktig at brannmuren kalles iptables. Dette er ikke sant. Å si noe som "Jeg filtrerer pakker med iptables" viser andre at du er analfabet.

Generelt, hvilke oppgaver kan løses med Netfilter:

  • Tillat / nekt innkommende trafikk til spesifikke porter ved å bruke spesifikke protokoller (IPv4 / IPv6, TCP / UDP) fra spesifiserte adresser (IP, MAC) eller subnett;
  • Alt er likt for utgående trafikk;
  • Du kan for eksempel fullstendig ignorere alle ICMP-pakker;
  • Konfigurerer NAT, se artikkelen om en Raspberry Pi-ruter;
  • Jeg hørte at ekte guruer kan sette opp beskyttelse mot DDoS og brute force, begrense nettverkstilgang til spesifikke applikasjoner, brukere eller grupper, og gjøre andre sprø ting;

Merk at iptables-verktøyet virket for meg til å begynne med ekstremt upraktisk sammenlignet med ipfw i FreeBSD. Heldigvis, etter å ha jobbet med det en stund, blir alle disse mange flaggene som -A, -D, -j og andre kjent, så vær tålmodig. La oss ta en titt på hovedkommandoene.

Vis alle regler:

iptables -L -n

Du legger kanskje merke til at Netfilter har en slags "kjeder" - i hvert fall INPUT, OUTPUT og FORWARD. Jeg personlig har også en Docker-kjede på bilen min. For første gang kan du tenke på de to første som henholdsvis all innkommende og utgående trafikk, og midlertidig glemme resten. Sjansen er stor for at du aldri vil trenge dem i det hele tatt.

Fjern alle regler:

iptables -F

Endre policy (standard atferd) kjede:

iptables -P INPUT DROP
iptables -P INPUT ACCEPT

Nekt tilgang fra vert/subnett:

iptables -A INPUT -s 123.45.67.89 -j DROP
iptables -A INPUT -s 123.45.0.0/ 16 -j DROP

Du kan også bruke domenenavn:

iptables -A INPUT -s example.com -j DROP

Sperring av utgående tilkoblinger:

iptables -A OUTPUT -d 123.45.67.89 -j DROP

Negativer kan brukes i regler:

iptables -EN INNGANG! -s 123.45.67.89 -j DROPPE

Slette en regel etter nummeret i kjeden:

iptables -D INPUT 1

Fjerne en regel basert på hva den gjør:

iptables -D INPUT -s 123.45.67.89 -j DROP

Alternativet -p indikerer protokollen. Du kan bruke alle, icmp, tcp, udp eller protokollnummeret fra / etc / protokoller. Flagg - -sport indikerer porten som pakken ble sendt fra, og - -dport angir destinasjonsporten:

iptables -A INPUT -p tcp --sport 80 -j GODTAR
iptables -A INPUT -p tcp --dport 80 -j GODTAR

Sett inn en regel i begynnelsen av en kjede:

iptables -I INPUT ...

Eller du kan spesifisere en spesifikk stilling:

iptables -I INPUT 3 ...

iptables-save> / etc / iptables.rules

Gjenopprett regler:

iptables-restore< / etc/ iptables.rules

La oss nå se på noen praktiske eksempler. Dette er for eksempel emuleringen av en nettdeling i en test som sjekker oppførselen til en applikasjon som bruker Akka Cluster:

løp (node1, s "iptables -A INPUT -s $ node2 -j DROP")
løp (node1, s "iptables -A INPUT -s $ node3 -j DROP")
løp (node1, s "iptables -A OUTPUT -d $ node2 -j DROP")
løp (node1, s "iptables -A OUTPUT -d $ node3 -j DROP")

Gjenopprettingen er nøyaktig den samme, bortsett fra at -A-flagget erstattes med -D-flagget.

Et annet eksempel. Det kreves å finne ut hvilke porter som lytter på maskinen og lukke de ekstra. Vi går til bilen og sier:

netstat -tuwpln

Eksempel på utdata:

Aktive Internett-tilkoblinger (bare servere)
Proto Recv-Q Send-Q Lokal adresse Utenlandsk adresse Status PID / Prog navn
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 3210 / nginx
tcp 0 0 0.0.0.0:4369 0.0.0.0:* LYTT 1789 / epmd
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 797 / sshd
tcp 0 0 127.0.0.1:5432 0.0.0.0:* LYTT 990 / postgres

Nginx og SSHd surfer på internett, det er greit. PostgreSQL lytter kun til det lokale grensesnittet, så det er heller ikke noe problem med det. Men epmd-en stikker ut (du kan sjekke den med telnet fra en annen maskin), og dette er ikke bra. Du kan bare lukke port 4369. Hvordan du gjør dette ble vist ovenfor. Eller du kan gå enda lenger og nekte alle forbindelser fra utsiden til port 81 og eldre.