Linux-brannmuren

Det finnes flere brannmurprogrammer for Linux, men det du kanskje ikke skjønner er at i hjertet av alle disse programmene er et enkelt allmektig program som er bygget rett inn i Linux Kernel: iptables. Dette er Linux brannmur. Uansett hvilket program du bruker til å konfigurere brannmuren din under Linux, kommer den til slutt til iptables. Alt som disse andre programmene gjør er å konfigurere det.

Så, her kommer spørsmålet: Hvis disse programmene bare konfigurerer iptables, hvorfor ikke bare konfigurere det direkte selv? Å gjøre det er lettere enn du kanskje tror!


Nettverksbakgrunn

Hvis du er kjent med nettverksvilkår, for eksempel tilkoblinger, IP, TCP og Port, er du velkommen til å hoppe videre til neste trinn. Ellers, hvis du er ny på nettverk, les videre for å bli kjent med vilkårene du må forstå for å følge med denne opplæringen.

Vær oppmerksom på at vilkårene og definisjonene nedenfor har blitt tilsiktet overforenklet. De er ment for hverdagsbrukere, ikke sysadminer. Så hvis du er en erfaren sysadmin eller du har en CCNA i lommen, vennligst unnskyld meg for ikke å gå inn i detaljene.

TCP / IP

TCP / IP er en protokoll som tillater datamaskiner å kommunisere med hverandre via Internett og Ethernet-nettverk.

Feil er siste utvei.

Tenk deg en Ethernet-nettverk som et lite lokalt nettverk (LAN - lokalnettverk), som hjemme PC, bærbar PC og smart telefon. Det er et lite heterogent nettverk som er isolert fra resten av verden. Et nettverk av slike nettverk er det vi alle vet som Internett: et sett med sammenkoblede nettverk.

TCP / IP er en kombinasjon av to protokoller som fungerer på forskjellige nivåer i hierarkiet til nettverkskommunikasjonskjeden. Vi vil ikke dykke inn i detaljer om det hierarkiet. TCP står for Overføringsprotokoll, og dens hovedansvar er å sikre at kommunikasjonen lykkes. Det styrer korrektheten av dataene som sendes, og sikrer suksess. Det har forskjellige algoritmer for å utføre sofistikerte kontrollsummer, autokorreksjon og forsøk. Feil er siste utvei. Navnet, IP kommer fra Internet Protocol. Du kan best knytte det til "telefonnummeret" på din PC. Hver maskin som er i stand til å kommunisere over Internett må ha en IP-adresse - et unikt telefonnummer - slik at kommunikasjonspakker kan finne sine destinasjoner. EN pakke er et lite stykke data i en kommunikasjonsstrøm, som er selvstendig og kan kontrolleres for korrekthet. I hovedsak kan vi si at våre datamaskiner sender TCP-pakker over Internett ved hjelp av IP-protokollen.

Hver nettverkskommunikasjon er bundet til en bestemt havn. Nettverksportene varierer fra 0 til 2 ^ 16 (65536). Hver nettverksforbindelse har en utgående port for den som initierer den, og en innkommende port for den som lytter etter andre datas meldinger. Det kan være flere koblinger mellom flere datamaskiner over identiske porter. En datamaskin kan imidlertid snakke over flere porter samtidig. Så i utgangspunktet er porter gode til å identifisere tjenester og definere kanaler for kommunikasjon, men de begrenser ikke mengden data eller tilkoblinger.

Noen datamaskiner kan ha lignende IP-adresser. Du har kanskje observert at både datamaskinen hjemme og på jobben har IP-adresser som tar form av noe i tråd med 192.168.something.something, eller 10.0.something.something, eller 172.16.something.something. Dette er de såkalte private IP-adressene som bare kan brukes i ditt LAN. Du kan ikke gå ut på Internett med IP-adresser som dette. De er knyttet til innvendige tall for bedriftens telefonnettverk.

Gateway & Bridge

EN Bro er hvilke datamaskiner med ekte (offentlige) IP-adresser som sendes til Internett.

I hovedsak har disse datamaskinene rettighetene og evnen til å snakke med hverandre direkte på Internett. Men siden det ikke er noen direkte forbindelser mellom alle datamaskiner i verden (det ville være ganske vanskelig å oppnå), er broer ansvarlige for å koble segmenter av Internett.

