Linux-brandväggen

Det finns flera brandväggsprogram för Linux, men vad du kanske inte inser är att i hjärtat av alla dessa program är en enda allmäktig applikation som är byggd direkt in i Linux-kärnan: iptables. Det här är Linux-brandväggen. Oavsett vilket program du använder för att konfigurera din brandvägg under Linux, kommer det slutligen allt till iptables. Allt som dessa andra program gör är att konfigurera det.

Så här kommer frågan: Om de här programmen bara konfigurerar iptables, varför inte bara konfigurera det direkt själv? Att göra det är lättare än du kanske tror!


Nätverksbakgrund

Om du är bekant med nätverksvillkor, till exempel anslutningar, IP, TCP och Port, är du välkommen att gå vidare till nästa steg. Annars, om du är ny på nätverket, läs vidare för att bekanta dig med de villkor som du behöver förstå för att följa med den här handledningen.

Observera att villkoren och definitionerna nedan har blivit avsiktligt förenklade. De är avsedda för alla användare, inte sysadminer. Så om du är en kryddat sysadmin eller om du har en CCNA i din ficka, ursäkta mig för att du inte kommer in i detaljerna.

TCP / IP

TCP / IP är ett protokoll som tillåter datorer att kommunicera med varandra via Internet och Ethernet-nätverk.

Fel är den sista utväg.

Föreställ dig en Ethernet-nätverk som ett litet lokalt nätverk (LAN-lokalnätverk), som din hem-dator, bärbar dator och smartphone. Det är ett litet heterogent nätverk som är isolerat från resten av världen. Ett nätverk av sådana nätverk är vad vi alla vet som internet: en uppsättning sammankopplade nätverk.

TCP / IP är en kombination av två protokoll som arbetar på olika nivåer i hierarkin för nätverkskommunikationskedjan. Vi kommer inte att dyka in i detaljer om den hierarkin. TCP står för Transfer Control Protocol, och dess kärnansvar är att se till att kommunikationen är framgångsrik. Det styr korrektheten hos de data som skickas och säkerställer dess framgång. Det har olika algoritmer att utföra sofistikerade kontrollsummor, autokorrigering och försök igen. Fel är den sista utväg. Namnet, IP kommer från Internet Protocol. Du kan bäst associera den med "telefonnummer" på din dator. Varje maskin som kan kommunicera via Internet måste ha en IP-adress - ett unikt telefonnummer - så att kommunikationspaket kan hitta sina destinationer. en paket är en liten bit av data i en kommunikationsström, som är självständig och kan kontrolleras för korrekthet. I huvudsak kan vi säga att våra datorer skickar TCP-paket via Internet via IP-protokollet.

Varje nätverkskommunikation är bunden till en specifik hamn. Nätverksportar sträcker sig från 0 till 2 ^ 16 (65536). Varje nätverksanslutning har en utgående port för den som initierar den och en inkommande port för den som lyssnar på andra dators meddelanden. Det kan finnas flera anslutningar mellan flera datorer över identiska portar. En dator kan dock prata över flera portar samtidigt. Så i princip är portar bra att identifiera tjänster och definiera kanaler för kommunikation, men de begränsar inte mängden data eller anslutningar.

Vissa datorer kan ha liknande IP-adresser. Du kanske har noterat att både din dator hemma och på jobbet har IP-adresser som har formen av något i linje med 192.168.something.something, eller 10.0.something.something, eller 172.16.something.something. Det här är de så kallade privata IP-adresserna som endast kan användas inom ditt LAN. Du kan inte gå ut till Internet med IP-adresser så här. De är relaterade till interna siffror för ditt företags telefonnät.

Gateway & Bridge

en Bro är vilka datorer med riktiga (offentliga) IP-adresser som skickas till Internet.

I huvudsak har dessa datorer rättigheter och förmåga att direkt prata med varandra på Internet. Men eftersom det inte finns några direkta förbindelser mellan alla datorer i världen (det skulle vara ganska svårt att åstadkomma) är broar ansvariga för att ansluta segment av Internet.