Holde vår telefoni analogi i live, kan du forestille deg at disse broene er lik telefonstasjonene i din by eller nabolag. Hvis du ringer til et annet lokalt nummer (datamaskinene til venstre i skjemaet), kunne kommunikasjonen ha blitt gjort direkte av telefonsentralen ved å koble linjen din med naboen din. Men hvis du i stedet vil ringe din fjerne onkel Bob, måtte du ringe videre over flere telefonsentre til onkelens telefon kunne være tilkoblet. Disse danner a bro mellom byen og byen.

EN Inngangsport er en måte for datamaskiner fra et privat nettverk (LAN med private IP-adresser) for å kommunisere med andre datamaskiner på Internett.

Et privat nettverk er som bedriftens private telefonnettverk. Du kan ringe innvendige numre, men for å ringe til noen som er utenfor bedriftens nettverk - som din kone hjemme - må du først ringe et spesielt nummer eller prefiks.

Datamaskiner fungerer faktisk på samme måte. Når du er på et privat nettverk, har du en såkalt gateway-datamaskin. Når datamaskinen forsøker å snakke med en annen datamaskin på Internett, vil det auto Ta kontakt med gatewayen først og be om "en linje" til omverdenen. Gatewayen vil snakke med datamaskinen som er funnet på Internett, og vil videresende meldingen tilbake til datamaskinen. Du, som en vanlig bruker, ser ingen forskjell mellom en bro og en gateway. Datamaskinen din vil vite hvordan du skal håndtere dem.


Definisjon av en brannmur

En brannmur er et program som kjører på en Gateway, Bridge eller PC / Laptop / Smartphone som er i stand til å filtrere innkommende, utgående og videresendte nettverkspakker. En brannmur er egentlig et verktøy som lar deg begrense deg eller nettverket ditt tilgang til Internett, og andres tilgang fra Internett til nettverket ditt.

Og ja, din kabelrouter eller hjemme Wi-Fi er faktisk en brannmur for alle datamaskiner og gadgets som kobles til Internett gjennom det.


Problemet vi vil løse

For å sette sammen konteksten, kan vi forestille oss en veldig mulig nettverksarkitektur. Jeg har sett mange små selskaper som kjører noe som ligner på dette.

Det vi har her er faktisk noe ganske enkelt:

  • Noen datamaskiner og andre nettverkstilkoblede enheter - de grønne boksene
  • En e-postserver - den røde boksen
  • En Microsoft Active Directory-server - den blå boksen
  • En gateway, som også er en brannmur, for vårt nettverk som kjører Linux - den svarte boksen
  • Mellom alle disse er en enkel nettverksbryter

I det følgende avsnittet konfigurerer vi iptables på den gatewayen slik at alle enheter i nettverket kan koble seg til Internett. Det vil tillate oss å koble til det via SSH, og tillate at eksterne e-postservere kommer til postserveren i vårt nettverk - en datamaskin som ikke engang har en offentlig IP-adresse; bare en privat.


Iptables-komponenter

Iptables 'navn har faktisk en mening i funksjonaliteten. Det er et sett med tabeller med IP-adresse og porter med noen handlinger knyttet til dem. Iptable er disse tabellene referert til som kjeder. En ukonfigurerte, tomme iptables kan se slik ut:

csaba ~ # iptables -L Chain INPUT (policy ACCEPT) mål prot opt ​​kilde destinasjon Kjede FORWARD (policy ACCEPT) mål prot opt ​​kilde destinasjon Kjede OUTPUT (policy ACCEPT) mål prot opt ​​kilde destinasjon

Du kan observere at det er tre hovedkjeder:

  • INPUT - alle innkommende tilkoblinger
  • FRAMOVER - forbindelser som går gjennom
  • PRODUKSJON - forbindelser som går fra denne serveren

Begrepet "politikk aksepterer"i parentes betyr at ACCEPT er angitt som standardpolicy for den aktuelle kjeden. Så når det ikke er noen kamp for en tilkobling, vil denne regelen bli brukt. Det er tre hovedkonsepter du kan bruke når du konfigurerer brannmuren:

  • standardpolicy ACCEPT & benekt selektivt alt du trenger - Det kan være vanskelig å spesifisere alt det det blir nektet. Jeg anbefaler ikke denne tilnærmingen.
  • standard policy DROP eller REJECT & tillat selektivt alt du trenger - Dette er bedre, men det har et problem. Hvis du gjør en feil i din iptables-konfigurasjon, kan du enkelt forbli med tomme kjeder som nekter tilgang til alt og alle, inkludert deg. Så, med mindre du alltid har fysisk tilgang til brannmuren / datamaskinen, anbefaler jeg at du bruker neste tilnærming.
  • standardpolicy ACCEPT & en eksplisitt policy for å DROP alle og deretter tillate selektivt alt du trenger - Dette er en kombinert løsning mellom de to første mulighetene. Det vil bruke en ACCEPT-standardpolicy, så hvis noe går galt, kan du logge deg tilbake over SSH eller hvilken ekstern tilkobling du bruker for brannmuren. Samtidig sikrer en eksplisitt DROP-regel for uovertruffen tilkobling at du er trygg. Å tillate bare det du vet om og faktisk trenger å bruke, gir best mulig beskyttelse.

Legge til regler for Iptables

Det er to måter å legge til en ny regel på iptables. Den ene er å sette den inn i starten av en kjede. Det andre alternativet er å legge det til enden av en kjede. Hvorfor er det noe i hvilken rekkefølge reglene skjer?

Viktig: iptables sjekker reglene i en kjede fra topp til bunn. Det stopper søket ved første kamp.

Du må utforme reglene dine på en slik måte å vurdere den ovenfor nevnte oppførselen til iptables. Etter den første kampen i en regel, vil iptables ta de tiltakene som er angitt av regelen, og deretter avbryte søket. Hvis ingen regel samsvarer med tilkoblingen som er merket, gjelder standardpolicyen.

Sette inn en ny regel

La oss si at vi vil legge til en regel i våre iptables som vil tillate noen å koble til port 22 på brannmuren. Port 22 er porten for SSH-protokollen. Selvfølgelig vil en god serveradministrator forandre denne porten til noe uventet av åpenbare sikkerhets- / uklarheter, men det er en annen historie for en annen opplæring. Vi vil holde fast med 22.

csaba ~ # iptables -I INPUT -i eth0 -p tcp --port 22 -j ACCEPT csaba ~ # iptables -L Kjede INPUT (policy ACCEPT) mål prot opt ​​kilde destinasjon ACCEPT tcp - hvor som helst tcp dpt: ssh

Jeg antok at IP-adressen mot Internett med den offentlige IP på den er på nettverksgrensesnittet, kalt eth0. La oss dissekere denne kommandoen:

  • -Jeg - står for å sette inn regelen
  • INPUT - angir ønsket kjede
  • -Jeg - står for nettverksgrensesnitt - i vårt tilfelle, eth0
  • -p - er for protokoll (tcp eller udp)
  • --dport 22 - er for destinasjonsport 22 - den har en tilsvarende --sport versjon for kildeport verifisering
  • -j - faktisk kommer fra "hoppe", og følges av en handling - i vårt tilfelle, handlingen for å godta forbindelsen

Du kan imidlertid allerede ha glemt at denne regelen har liten effekt på dette tidspunktet. Vår standardpolicy er ACCEPT, slik at akseptere noe eksplisitt ikke gir oss noen ekstra funksjonalitet. Nå husk den tredje anbefalte måten å sette opp brannmuren: Den eksplisitte regelen om å nekte alt som ikke samsvarer. La oss legge til regelen.

Appendiksregler

Vi vil legge til en regel som blokkerer innkommende trafikk. Men vær forsiktig: vi vil bare blokkere det som kan være skadelig. Hvis vi blokkerer alt, vil vi ikke kunne gjøre noe, fordi svarene på våre forespørsler vil bli avvist. For eksempel, når du surfer på en nettside, gjør du en forespørsel, så mottar du et svar. Dette svaret kommer inn i datamaskinen din, så på INPUT-kjeden må vi ha en regel for å tillate det.

Først vil vi legge til en regel for å godta innkommende trafikk for allerede etablerte forbindelser, for eksempel svar på forespørsler.

csaba ~ # iptables -A INPUT -i eth0 -m conntrack --ctstate OPPSTILLET, RELATERT -J ACCEPT csaba ~ # iptables -L Chain INPUT (policy ACCEPT) mål prot opt ​​kilde destinasjon ACCEPT tcp - hvor som helst tcp dpt: ssh ACCEPT alle - hvor som helst hvor som helst ctstate relatert, etablert