Genom att hålla vår telefoni analogi levande kan du föreställa dig att dessa broar liknar telefoncentren i din stad eller stadsdel. Om du ringer till ett annat lokalt nummer (datorerna till vänster i vårt schema) kunde kommunikationen ha gjorts direkt av ditt telefoncenter genom att fysiskt ansluta din linje med din grann. Om du istället vill ringa din avlägsna morbror Bob, måste ditt samtal omdirigeras över flera telefoncentraler tills din farbrors telefon kunde anslutas. Dessa bildar a bro mellan din stad och hans stad.

en Inkörsport är ett sätt för datorer från ett privat nätverk (LAN med privata IP-adresser) att kommunicera med andra datorer på Internet.

Ett privat nätverk är som ditt företags privata telefonnät. Du kan ringa inrikesnummer, men för att ringa någon som är utanför ditt företags nätverk - som din fru hemma - måste du först ringa ett specialnummer eller prefix.

Datorer fungerar faktiskt på ett liknande sätt. När du är på ett privat nätverk har du en så kallad gateway-dator. När datorn försöker prata med en annan dator på Internet kommer det att auto kontakta gatewayen först och fråga "en linje" till omvärlden. Gatewayen kommer att prata med datorn som finns på Internet och skickar meddelandet tillbaka till din dator. Du, som en vanlig användare, ser ingen skillnad mellan en bro och en gateway. Din dator kommer att veta hur man hanterar dem.


Definition av en brandvägg

En brandvägg är ett program som körs på en Gateway, Bridge eller PC / Laptop / Smartphone som kan filtrera inkommande, utgående och vidarebefordrade nätverkspaket. En brandvägg är i huvudsak ett verktyg som låter dig begränsa dig eller ditt nätverks tillgång till Internet, och någon annans åtkomst från Internet till ditt nätverk.

Och ja, din kabelrouter eller hem Wi-Fi är i själva verket en brandvägg för alla dina datorer och prylar som ansluter till internet genom det.


Problemet vi kommer att lösa

För att ställa in kontextet, låt oss föreställa oss en mycket möjlig nätverksarkitektur. Jag har sett många små företag som kör något liknande det här.

Det vi har här är faktiskt något ganska enkelt:

  • Några datorer och andra nätverksanslutna enheter - de gröna rutorna
  • En e-postserver - den röda rutan
  • En Microsoft Active Directory-server - den blå rutan
  • En gateway, som också är en brandvägg, för vårt nätverk som kör Linux - den svarta lådan
  • Mellan alla dessa är en enkel nätverksomkopplare

I följande avsnitt kommer vi att konfigurera iptables på den gatewayen så att alla enheter i nätverket kan ansluta till Internet. Det kommer att göra det möjligt för oss att ansluta till det via SSH och låta externa postservrar komma till postservern i vårt nätverk - en dator som inte ens har en offentlig IP-adress. bara en privat.


Iptables-komponenter

Iptables namn har faktiskt en betydelse i sin funktionalitet. Det är en uppsättning tabeller med IP-adress och portar med några åtgärder kopplade till dem. I tabellen hänvisas dessa tabeller till kedjor. En okonfigurerad, tom iptables kan se ut så här:

csaba ~ # iptables -L KÄLL INPUT (policy ACCEPT) mål prot opt-källdestination Kedja FORWARD (policy ACCEPT) mål prot opt-källdestination KÄLL OUTPUT (policy ACCEPT) mål prot opt-källdestination

Du kan observera att det finns tre huvudkedjor:

  • INMATNING - alla inkommande anslutningar
  • FRAMÅT - anslutningar som passerar genom
  • PRODUKTION - anslutningar som avgår från den här servern