Nå som vi har sikret våre eksisterende forbindelser og svarene på forbindelsene vi startet, kan vi nekte alt annet som ikke var i samsvar.

csaba ~ # iptables -A INPUT -i eth0 -p tcp -j DROP csaba ~ # iptables -L Kjede INPUT (policy ACCEPT) mål prot opt ​​kilde destinasjon ACCEPT tcp - hvor som helst tcp dpt: ssh ACCEPT alle - hvor som helst ctstate RELATERTE, STEDET DROP tcp - hvor som helst

Vi har lagt til en annen linje, med en regel å DROP alle tilkoblinger som samsvarer. Husk: Denne regelen gjelder bare hvis ingen av de foregående faktisk samsvarer.

Det er to måter å nekte tilkoblinger på.

  1. Du kan bruke DROP, som tilsvarer å ringe et ikke-eksisterende telefonnummer med den forskjellen at etter en tid vil nettverksforbindelsen gå ut. Med et telefonnummer informerer en robot deg om at nummeret ikke eksisterer. Men sluttresultatet fra synspunktet til den som ringer er det samme: det mener at destinasjonen ikke eksisterer.
  2. Den andre måten å nekte forbindelsen er med regelen, REJECT, og en valgfri melding. Dette er analogt med nummeret du prøver å ringe, er opptatt. Du kan kanskje vite at det er et nummer, du vet at det kan ringes, men det nekter bare å ringe. Eventuelt kan du gi en melding med en REJECT-regel; standard er "ICMP-porten ikke tilgjengelig" eller noe lignende.

Tillat datamaskiner å få tilgang til Internett

På dette tidspunktet har vi noen grunnleggende regler for INPUT-kjeden. Men vi har et nettverk av datamaskiner som har private IP-adresser. Vi må gi en gateway til Internett. Dette gjøres også av iptables: brannmuren.

Nettverksadresseoversettelse (NAT)

Sannsynligvis har du allerede hørt dette begrepet: NAT. Dette refererer til prosedyren for å oversette en nettverksadresse til en annen og videresende informasjonen mellom de to. Den brukes hyppigst i arkitekturer som vår egen. Gatewayen må gjøre NAT for å oversette hvilken som helst datamaskinens IP fra LAN til sin egen offentlige IP og deretter tilbake.

Ruting er prosedyren som et system kan finne ut på hvilke nettverksgrensesnitt og mot hvilken gateway den kan kommunisere for å nå målet. Hver datamaskin har et rutetabell av seg selv for å bestemme dette. Iptables kan hekte inn i denne ruteprosedyren på to forskjellige punkter: før og etter at prosedyren har skjedd.

Nating med Iptables

csaba ~ # iptables -t nat -A POSTROUTING -o eth0 -j SNAT - til-kilde 89.72.31.243

Denne kommandoen legger til en regel som POSTROUTING til NATing-tabellen (-t nat). POSTROUTING betyr i hovedsak at pakkene først passerer rutemekanismen på gatewayen, og først etter det blir de endret. Regelen -j SNAT betyr kilde NAT; Kilden til pakkene vil bli endret til adressen på grensesnittet angitt av -o eth0 - i vårt tilfelle, til IP-adressen som er angitt av alternativet, --til-kilde. Så, alle som kontaktes av en datamaskin i nettverket ditt, antar at det snakker direkte til gatewayen din. Det er absolutt ingen anelse om at pakkene er bestemt for en annen datamaskin. Gatewayen, ved hjelp av iptables, vil holde en intern liste over alle de oversatte IP-adressene, og når et svar kommer, vil det gå tilbake til endringen og sende svaret til datamaskinen inne i nettverket.


Tillat kunden fra Internett til e-postserveren

Et annet problem vi møter er hva vi skal gjøre når vi har en server som ligger bak en brannmur. Vi må tillate kundene, som kommer fra Internett, å kommunisere med serveren vår på en eller annen måte. Dette er tilfellet med vår mail server. Når en e-post ankommer som må leveres til en e-postkonto på vår server, må den sende e-postserveren koble til vår mottaker en.