Termen, "policy ACCEPT"i parentes betyder att ACCEPT är inställt som standardpolicy för den specifika kedjan. Så när det inte finns någon matchning för en anslutning tillämpas den här regeln. Det finns tre huvudbegrepp som du kan använda när du konfigurerar din brandvägg:

  • standardpolicy ACCEPT och neka selektivt allt du behöver - Det kan vara svårt att ange allt som det nekas. Jag rekommenderar inte detta tillvägagångssätt.
  • standardpolicy DROP eller REJECT och tillåta selektivt allt du behöver - Det här är bättre, men det har ett problem. Om du gör ett misstag i din iptables-konfiguration kan du enkelt förbli med tomma kedjor som nekar åtkomst till allt och alla, inklusive dig. Så, om du inte alltid har fysisk åtkomst till din brandväggsserver / dator rekommenderar jag att du använder nästa tillvägagångssätt.
  • standardpolicy ACCEPT & en explicit policy att DROP alla och tillåta selektivt allt du behöver - Det här är en kombinerad lösning mellan de två första möjligheterna. Det kommer att använda en ACCEPT-standardpolicy, så om något går fel kan du logga tillbaka över SSH eller vilken fjärranslutning du använder för din brandvägg. Samtidigt säkerställer en explicit DROP-regel för alla oöverträffade anslutningar att du är säker. Att bara tillåta vad du vet om och faktiskt behöver använda erbjuder bästa möjliga skydd.

Lägga till regler för Iptables

Det finns två sätt att lägga till en ny regel i iptables. En är att infoga den vid början av en kedja. Det andra alternativet är att lägga till det i slutet av en kedja. Varför spelar ingen roll i vilken ordning reglerna uppstår?

Viktig: Iptables kontrollerar reglerna i en kedja från topp till botten. Det kommer att stoppa sökningen vid första matchen.

Du måste utforma dina regler på ett sådant sätt att överväga ovanstående beteende hos iptables. Efter den första matchen i en regel, tar iptables de åtgärder som anges av regeln och upphör sedan med sökningen. Om ingen regel matchar anslutningen som är markerad gäller standardpolicyen.

Infoga en ny regel

Låt oss säga att vi vill lägga till en regel i våra iptables som låter någon ansluta till port 22 på vår brandvägg. Hamn 22 är porten för SSH-protokollet. Självklart kommer en bra serveradministratör att ändra den här porten till någonting oväntat för uppenbara säkerhets / obskurity skäl, men det är en annan historia för en annan handledning. Vi kommer att hålla fast vid 22.

csaba ~ # iptables -I INPUT -i eth0 -p tcp -dport 22 -j ACCEPT csaba ~ # iptables -L Kedja INPUT (policy ACCEPT) mål prot opt-källdestination ACCEPT tcp - var som helst var som helst tcp dpt: ssh

Jag antog att IP-adressen mot Internet med den offentliga IP på den finns på nätverksgränssnittet, kallat eth0. Låt oss dissekera detta kommando:

  • -jag - står för att infoga regeln
  • INMATNING - specificerar önskad kedja
  • -jag - står för nätverksgränssnittet - i vårt fall, eth0
  • -p - är för protokoll (tcp eller udp)
  • --dport 22 - är för destinationshamn 22 - den har en motsvarande --sport version för källport verifiering
  • -j - kommer faktiskt från "hoppa" och följs av en åtgärd - i vårt fall, åtgärden för att acceptera anslutningen

Men du kanske redan har gissat att denna regel har liten effekt vid denna tidpunkt. Vår standardpolicy är ACCEPT, så att acceptera något uttryckligen inte ger oss någon extra funktionalitet. Kom nu ihåg det tredje rekommenderade sättet att konfigurera vår brandvägg: den explicit regeln att neka allt som inte matchas. Låt oss lägga till den regeln.

Tilläggsregler

Vi vill lägga till en regel som blockerar inkommande trafik. Men var försiktig: vi vill bara blockera vad som kan vara skadligt. Om vi ​​blockerar allt, kan vi inte göra någonting, eftersom svaren på våra förfrågningar kommer att avslås. Till exempel, när du bläddrar på en webbsida, gör du en förfrågan, så får du ett svar. Detta svar kommer in i din dator, så i INPUT-kedjan måste vi ha en regel för att tillåta den.

Först lägger vi till en regel för att acceptera inkommande trafik för redan etablerade anslutningar, till exempel svar på förfrågningar.