Men vår e-postserver har bare en privat IP-adresse. Det er ingen måte at en ekstern datamaskin kan koble seg til den direkte. På den annen side har gatewayen vår en ekstern IP som alle kunne koble til. Løsningen? Åpne en port på gatewayen vår slik at en forespørsel fra Internett til den porten faktisk vil gå til vår e-postserver. Svaret, selvfølgelig, vil reise gjennom gatewayen tilbake til klienten. Trikset er å bruke en annen type NAT her, kalt Destinasjon NAT. Dette endrer pakkedestinasjonen og deretter vender dem tilbake når svaret oppstår. Tenk på DNAT som omvendt av SNAT.

Tips: Du kan kanskje kjenne denne funksjonen som "Virtual Server", hvis du noen gang har spilt rundt med små hjemme rutere.

csaba ~ # iptables -t nat -A PREROUTING -i eth0 -p tcp --port 25 -j DNAT - til destinasjon 192.168.1.2:25

Så hva skjer her? En pakke kommer inn i porten vår på port 25 (porten som brukes til SMTP, e-postprotokollen hele Internett bruker). Regelen ovenfor fanger denne pakken på grunn av --dport 25 alternativ, som i utgangspunktet sier "Match alt som går til denne porten på grensesnittet angitt av -jeg eth0. Nå som pakken er tilpasset, endrer du målet fra den nåværende maskinen (gatewayen) til den som er spesifisert av --til-mål."Vær oppmerksom på at du kan spesifisere porten eksplisitt etter IP-adressen ved å skille den med et kolon.

Endelig merk at dette er i PREROUTING-kroken. Destinasjonen må endres før rutingen faktisk finner sted. Ellers vil pakkene ende opp på gatewayen og finne ingen vei til postserveren.


Vedvarende iptables-konfigurasjon

Reglene du legger inn eller legger til iptables er i minnet. Etter en omstart, spoof: alt er borte! For å lagre konfigurasjonen din, bør du dumpe den i en fil, slik som:

csaba ~ # iptables-save> /some/directory/my_rules.fw

Filens navn spiller ingen rolle, heller ikke utvidelsen. For å gjenopprette reglene, kjør denne kommandoen når datamaskinen starter.

iptables-restor < /some/directory/my_rules.fw

Hvis du ser på det lagrede innholdet, ser du at de er de samme parameterne som vi brukte med iptables-kommandoene. Det er noen mindre forskjeller, men du kan lett forstå den lagrede filen, og kan til og med skrive dine egne slike filer for hånd og laste dem.


Siste tanker

Til slutt, her er noen tanker om når og da ikke å bruke en brannmur med en Linux-datamaskin.

Bruk en brannmur på Linux når du konfigurerer en server (som en gateway i vårt eksempel), eller når du har en datamaskin med viktig informasjon om den som er direkte eksponert for Internett. Før du hopper på for å konfigurere dine iptables, bør du vurdere den potensielle faren. Spør deg selv: Er datamaskinen min kjent på Internett? Det er noen få milliarder datamaskiner der ute. Hvis din er bare en, er sjansen for å bli målrettet utrolig lav. Er det folk som er interessert i informasjonen din? Hackere spilder ikke tid med å stjele tilfeldige data i håp om at de kan finne noe. De vet vanligvis hva de leter etter, og målretter deretter mot datamaskinene som inneholder ønsket informasjon. Selvfølgelig er det utallige angrep mot tilfeldige datamaskiner som prøver å installere en slags orm eller virus, men på Linux er du immune av design.

Ikke kast bort tiden din med å konfigurere en brannmur på Linux når det er en datamaskin som alltid ligger bak en brannmur, for eksempel hjemme-PCen din bak hjemme-ruteren din, eller når du ikke har noen spesielt viktig informasjon på din bærbare datamaskin. Hvis du beholder tjenestene som lytter på nettverket til et minimum og har et anstendig sikker passord, kan du glemme brannmuren. Jeg har ingen personlig datamaskin, bærbar datamaskin eller smarttelefon med en brannmur som kjører. Jeg har imidlertid en hjemmestyring med en godt konfigurert brannmur.

Jeg tror du kan sikkert bruke disse ideene til Mac OSX også. Hvis du er en Windows-bruker, beklager: En brannmur er din første forsvarslinje. For Linux eller MacOSX er en brannmur din siste forsvarslinje. Et nøye utvalgt passord og ikke kjører ubrukelig tjenester bør håndtere hoveddelen av datamaskinens beskyttelse.

Takk for at du leste. spørsmål?