csaba ~ # iptables -A INPUT -i eth0 -m conntrack -ctstate Upprättad, RELATERad -J ACCEPT csaba ~ # iptables -L KÄLL INPUT (policy ACCEPT) mål prot opt ​​destination destination ACCEPT tcp - var som helst var som helst tcp dpt: ssh ACCEPT alla - var som helst någonstans ctstate relaterad, etablerad

Nu när vi har skyddat våra befintliga förbindelser och svaren på de anslutningar vi initierade kan vi förneka allt annat som inte matchades.

csaba ~ # iptables -A INPUT -i eth0 -p tcp -j DROP csaba ~ # iptables -L KÄLL INPUT (policy ACCEPT) mål prot opt-källdestination ACCEPT tcp - var som helst var som helst tcp dpt: ssh ACCEPT alla - var som helst någonstans ctstate RELATERADE, STÄLLDA DROP tcp - var som helst

Vi har lagt till en annan rad, med en regel att DROP alla anslutningar som matchar. Kom ihåg: Denna regel gäller endast om ingen av de föregående matchar.

Det finns två sätt att vägra anslutningar.

  1. Du kan använda DROP, vilket motsvarar att du ringer ett obefintligt telefonnummer med den skillnaden att nätverksanslutningen efter en tid slocknar. Med ett telefonnummer informerar en robot om att numret inte existerar. Men slutresultatet från den som ringer är samma sak: det anser att destinationen inte existerar.
  2. Det andra sättet att vägra anslutningen är med regeln, REJECT och ett valfritt meddelande. Detta är analogt med det nummer du försöker ringa upptagen. Du kanske vet att det finns ett nummer, du vet att det kan ringas, men det vägrar helt enkelt att ringa. Eventuellt kan du skicka ett meddelande med en REJECT-regel. standard är "ICMP-porten oåtkomlig" eller något liknande.

Tillåt datorer att komma åt Internet

Vid denna tidpunkt har vi några grundläggande regler för INPUT-kedjan. Men vi har ett nätverk av datorer med privata IP-adresser. Vi behöver tillhandahålla en gateway till Internet. Detta görs också av iptables: brandväggen.

Nätverksadress översättning (NAT)

Sannolikt har du redan hört den här termen: NAT. Detta hänvisar till förfarandet för att översätta en nätverksadress till en annan och vidarebefordra informationen mellan de två. Det används oftast i arkitekturer som vår egen. Gatewayen måste göra NAT för att kunna översätta vilken dators IP från LAN som helst till sin egen offentliga IP och sedan tillbaka.

Routing är det sätt på vilket ett system kan ta reda på vilken nätverksgränssnitt och mot vilken gateway den kan kommunicera för att nå sin destination. Varje dator har ett eget routingbord för att bestämma detta. Iptables kan koppla in i denna routingprocedur på två olika punkter: före och efter proceduren har inträffat.

Nating med Iptables

csaba ~ # iptables -t nat -A POSTROUTING -o eth0 -j SNAT -to-source 89.72.31.243

Detta kommando lägger till en regel som POSTROUTING till NATing-tabellen (-t nat). POSTROUTING betyder i huvudsak att paketen först passerar rutningsmekanismen på gatewayen, och först därefter ändras de. Regeln -j SNAT betyder källa NAT; Paketets källadress kommer att ändras till adressen på gränssnittet som anges av -o eth0 - i vårt fall till den IP-adress som anges av alternativet, --till källan. Så, alla som kontaktas av en dator i ditt nätverk antar att det pratar direkt till din gateway. Det kommer absolut ingen aning om att paketen är avsedda för en viss dator. Gatewayen, med hjälp av iptables, kommer att behålla en intern lista över alla översatta IP-adresser, och när ett svar kommer kommer det att återgå till ändringen och skicka svaret till datorn inuti nätverket.


Tillåt Client från Internet till e-postservern

Ett annat problem vi står inför är att göra när vi har en server som ligger bakom en brandvägg. Vi måste tillåta kunderna, som kommer från Internet, att kommunicera med vår server på något sätt. Detta är fallet med vår mail server. När ett e-mail anländer som måste levereras till ett mailkonto på vår server måste den sändande e-postservern ansluta till vår mottagande en.

Men vår e-postserver har bara en privat IP-adress. Det finns inget sätt att en extern dator kan ansluta till den direkt. Å andra sidan har vår gateway en extern IP som alla kunde ansluta till. Lösningen? Öppna en port på vår gateway så att en begäran från Internet till den porten faktiskt kommer att gå till vår e-postserver. Svaret kommer naturligtvis att resa genom porten tillbaka till kunden. Tricket är att använda en annan typ av NAT här, som heter Destination NAT. Detta ändrar paketets destination och återställer dem sedan när svaret inträffar. Tänk på DNAT som omvänd av SNAT.

Tips: Du kanske känner till den här funktionen som "Virtual Server", om du någonsin har spelat med små hemrutrar.

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

Så vad händer här? Ett paket kommer in till vår gateway vid hamnen 25 (porten som används för SMTP, det e-postprotokoll som hela Internet använder). Regeln ovan fångar detta paket på grund av --dport 25 alternativ som i grunden säger "Matcha allt som går till den här porten på gränssnittet som anges av -jag eth0. Nu när paketet matchas, ändra dess destination från den aktuella maskinen (gatewayen) till den som anges av --till-destinationen."Observera att du kan ange hamnen uttryckligen efter IP-adressen genom att skilja den med ett kolon.

Slutligen notera att detta finns i PREROUTING-kroken. Destinationen måste ändras innan rutingen faktiskt äger rum. Annars skulle paketen hamna på gatewayen och hitta ingen väg till mail-servern.


Hållbar iptables-konfiguration

Reglerna som du infogar eller lägger till iptables finns i minnet. Efter en omstart, spoof: allt är borta! För att spara din konfiguration borde du dumpa den i en fil, så här:

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

Filens namn spelar ingen roll, inte heller dess förlängning. För att återställa reglerna, kör det här kommandot när datorn startar.

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

Om du tittar på det sparade innehållet ser du att de är samma parametrar som vi använde med kommandona iptables. Det finns några mindre skillnader, men du kan enkelt förstå den sparade filen och kan även skriva dina egna sådana filer manuellt och ladda dem.


Slutgiltiga tankar

I slutändan är det några tankar om när och då att inte använda en brandvägg med en Linux-dator.

Använd en brandvägg på Linux när du konfigurerar en server (som en gateway i vårt exempel), eller när du har en dator med viktig information om den som är direkt utsatt för Internet. Innan du hoppar på för att konfigurera dina iptables, överväga den potentiella faran. Fråga dig själv: Är min dator känd på Internet? Det finns några miljarder datorer där ute. Om din är bara en, är chansen att bli riktade otroligt låg. Finns det människor som är direkt intresserade av din information? Hackers spenderar inte tid att stjäla slumpmässiga data i hopp om att de kan hitta något. De brukar veta vad de letar efter och rikta sedan in de datorer som innehåller önskad information. Självklart finns det otaliga attacker mot slumpmässiga datorer som försöker installera någon form av mask eller virus, men på Linux är du immun mot design.

Slösa inte bort din tid med att konfigurera en brandvägg på Linux när det är en dator som alltid ligger bakom en brandvägg, till exempel din hemdator bakom din hemrouter eller när du inte har någon särskilt viktig information på din bärbara dator. Om du behåller de tjänster som lyssnar på nätverket till ett minimum och har ett ordentligt säkert lösenord, kan du glömma din brandvägg. Personligen har jag ingen personlig dator, bärbar dator eller smartphone med en brandvägg som körs. Jag har dock en hemrouter med en välkonfigurerad brandvägg.

Jag tror att du även kan använda dessa idéer säkert till Mac OSX. Om du är en Windows-användare, ledsen: En brandvägg är din första försvarskod. För Linux eller MacOSX är en brandvägg din sista försvarskod. Ett noggrant valt lösenord och inte löser värdelösa tjänster bör hantera större delen av din dators skydd.

Tack för att du läser. frågor?