Installerar ubuntu iptables. Grunderna i iptables om exemplet med Debian genom en babys ögon

Så idag kommer vi att ta reda på vilken typ av odjur den här IPTables är och hur man kan bekämpa, besegra och stävja det? :)

IPTables är ett kommandoradsverktyg som är standardgränssnittet för att hantera driften av NETFilter-brandväggen (brandvägg eller brandvägg) för Linux-kärnor, från och med version 2.4. Superanvändarbehörighet (root) krävs för att använda IPTables-verktyget.

Ibland hänvisar ordet IPTables till själva NETFilter-brandväggen. Med dess hjälp kan du hantera ganska flexibelt (i det här fallet, behandlingen av paket som kommer till oss eller utgår från oss).

Till exempel kan du förbjuda en dator från att komma åt Internet, tillåta en annan att bara komma åt webbplatser, "vidarebefordra" (tilldela) en fördefinierad port till en tredje och skicka "misstänkta" paket tillbaka till avsändaren (låt den gå sönder av sig själv). Du kan ändra "i farten" tjänsteinformationen för IP-paket (avsändare, mottagare, TTL, etc.) och mycket mer, som du inte kan föreställa dig direkt.

Vad du till att börja med bör veta om brandväggar - de är designade för att skydda, så du måste komma ihåg att den sista regeln ( politik) bör vara "förbjud resten". För det andra, men inte minst, redigera alltid reglerna eller Telnet noggrant.

De fall då reglerna sattes upp på distans, och efter att ha tillämpat reglerna, visade sig den ouppmärksamma administratören vara "avskuren" från servern är inte isolerade! Och det är bra om servern är två steg bort, men vad händer om den är någonstans i det avlägsna kungariket?


Hur en brandvägg fungerar

När ett paket kommer till vår brandvägg, träffar det först , fångas upp av lämplig drivrutin och skickas sedan till kärnan. Paketet passerar sedan en serie tabeller och skickas sedan antingen till den lokala applikationen eller vidarebefordras till en annan maskin.

Paketordningen visas i tabellen nedan:

Steg tabell Kedja Notera
1 Kabel (dvs internet)
2 Nätverksgränssnitt (till exempel eth0)
3 mangel FÖRRUTNING Vanligtvis används denna kedja för att göra ändringar i pakethuvudet, såsom att ändra TOS-bitarna, etc.
4 nat FÖRRUTNING Denna kedja används för nätverksadressöversättning (Destination Network Address Translation). Källnätverksadressöversättning görs senare, i en annan kedja. All typ av filtrering i denna kedja kan endast göras i undantagsfall.
5 Att fatta beslut om vidare dirigering, d.v.s. vid denna tidpunkt bestäms vart paketet ska gå - till den lokala applikationen eller till en annan nätverksnod.
6 mangel FRAM Paketet går sedan in i FORWARD-kedjan i mangletabellen, som endast bör användas i undantagsfall där någon förändring i pakethuvudet behöver göras mellan två routingbeslutspunkter.
7 filtrera FRAM Endast de paket som går till en annan värd kommer in i FORWARD-kedjan. All filtrering av transittrafik ska utföras här. Tänk på att trafiken flyter i båda riktningarna genom denna kedja. Var noga med att ta hänsyn till denna omständighet när du skriver filtreringsregler.
8 mangel POSTROUTING Denna kedja är utformad för att göra ändringar i pakethuvudet efter att det senaste routingbeslutet har tagits.
9 nat POSTROUTING Denna kedja är främst avsedd för översättning av källnätverksadress. Använd den inte för filtrering om det inte är absolut nödvändigt. Maskerad utförs också här.
10 Utdatanätverksgränssnitt (till exempel eth1)
11 Kabel (låt det vara LAN)

Som du kan se går paketet igenom flera steg innan det skickas vidare. Ett paket kan stoppas när som helst, oavsett om det är iptables-kedjan eller något annat, men vi är främst intresserade av iptables.

Observera att det inte finns några kedjor som är specifika för enskilda gränssnitt eller något liknande. FORWARD-kedjan genomkorsas av ALLA paket som rör sig genom vår brandväggsrouter. Använd inte INPUT-kedjan för att filtrera transitpaket, de kommer bara inte dit. Endast data som är avsedda för samma värd rör sig genom denna kedja.


iptables regler

Jag kommer att ge ett exempel på en del av min routerkonfiguration: vlan332 är gränssnittet genom vilket jag kommer åt Internet, vlan333 är åtkomst till leverantörens lokala nätverk och 172.30.2.5 är min dator.

#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 --till 172.30.2.5

#öppen port
iptables -A INPUT -p tcp --dport 53 -j ACCEPTERA #DNS TCP
iptables -A INPUT -p udp --dport 53 -j ACCEPTERA #DNS UDP
iptables -A INPUT -p tcp --dport 80 -j ACCEPTERA #WEB-server

#Allt annat inkommande "drop" (radera)
iptables -A INPUT -i vlan332 -j DROP

Vad betyder allt detta? Först och främst, för läsbarheten, delade jag in konfigurationen i "sektioner" med kommentarer, d.v.s. i en del av regeln för NAT, i den andra - portvidarebefordran (PAT), i den tredje - tillåter vi serverportar etc.

Tänk på de första och andra reglerna (de skiljer sig endast i nätverksgränssnitt):

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

Baserat på den lägger vi till en ny regel i nat-tabellen (-t nat) för postroutingkedjan (-A POSTROUTING), som kommer att vara den sista i kedjan vid den tidpunkt då kommandot exekveras (dvs. - till slutet ). Regeln kommer att tillämpas på det utgående gränssnittet vlan332 (-o vlan332) och kommer att skickas till MASQUERADE (-j MASQUERADE) dessa NAT:er.

På mänskligt språk bör allt som kommer ut från vlan332-gränssnittet döljas bakom NAT "ohm. Detta betyder att när vi lämnar vår router kommer vår server att indikeras av avsändaradressen och inte slutdatorn för användaren från vilken begäran skickades. När svaret kommer på begäran kommer den omvända proceduren att utföras och paketet kommer att överföras till den ursprungliga avsändaren. För vad detta kommer att behöva beskrivas i detalj i artikeln om NAT.

Låt oss gå vidare till nästa grupp av regler, nämligen avsnittet märkt "torrent". Detta avsnitt specificerar reglerna för port forwarding (PAT - Port Address Translation), dvs. så att du från Internet kan ansluta till porten på datorn bakom vår router. Utan detta kommer många applikationer inte att fungera ordentligt, som torrent-fildelningsnätverk, DC++ och vissa applikationer som kräver inkommande anslutningar från Internet. Låt oss analysera regeln med exemplet att vidarebefordra (tilldela) portar för en Torrent-klient

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

Som i föregående regel anger vi tabellen och kedjan (-A PREROUTING -t nat), anger den tillåtna protokolltypen. I den nuvarande TCP-regeln (-p tcp) (i en annan UDP-regel, även om de kan specificeras i en regel, fungerade detta tyvärr inte för mig ens med den officiella litteraturen och jag har inte hittat en lösning än).

Destinationsport 9000 (--dport 9000), inkommande vlan332-gränssnitt. Med DNAT-åtgärden (-j DNAT) indikerar vi att vi behöver ändra mottagaradressen till 172.30.2.5 (--till 172.30.2.5) d.v.s. - vår dator. Det visar sig: alla inkommande TCP-anslutningar till port 9000 omdirigeras till IP 172.30.2.5.

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

Ange INPUT-kedjan, TCP-protokollet, portnummer 53 (används för DNS-tjänster) och åtgärden - tillåta. Du kanske märker att UDP används för DNS-förfrågningar och detta kommer att vara korrekt. TCP används för att överföra information om zoner (domäner), och eftersom min server är primär för flera zoner tillät jag åtkomst via TCP.

Den sista regeln, som jag sa ovan, bör vara förbudet mot allt annat som inte faller under filtren. jag skrev iptables -A INPUT -i vlan332 -j DROP de där. ta bort alla inkommande paket på vlan332-gränssnittet.

Eftersom denna brandvägg inte har en permanent konfiguration måste reglerna anges manuellt vid omstart. Detta är inget problem, eftersom det finns skalskript (analogt med bat- och cmd-filer i Windows) och när de körs kommer de att köra kommandona som är skrivna i dem.

För att göra detta, skapa en fil i etc-katalogen med namnet firewall.sh med nano /etc/firewall.sh-kommandot, dvs. öppna den omedelbart i editorn. Låt oss skriva alla regler vi behöver där och spara dem genom att trycka på Ctrl + X.

Här är några fungerande konfigurationsregler som kan vara användbara för dig i dagligt bruk. Den första raden (#!/bin/sh) krävs eftersom den anger hur dessa instruktioner ska tolkas.

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

# Ta bort alla befintliga regler för alla tabeller och kedjor
iptables -F
iptables -t nat -F
iptables -t mangle -F
iptables -X

# Tillåt all trafik
iptables -A INPUT -i lo -j ACCEPT#Loopback
iptables -A INPUT -i eth0 -j ACCEPT#Internt gränssnitt till LAN
iptables -A INPUT -i eth2 -j ACCEPT#Internt gränssnitt till LAN 2

#NAT
iptables -t nat -A POSTROUTING -o vlan332 -j MASQUERADE#Aktivera NAT mot Internet
iptables -t nat -A POSTROUTING -o vlan333 -j MASQUERADE#Aktivera NAT mot leverantör (leverantörsnätverk)

#PORT FORWARDING
#Torrent
iptables -A PREROUTING -t nat -p tcp --dport 9000 -i vlan332 -j DNAT --till 172.30.2.5#Portvidarebefordran till IP
iptables -A PREROUTING -t nat -p udp --dport 9000 -i vlan332 -j DNAT --till 172.30.2.5

#VPN-anslutningar, tillåter anslutningar via PPP, etc.
iptables -A INPUT -p tcp -m tcp --dport 1723 -j ACCEPTERA
iptables -A INPUT -p gre -m state --state RELATED,ETABLISHED -j ACCEPT

#Öppna serverportar
iptables -A INPUT -p tcp --dport 23 -j ACCEPTERA #Tillåt SSH-åtkomst

#Allt annat som kommer in raderas ("släpp" - kassera)
iptables -A INPUT -i vlan332 -j DROP

# Aktivera vidarebefordran, utan detta kommer paket inte att dirigeras
echo 1 > /proc/sys/net/ipv4/ip_forward

Efter det gör vi filen körbar, dvs:
chmod +x /etc/firewall.sh(Kör).

För att den här filen ska bearbetas automatiskt vid laddning kommer vi att skriva sökvägen till den i "startup"-filen. Öppna nano /etc/rc.local och lägg till raden /etc/firewall.sh innan utgång 0 /firewall.sh till vlan-gränssnittet, till exempel:

# VLAN till INET
autovlan332
iface vlan332 inet statisk
adress xxx.xxx.xxx.xxx
nätmask 255.255.255.252
# gateway xxx.xxx.xxx.xxx
vlan_raw_device eth1
upp sh /etc/firewall.sh

Detta är nödvändigt eftersom "autoload" kommer att ske först, och först efter ett tag kommer våra VLAN-gränssnitt att stiga, och om det inte finns något gränssnitt kommer regeln inte att skapas.

Tyvärr har jag inte möjlighet att fullständigt beskriva driften av denna underbara brandvägg, men det finns utmärkt dokumentation om den på ryska (översättning av den ursprungliga utvecklarmanualen), här är adressen.

Det kommer inte att vara svårt, inte ens efter att ha läst en del av den eller ställt in en specifik uppgift, att lösa de flesta problem som är relaterade till denna brandvägg och skrivregler på egen hand.

Nyckelbegreppen för iptables är:

    Regel - består av ett kriterium, en handling och en räknare. Om paketet matchar kriterierna, tillämpas åtgärden på det och det räknas mot räknaren. Det kan eller kanske inte finns ett kriterium - då antas kriteriet "alla paket" implicit. Det är inte heller nödvändigt att specificera en åtgärd - i avsaknad av en åtgärd kommer regeln bara att fungera som en mot. Reglerna för varje kedja utlöses i den ordning de visas, så ordningen är viktig.

    • Kriterier - ett logiskt uttryck som analyserar egenskaperna hos ett paket och/eller en anslutning och avgör om just detta paket omfattas av den aktuella regeln. Kriterierna är sammankopplade med ett logiskt "OCH".

      Åtgärd - En beskrivning av åtgärden som ska vidtas på paketet och/eller anslutningen om de omfattas av denna regel. Åtgärderna kommer att diskuteras mer i detalj nedan.

      Räknare - en komponent i regeln som ger redovisning av antalet paket som matchade kriterierna för denna regel. Räknaren tar också hänsyn till den totala storleken av sådana paket i byte.

    En kedja är en ordnad sekvens av regler. Kedjor kan delas in i custom och basic.

    • Baskedja - kedjan som skapas som standard när tabellen initieras. Varje paket, beroende på om det är avsett för värden själv, genererat av det eller är transit, måste gå igenom uppsättningen av baskedjor av olika tabeller som tilldelats det. Dessutom skiljer sig baskedjan från användarkedjan genom närvaron av en "standardåtgärd" (standardpolicy). Denna åtgärd tillämpas på de paket som inte behandlades av andra regler i denna kedja och kedjor som anropats från den. Baskedjenamn skrivs alltid med stora bokstäver (FÖREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING).

      Användarkedja - en kedja skapad av användaren. Kan endast användas inom sitt eget bord. Vi rekommenderar att du inte använder versaler för sådana kedjor för att undvika förväxling med baskedjor och inbyggda åtgärder.

    Tabell - en uppsättning grundläggande och användarkedjor, förenade av ett gemensamt funktionellt syfte. Tabellnamn (liksom kriteriemoduler) skrivs med gemener, eftersom de i princip inte kan komma i konflikt med namnen på anpassade kedjor. När kommandot iptables anropas specificeras tabellen i formatet -t tabellnamn. Om det inte uttryckligen anges används filtertabellen.

Parsing:

# Dumpa filtertabellsregler$ sudo iptables-save -c -t filter # Tabellfilter * filter # INPUT, FORWARD, OUTPUT-kedjor, deras policyer och räknare:INPUT ACCEPTERAR [ 19302 :9473669 ] :FRAMÅT ACCEPTERAR [ 0 :0 ] :OUTPUT ACCEPTERAR [ 5462736 :4247599532 ] # Regel: "" - regelräknare, "-A INPUT" - kedja, "-i em1 -p tcp -m tcp --dport 22" - kriterier, "-j ACCEPT" - action[ 17:1020 ] -A INPUT -i em1 -p tcp -m tcp --dport 22 -j ACCEPTERA COMMIT

Arkitektur

I ett nätfiltersystem leds paket genom kedjor. En kedja är en ordnad lista med regler, och varje regel kan innehålla kriterier och en åtgärd eller övergång. När ett paket passerar genom kedjan kontrollerar nätfiltersystemet i sin tur om paketet matchar alla kriterier för nästa regel, och i så fall utför det en åtgärd (om det inte finns några kriterier i regeln, så utförs åtgärden för alla paket som passerar genom regeln). Det finns många möjliga kriterier. Till exempel matchar ett paket -source 192.168.1.1-kriteriet om pakethuvudet anger att avsändaren är 192.168.1.1. Den enklaste typen av hopp, --jump, vidarebefordrar helt enkelt paketet till början av en annan kedja. Du kan också specificera en åtgärd med --jump. Standardåtgärder som är tillgängliga i alla kedjor är ACCEPT (hoppa över), DROP (ta bort), QUEUE (skicka in för analys till ett externt program) och RETURN (återgå till föregående kedja för analys). Till exempel kommandon

iptables -A INPUT --källa 192.168.1.1 --jump ACCEPTERA iptables -A INPUT --hoppa annan_kedja

betyder "lägg till följande regler i slutet av INPUT-kedjan: hoppa över paket från 192.168.1.1 och skicka allt som återstår att skicka till den andra_kedjan för analys."

kedjor

Det finns 5 typer av standardkedjor inbyggda i systemet:

    PREROUTING - för initial bearbetning av inkommande paket.

    INPUT - för inkommande paket adresserade direkt till den lokala processen (klient eller server).

    FORWARD - för inkommande paket som omdirigeras till egress (observera att vidarebefordrade paket går först genom PREROUTING-kedjan, sedan FORWARD och POSTROUTING).

    OUTPUT - för paket som genereras av lokala processer.

    POSTROUTING - för slutbehandling av utgående paket.

Du kan också skapa och förstöra dina egna kedjor med hjälp av iptables-verktyget.

tabeller

Kedjorna är organiserade i 4 tabeller:

    Rå - ses innan paketet skickas till tillståndsdetekteringssystemet. Används sällan, till exempel för att markera paket som INTE ska behandlas av tillståndssystemet. För att göra detta specificeras NOTRACK-åtgärden i regeln. Innehåller PREROUTING- och OUTPUT-kedjorna.

    Mangle - innehåller reglerna för att modifiera (vanligtvis rubriken) IP-paket. Den stöder bland annat TTL (Time to live), TOS (Type of Service) och MARK-åtgärder (för att ändra TTL- och TOS-fält och för att ändra paketmarkörer). Behövs sällan och kan vara farligt. Innehåller alla fem standardkedjor.

    Nat - Letar bara efter paket som skapar en ny anslutning (enligt tillståndssystemet). Stöder DNAT, SNAT, MASQUERADE, REDIRECT-åtgärder. Innehåller kedjorna PREROUTING, OUTPUT och POSTROUTING.

    Filter - huvudtabellen, används som standard om tabellnamnet inte anges. Innehåller INPUT-, FORWARD- och OUTPUT-kedjorna.

Kedjor med samma namn men i olika tabeller är helt oberoende objekt. Till exempel innehåller rå PREROUTING och mangle PREROUTING vanligtvis en annan uppsättning regler; paket går först genom den råa PREROUTING-kedjan och sedan genom manglen PREROUTING.

stater

I nätfiltersystemet kan varje paket som passerar genom tillståndsmekanismen ha ett av fyra möjliga tillstånd:

    NYTT - paketet öppnar en ny session. Ett klassiskt exempel är ett TCP-paket med SYN-flaggan.

    ETABLISTERAT - Paketet är en del av en redan befintlig session.

    RELATED - Paketet öppnar en ny session kopplad till en redan öppnad session. Till exempel, under en passiv FTP-session ansluter klienten till port 21 på servern, servern berättar för klienten numret på en andra, slumpmässigt vald port, varefter klienten ansluter till den andra porten för att överföra filer. I det här fallet är den andra sessionen (filöverföring på den andra porten) associerad med en redan existerande session (ursprunglig anslutning till port 21).

    OGILTIGT - alla andra paket.

Diagram över passagen av tabeller och kedjor

Ett förenklat diagram över passagen av tabeller och kedjor:

Detaljdiagram:

Grundläggande konfiguration

Nedan är ett exempel på en grundläggande statisk iptables-konfiguration. När du sparar och laddar en sådan konfiguration är det nödvändigt att ta hänsyn till möjligheten att göra ändringar i den av andra tjänster, såsom Fail2ban . Dessutom, när du använder IPv6-adressering måste konfigurationen för IPv6 göras oberoende av IPv4.

IPv4

sudo iptables-spara

Skapa ett skript med en dump av iptables-regler:

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

Kopiera följande kod:

#!/sbin/iptables-restore -A INPUT -p icmp -j ACCEPTERA -A INPUT -i lo -j ACCEPT -A INPUT -j AVVISA --reject-with icmp-host-prohibited -A FORWARD -m conntrack -- ctstate RELATED,ETABLISHED -j ACCEPTERA -A FRAMÅT -p icmp -j ACCEPTERA -A FRAMÅT -j AVVISA --reject-with icmp-host-prohibited #-A OUTPUT -p icmp -j ACCEPT #-A OUTPUT -o lo - j ACCEPTERA #-A OUTPUT -j REJECT --reject-with icmp-host-prohibited BEGÅ

Vi kompletterar med nödvändiga regler, med hänsyn till iptables-save.

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

IPv6

Visa aktuell konfiguration:

sudo ip6tables-spara

Skapa ett skript med en dump av ip6tables-regler:

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

Kopiera följande kod:

#!/sbin/ip6tables-restore # Filterbordet och dess kedjor* filter:INPUT ACCEPT [ 0 :0 ] :FRAMÅT ACCEPTERA [ 0 :0 ] :OUTPUT ACCEPT [ 0 :0 ] # Tillåt relaterade och etablerade anslutningar-A INPUT -m conntrack --ctstate RELATED,ETABLISHED -j ACCEPT # Tillåt tjänsten icmp-trafik-A INPUT -p ipv6-icmp -j ACCEPTERA # Tillåt pålitlig trafik på loopback-gränssnittet-A INPUT -i lo -j ACCEPTERA # Här kan du infoga ytterligare regler för INPUT-kedjan # Inaktivera allt annat för INPUT-A INPUT -j REJECT --reject-med icmp6-adm-prohibited # Ordningen och innebörden av reglerna för FORWARD- och OUTPUT-kedjorna liknar INPUT-A FORWARD -m conntrack --ctstate RELATED,ETABLISHED -j ACCEPT -A FORWARD -p ipv6-icmp -j ACCEPT -A FORWARD -j AVVISA --avvisa-med icmp6-adm-prohibited # Filtrering av OUTPUT-kedjan avråds starkt #-A OUTPUT -m conntrack --ctstate RELATED,ETABLISHED -j ACCEPT #-A UTGÅNG -p ipv6-icmp -j ACCEPTERA#-A UTGÅNG -o lo -j ACCEPTERA #-A OUTPUT -j REJECT --reject-with icmp6-adm-prohibited BEGÅ

Vi kompletterar med nödvändiga regler, med hänsyn till ip6tables-save.

Spara och stäng: Ctrl + O , Enter , Ctrl + X

Gör skriptet körbart och ladda iptables-reglerna:

sudo chmod +x / etc/ nätverk/ if-up.d/ ip6tables-rules sudo / etc/ network/ if-up.d/ ip6tables-rules

Ytterligare regler

Nedan finns några relativt vanliga regler. INPUT/OUTPUT-kedjor används för att filtrera lokal trafik. För transittrafik måste du använda FORWARD-kedjan.

Fjärråtkomst

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

Webb- och filtjänster

# 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 ACCEPTERA

Mail och snabbmeddelanden

# mail.pop3, mail.pop3s -A INPUT -p tcp -m conntrack --ctstate NYTT -m multiport --dports 110 995 -j ACCEPTERA # 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 NYTT -m tcp --dport 5190 -j ACCEPTERA

Nätverkstjänster

# network.openvpn.vpn -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 1194 -j ACCEPTERA # network.squid.proxy -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 3128 -j ACCEPTERA # network.dns -A INPUT -p tcp -m conntrack --ctstate NEW -m tcp --dport 53 -j ACCEPTERA -A INPUT -p udp -m conntrack --ctstate NEW -m udp --dport 53 -j ACCEPTERA # nätverk.ntp -A INPUT -p udp -m conn # network.dhserver.dhcp.discover begäran-A INPUT -p udp -m conntrack --ctstate NYTT -m udp --sport 68 --dport 67 -j ACCEPTERA # network.dhclient.dhcp.discover-request #-A OUTPUT -p udp -m conntrack --ctstate NYTT -m udp --sport 68 --dport 67 -j ACCEPTERA # network.dhserver.dhcp.offer-ack #-A OUTPUT -p udp -m conntrack --ctstate NYTT -m udp --sport 67 --dport 68 -j ACCEPTERA

Testning och felsökning

Visa aktuell konfiguration för IPv4 och IPv6:

sudo iptables-spara sudo ip6tables-spara

Skogsavverkning

spårning

Kärnmoduler

Visa laddade moduler:

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

För att ladda ytterligare moduler är det bekvämt att använda automatisk komplettering: 2x Tab

sudo modprobe nf sudo modprobe modules-load.d

Varje dator som är ansluten till nätverket är i potentiell fara. Det finns många hot på nätverket, allt från program som ska försöka penetrera systemet på något sätt och slutar med hackare som vill få tillgång till den dator de behöver. Och programvaran som är installerad på datorn kan innehålla ännu okända och oparpade sårbarheter, som kan bli ett säkerhetshål.

Om detta inte är särskilt relevant för hemdatorer, eftersom de är anslutna till nätverket via routrar och NAT, som döljer dem från det externa nätverket, så är detta för servrar mer relevant än någonsin. I operativsystemet Linux är en mycket flexibel och pålitlig iptables-brandvägg inbyggd i kärnan.

Det är med hjälp av detta program som systemet skyddas från externa intrång, port forwarding, och även en hel del åtgärder med trafik. Men dess nackdel är att den är lite svår att sätta upp. Den här artikeln kommer att täcka konfigurering av iptables för dummies. Jag hoppas att du efter det med säkerhet kommer att kunna använda de grundläggande funktionerna i iptables.

Undersystemet iptables och Netfilter har byggts in i Linux-kärnan under lång tid. Alla nätverkspaket som passerar genom datorn, skickas av datorn, eller är avsedda för datorn, leder kärnan genom iptables-filtret. Där är dessa paket föremål för kontroller och sedan för varje kontroll, om den godkänns, utförs den åtgärd som anges i den. Till exempel skickas paketet vidare till kärnan för att skickas till målprogrammet, eller kasseras.

Pakettyper

Alla paket är indelade i tre typer: inkommande, utgående och passerande. Inkommande - de som skickades till den här datorn, utgående - skickas från den här datorn till nätverket. Och passerande är paket som bara behöver vidarebefordras, till exempel om din dator fungerar som en router.

Följaktligen, i iptables-filtret är alla paket uppdelade i tre liknande kedjor:

  • Inmatning- hanterar inkommande paket och anslutningar. Till exempel, om någon extern användare försöker ansluta till din dator via ssh eller någon webbplats kommer att skicka sitt innehåll till dig när webbläsaren begär det. Alla dessa paket kommer att hamna i denna kedja;
  • fram-- denna kedja används för att passera anslutningar. Detta inkluderar paket som skickas till din dator, men som inte är avsedda för det, de skickas helt enkelt över nätverket till deras mål. Detta observeras som sagt på routrar eller till exempel om din dator distribuerar wifi;
  • produktion- denna kedja används för utgående paket och anslutningar. Detta inkluderar paket som genererades när du försökte pinga en webbplats, eller när du startar din webbläsare och försöker öppna valfri webbplats.

Men om du tror att du bara kan stänga Input-kedjan helt för att öka säkerheten, så har du väldigt fel. När nätverket är igång används både ingångs- och utgångskedjor. Till exempel, du försöker pinga, data skickas via utdata, men svaret kommer via input. Samma sak händer när du surfar på webbplatser och andra aktiviteter. Men framåtkedjan kanske inte används alls om din dator inte är en router. Så att konfigurera iptables måste göras mycket noggrant.

Regler och handlingar

Innan du går vidare till att skapa en lista med iptables-regler måste du överväga hur de fungerar och vad de är. För varje typ av paket kan du ställa in en uppsättning regler som kommer att kontrolleras i tur och ordning för överensstämmelse med paketet, och om paketet matchar, tillämpa sedan den åtgärd som anges i regeln på det. Regler bildar en kedja, så input, output och forward kallas kedjor, kedjor av regler. Det kan vara flera åtgärder:

  • ACCEPTERA- låt paketet passera vidare längs kedjan av regler;
  • SLÄPPA- ta bort paketet;
  • AVVISA- avvisa paketet, ett meddelande kommer att skickas till avsändaren om att paketet avvisades;
  • LOGGA- registrera paketet i loggfilen;
  • - skicka ett paket till en användarapplikation.

Regler kan kontrollera alla matchningar, till exempel efter ip, efter port för mottagaren eller avsändaren, pakethuvuden och mycket mer. Om paketet inte matchar någon av reglerna, tillämpas standardåtgärden, vanligtvis ACCEPT, på det.

När vi kommit på reglerna kan vi gå tillbaka till kedjorna. Utöver de som anges ovan finns det ytterligare två regelkedjor:

  • fördirigering- paketet kommer in i denna kedja innan iptables bearbetning, systemet vet ännu inte vart det kommer att skickas, för inmatning, utmatning eller vidarebefordran;
  • postrouting- alla passerande paket som redan har passerat vidarekopplingskedjan kommer hit.

Men det är inte allt. Vi har även iptables-bord, som också är önskvärda att hantera.

ipatables

Ovanför regelkedjorna i iptables finns ytterligare ett lager av abstraktion, och det är tabeller. Det finns flera tabeller i systemet, och de har alla en standarduppsättning av ingångs-, framåt- och utmatningskedjor. Tabeller används för att utföra olika åtgärder på paket, såsom modifiering eller filtrering. Nu är detta inte så viktigt för dig och det räcker med att veta att iptables paketfiltrering utförs i filtertabellen. Men vi ska ta en titt på dem alla:

  • - utformade för att fungera med råpaket, medan de ännu inte har bearbetats;
  • mangel- utformad för att modifiera paket;
  • nat- ger nat-drift om du vill använda datorn som en router;
  • filtrera- huvudtabellen för filtrering av paket, som används som standard.

Med teorin nästan allt, låt oss nu titta på iptables kommandoradsverktyg, med vilket iptables-systemet hanteras.

Iptables verktyg

Iptables undersystem och netfilter är inbyggda i kärnan, men en uppsättning verktyg för att hantera allt detta levereras inte alltid med systemet. För att installera verktyget på Ubuntu, skriv:

sudo apt installera iptables

På Fedora-baserade distributioner är installationen av iptables lite annorlunda:

sudo yum installera iptables

När installationen av iptables är klar kan du fortsätta till konfigurationen, men låt oss först titta på syntaxen för verktyget. Kommandot ser vanligtvis ut så här:

-t bordsåtgärdskedja Extra tillval

Låt oss nu titta på alternativen för iptables, tabellen anger tabellen att arbeta med, detta alternativ kan utelämnas, åtgärden är den önskade åtgärden, till exempel skapa eller ta bort en regel, och de ytterligare alternativen beskriver åtgärden och regeln för att utföras.

Det återstår att överväga de viktigaste åtgärderna som iptables låter dig utföra:

  • -A- lägg till en regel i kedjan;
  • -FRÅN- kontrollera alla regler;
  • -D- ta bort en regel;
  • -Jag- infoga en regel med önskat nummer;
  • -L- visa alla regler i den aktuella kedjan;
  • -S- visa alla regler;
  • -F- rensa alla regler;
  • -N- skapa en kedja;
  • -X- ta bort kedjan;
  • -P- ställ in standardåtgärden.

Ytterligare alternativ för regler:

  • -s- ange protokollet, ett av tcp, udp, udplite, icmp, icmpv6, esp, ah, sctp,
    mh;
  • -s- ange ip-adressen för enheten som skickar paketet;
  • -d- ange ip-adressen för mottagaren;
  • -jag- ingångsnätverksgränssnitt;
  • -o- utgående nätverksgränssnitt;
  • -j- välj en åtgärd om regeln matchar.

Nu kan vi gå vidare till exempel på hur iptables är konfigurerat.

Iptables-konfigurationsexempel

Vi kommer att titta på några grundläggande exempel så att du kan konsolidera allt du läser ovan.

Lista över regler

Låt oss först titta på hur iptables-regeluppslagningen utförs, alternativet -L räcker för detta:

Du kan också ange önskad kedja för att endast visa reglerna för den:

iptables -L INPUT

Rensa reglerna

Du kan inte bara inaktivera iptables genom att stoppa iptables-regeluppdateringstjänsten via systemd, eller ens genom att ta bort uppsättningen konfigurationsverktyg. Undersystemet fungerar på kärnnivå och beror inte på vad du har installerat där. Därför, om du gör något fel, måste du rensa reglerna. För att göra detta, kör:

Eller bara för en specifik kedja:

sudo iptables -F Ingång

Jag påminner dig om att alla dessa åtgärder utförs för standardtabellen - filter.

Standardregler

Som jag sa, om ingen regel matchar ett paket, tillämpas standardåtgärden på det. Det kan ställas in med alternativet -p:

sudo iptables -p INPUT ACCEPT
$ sudo iptables -p OUTPUT ACCEPTERAR
$ sudo iptables -p FRAMÅT

I det här exemplet aktiverar vi INPUT- och OUTPUT-kedjorna, men inaktiverar FORWARD.

Paketblockering

För att blockera paket kan vi använda DROP-åtgärden, vi kan filtrera de paket som vi behöver blockera efter många kriterier, såsom protokoll, ip-adress, nätmask, port och mycket mer.

Så här kommer kommandot att se ut, vilket låter dig lägga till en iptables-regel för att blockera alla inkommande paket från 10.10.10.10:

sudo iptables -A INPUT -s 10.10.10.10 -j DROP

Och nu utgående paket till samma adress:

IP-räckviddsblockering görs på liknande sätt. För att göra detta måste du använda nätmasken 10.10.10.0/24. Dessa kommer att vara alla adresser från 10.10.10.0 till 10.10.10.255:

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

Eller en utökad version av masken:

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

Du kan också blockera alla inkommande ssh-anslutningar:

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

Som du kan se är det väldigt enkelt att lägga till en iptables-regel.

Ta bort regler

Att ta bort iptables-regler görs på samma sätt som att skapa nya, men istället för alternativ A måste du använda alternativ D. Titta först på listan med regler:

Så här kan du till exempel ta bort iptables-regeln som skapades på andra plats:

sudo iptables -A OUTPUT -s 10.10.10.10 -j DROP

Du kan också rensa iptables helt genom att köra kommandot med alternativet -F:

En pålitlig brandvägg är en av de viktigaste aspekterna av att skydda alla moderna operativsystem. De flesta Linux-distributioner innehåller flera olika brandväggsverktyg. Den här guiden fokuserar på en av de mest populära - iptables.

Så iptables är en standardbrandvägg som ingår i de flesta Linux-distributioner som standard (nftables utvecklas för att ersätta den). Faktum är att iptables är ett användargränssnitt för att hantera netfiltersystemet, som i sin tur hanterar Linux-nätverksstacken. iptables jämför varje inkommande paket mot en uppsättning etablerade regler och bestämmer sedan vad som ska göras med det härnäst.

Det handlade om hur exakt iptables fungerar. Den här artikeln fokuserar på praktiska exempel som visar hur man skapar en grundläggande uppsättning regler för en Ubuntu 14.04-server.

Grundläggande iptables-kommandon

Det här avsnittet innehåller de grundläggande kommandona med vilka du kan skapa en komplex uppsättning regler och kontrollera iptables-gränssnittet i allmänhet.

Kom ihåg: iptables-kommandon måste köras med root-privilegier. Det betyder att du måste göra något av följande:

  • logga in som root-användare;
  • använd su eller sudo -i för att expandera rotskalet;
  • starta alla kommandon med sudo (rekommenderat sätt i Ubuntu).

Den här guiden använder det senare alternativet.

Så först måste du titta på listan över nuvarande iptables-regler. Flaggan -L används för detta:

sudo iptables -L
Chain INPUT (policy ACCEPT)


målprot opt-source destination
Kedje OUTPUT (policy ACCEPT)
målprot opt-source destination

Som du kan se innehåller listan tre standardkedjor (INPUT, OUTPUT och FORWARD), var och en med en standardpolicyuppsättning (för närvarande ACCEPT). Du kan också se kolumnnamnen. Men själva reglerna ingår inte i den här listan, eftersom Ubuntu inte levereras med en uppsättning standardregler.

Med flaggan -S kan den här listan visas i ett annat format som återspeglar de kommandon som behövs för att aktivera reglerna och policyerna:

sudo iptables -S
-P INPUT ACCEPTERA
-P FRAMÅT ACCEPTERA
-P UTGÅNG ACCEPTERAR

För att replikera konfigurationer behöver du bara skriva sudo iptables i början av varje resultatrad. (Beroende på dina konfigurationer kan den här proceduren vara lite mer komplicerad när du fjärransluter; om reglerna som tillåter den aktuella anslutningen inte redan är inställda bör du inte ställa in DROP-policyn.)

För att återställa de nuvarande reglerna (om några), skriv:

sudo iptables -F

Återigen är standardpolicyn mycket viktig vid denna tidpunkt eftersom den inte kommer att ändras med det föregående kommandot även om alla regler tas bort från kedjorna.

Innan du återställer reglerna för en fjärranslutning måste du se till att INPUT- och OUTPUT-kedjorna har ACCEPT-policyn inställd. Detta görs så här:

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

När du har skapat regler som tillåter fjärranslutningar kan du ställa in DROP-policyn. Så låt oss gå direkt till skapandet av regler.

Skapa iptables regler

Som nämnts ovan fokuserar denna guide på att arbeta med INPUT-kedjan, eftersom den ansvarar för inkommande trafik. Först måste vi överväga den redan nämnda regeln - regeln som tillåter den nuvarande SSH-anslutningen.

Det ser ut så här:

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

Naturligtvis kan det till en början verka otroligt komplicerat; För att förstå denna regel, bekanta dig med dess komponenter:

  • -EN INGÅNG: flagga -A lägger till ( bifoga) härskar till slutet av kedjan. Den här delen av kommandot säger åt iptables att lägga till regeln i slutet av INPUT-kedjan.
  • -m conntrack: förutom en uppsättning grundläggande funktioner har iptables även en uppsättning tillägg, eller moduler, som är ansvariga för brandväggens ytterligare funktioner. Den här delen av kommandot säger att användaren behöver tillgång till funktionerna i conntrack-modulen. Den här modulen låter dig använda kommandon som bestämmer vad du ska göra med ett paket baserat på dess relation till tidigare anslutningar.
  • --ctstat: ett av kommandona som är tillgängliga när du anropar conntrack-modulen. Detta kommando låter dig spåra förhållandet mellan paket och andra paket som vi sett tidigare. Den är inställd på ETABLISHED (som accepterar paket som är en del av en befintlig anslutning) och RELATED (accepterar paket som är associerade med en redan etablerad anslutning). Det är denna del av regeln som är ansvarig för den aktuella SSH-sessionen.
  • jACCEPTERA: anger åtgärden (målet) som ska utföras på paketet som matchar regeln. I det här fallet kommer iptables att acceptera paket som uppfyller de tidigare kriterierna.

Denna regel bör placeras i början för att säkerställa att redan befintliga anslutningar matchar reglerna, accepteras och lämnar kedjan innan DROP-reglerna når.

Genom att begära en lista med regler kan du se ändringarna:

sudo iptables -L
Chain INPUT (policy ACCEPT)
målprot opt-source destination
ACCEPTERA allt -- var som helst var som helst ctstate RELATERAT, ETABLERAD
Kedja FRAMÅT (policy ACCEPTERA)
målprot opt-source destination
Kedje OUTPUT (policy ACCEPT)
målprot opt-source destination

Nu när du är bekant med den grundläggande syntaxen, skapa några fler regler som accepterar en anslutning.

Att skapa andra viktiga kopplingar

Tidigare instruerades iptables att inte avbryta alla nuvarande anslutningar, utan också acceptera alla anslutningar relaterade till dem. Nu måste du skapa regler som accepterar anslutningar som inte uppfyller ovanstående kriterier.

Lämna två portar öppna: SSH-porten (den här guiden använder standardporten 22; om detta värde har ändrats, se till att ange det nya värdet); låt oss också anta att den här datorn kör en webbserver på port 80 som standard (lägg inte till den här regeln om den inte är det).

Så raderna som ska användas för att skapa sådana regler ser ut så här:

sudo iptables -A INPUT -p tcp --dport 22 -j ACCEPTERA
sudo iptables -A INPUT -p tcp --dport 80 -j ACCEPTERA

Som du kan se är de väldigt lika den första regeln; kanske har de en ännu enklare struktur. Nya alternativ:

  • sidtcp: Detta alternativ låter paket som använder TCP (ett strömorienterat protokoll som används av de flesta applikationer eftersom det ger tillförlitlig kommunikation) passera.
  • dport: det här alternativet är tillgängligt när du använder flaggan -p tcp. Den anger den inkommande porten som paketets port måste matcha. Den första regeln tillåter TCP-paket destinerade för port 22, och den andra regeln accepterar TCP-trafik avsedd för port 80.

Nu måste vi skapa en annan ACCEPT-regel för att se till att servern fungerar korrekt. Typiskt kommunicerar tjänster genom att utbyta paket; för att göra detta använder de ett loopback-nätverk pseudo-gränssnitt - den så kallade loopback-enheten, som dirigerar trafik tillbaka till sin källa och inte till andra datorer.

Det vill säga, om tjänst 1 behöver upprätta en anslutning med tjänst 2 som lyssnar efter anslutningar på port 4555, så skickar tjänst 1 ett paket till port 4555 med hjälp av en loopback-enhet. Detta beteende bör tillåtas eftersom det är en viktig förutsättning för att många program ska fungera korrekt.

För att göra detta, lägg till följande regel:

sudo iptables -I INPUT 1 -i lo -j ACCEPTERA

Det skiljer sig något från de tidigare reglerna; överväg det mer i detalj:

  • jagINGÅNG 1: Flaggan -I säger åt iptables att infoga regeln. Denna flagga skiljer sig från flaggan -A (som helt enkelt lägger till regeln i slutet av kedjan); den anger i vilken kedja regeln ska läggas till och platsen för regeln i den. I det här fallet måste regeln infogas i början av INPUT-kedjan, vilket resulterar i att alla regler kommer att flytta en position. Denna regel bör placeras i början av kedjan, eftersom det är en av huvudreglerna och inte bör bero på de andra.
  • ilo: Denna regelkomponent tillåter paket som använder lo-gränssnittet ("lo" är ett annat namn för loopback-enheten) att passera igenom. Detta innebär att alla paket som använder detta gränssnitt måste accepteras.

För att se de aktuella reglerna, använd -S-flaggan, eftersom -L-flaggan inte visar viss information (till exempel gränssnittet som regeln är bunden till, vilket är mycket viktigt när det gäller den sista regeln):

sudo iptables -S
-P INPUT ACCEPTERA
-P FRAMÅT ACCEPTERA
-P UTGÅNG ACCEPTERAR
-A INPUT -i lo -j ACCEPTERA
-A INPUT -m conntrack --ctstate RELATED,ETABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPTERA
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPTERA

Skapa DROP-regler

Så för tillfället har 4 regler skapats som accepterar paket baserat på vissa kriterier. Men just nu blockerar servern fortfarande inte några andra paket.

Om ett paket passerar INPUT-kedjan och inte matchar någon av de fyra reglerna, kommer standardpolicyn (ACCEPT) att exekveras, vilket på något sätt kommer att acceptera paketet. Nu måste det ändras.

Detta kan göras på två sätt, som har ganska betydande skillnader.

Det första sättet är att redigera standardpolicyn för INPUT-kedjan; för denna typ:

sudo iptables -P INPUT DROP

Denna policy kommer att övervaka och släppa alla paket som inte matchar någon av INPUT-kedjans regler. En konsekvens av denna typ av konstruktion är att den kommer att tappa paket även efter att själva reglerna har släppts.

Naturligtvis ökar detta säkerhetsnivån på servern; detta kan dock få allvarliga konsekvenser om användaren inte har något annat sätt att ansluta till servern. Oftast tillhandahåller värdleverantörer en webbkonsol för att ansluta till servern i händelse av sådana problem. En sådan konsol fungerar som en virtuell lokal anslutning, så iptables kommer inte att svara på den.

Du kan få servern att automatiskt återställa anslutningen om reglerna tas bort. Detta kommer att göra servern säkrare och svårare att nå. Det betyder också att du kan lägga till regler i slutet av kedjan, och samtidigt kommer alla oönskade paket att släppas.

Ett alternativt tillvägagångssätt är att lägga till en regel i slutet av kedjan som tar bort alla icke-matchande paket samtidigt som ACCEPT-policyn bibehålls.

För att återställa ACCEPT-policyn till INPUT-kedjan, skriv:

sudo iptables -P INPUT ACCEPT

Nu kan du lägga till en regel i slutet av denna kedja som kommer att ta bort alla icke-matchande paket:

sudo iptables -A INPUT -j DROP

Under normala driftsförhållanden blir resultatet exakt detsamma som när du använder DROP-policyn. Denna regel tar bort varje paket som når det, vilket förhindrar att paket som inte matchar reglerna når servern.

I grund och botten används det andra tillvägagångssättet när det är nödvändigt att behålla ACCEPT-policyn som accepterar trafik. Det vill säga, även om alla regler är återställda kan användaren komma åt maskinen i nätverket. Detta tillvägagångssätt låter dig utföra standardåtgärderna utan att behöva ändra policyn som kommer att gälla för den tomma kedjan.

Detta innebär förstås också att varje regel som behöver läggas till i slutet av kedjan måste komma före droppregeln. Detta kan göras antingen genom att tillfälligt ta bort återställningsregeln:

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

eller genom att infoga en ny regel i slutet av kedjan (men före återställningsregeln), ange radnumret. För att lägga till regeln på rad 4, skriv:

sudo iptables -I INPUT 4 new_rule

Om det finns många regler är det ganska problematiskt att manuellt beräkna radnumret; i ett sådant fall kan iptables numrera raderna:

sudo iptables -L --radnummer
Chain INPUT (policy DROP)

1 ACCEPTERA allt -- var som helst var som helst
2 ACCEPTERA allt -- var som helst var som helst ctstate RELATERAT, ETABLERAD
3 ACCEPTERA tcp -- var som helst var som helst tcp dpt:ssh
4 ACCEPTERA tcp -- var som helst var som helst tcp dpt:http
Kedja FRAMÅT (policy ACCEPTERA)
num target prot opt-source destination
Kedje OUTPUT (policy ACCEPT)
num target prot opt-source destination

Detta gör att du kan försäkra dig om att regeln angavs på rätt rad.

Sparar iptables-inställningar

Som standard förblir alla osparade regler i kraft tills nästa serverstart; omedelbart efter en omstart kommer osparade regler att gå förlorade.

Detta är användbart i vissa fall, eftersom det tillåter användare som av misstag har blockerat sig själva att få åtkomst till servern. Men i de flesta fall är det fortfarande bekvämare att spara reglerna och ladda dem när servern startar.

Detta kan göras på flera sätt; det enklaste är att använda iptables-persistent-paketet, som kan laddas ner från standard Ubuntu-förvaret:

sudo apt-get uppdatering
sudo apt-get installera iptables-persistent

Under installationen kommer paketet att ange om de nuvarande reglerna ska sparas för ytterligare automatisk laddning; om de nuvarande reglerna har testats (tillåter SSH-anslutningar) och uppfyller alla krav kan de sparas.

När installationen är klar kommer det att finnas en ny tjänst som heter iptables-persistent som startar när servern startas om och återupptar de etablerade reglerna.

Resultat

Den här guiden hjälper till att konfigurera brandväggen enligt användarens krav. Naturligtvis finns det många fler sådana verktyg, och några av dem kan vara lättare att använda; Ändå är iptables ett av de bästa verktygen, om så bara för att det visar några av de grundläggande nätfilterstrukturerna och ingår i många system.

Taggar: ,

Flera gånger har jag stött på att även allmänt intelligenta människor gör helt oförlåtliga misstag. Till exempel öppnar de porten som databasen snurrar på till hela Internet. Det är ofta fallet med DevOps-nybörjare som har skrivit kod hela sitt liv, och nu ingår även i deras arbetsuppgifter att sätta upp servrar. Det finns bra tutorials på webben om grundläggande brandväggsinstallation på Linux och andra *nix, men ofta är dessa ark för flera skärmar. Så jag hoppas att denna mer kortfattade handledning kommer att vara användbar för någon.

Viktig! Det är väldigt lätt att av misstag brandvägga en maskin så att du inte kommer åt den igen. Detta gäller särskilt för molnvärd. Till exempel, om du stänger alla portar från 1024 till 65536 i AWS, stängs maskinen av någon anledning efter omstart i allmänhet allt hamnar. Om du är värd i molnen är det bättre att konfigurera brandväggen via webbgränssnittet som tillhandahålls av värdskapet.

En liten notering om terminologi. Brandväggen som är inbyggd i Linux-kärnan kallas Netfilter, och iptables är ett verktyg för att hantera denna brandvägg. Många tror felaktigt att brandväggen kallas iptables. Det är inte sant. Att säga något som "Jag filtrerar paket med iptables" visar din okunnighet för andra.

I allmänhet, vilka uppgifter kan lösas med Netfilter:

  • Tillåt/neka inkommande trafik till vissa portar med hjälp av vissa protokoll (IPv4/IPv6, TCP/UDP) från specificerade adresser (IP, MAC) eller subnät;
  • Allt är sig likt för utgående trafik;
  • Du kan till exempel helt ignorera alla ICMP-paket;
  • Konfigurera NAT, se artikeln om routern baserad på Raspberry Pi ;
  • Jag hörde att riktiga gurus kan ställa in DDoS och brute force-skydd, begränsa nätverksåtkomst till specifika applikationer, användare eller grupper och göra andra galna saker;

Jag noterar att iptables-verktyget verkade för mig personligen till en början extremt obekvämt jämfört med ipfw i FreeBSD. Lyckligtvis, efter att ha lekt med den ett tag, blir alla dessa många flaggor som -A, -D, -j och andra bekanta, så ha tålamod. Låt oss ta en titt på de grundläggande kommandona.

Visa alla regler:

iptables -L -n

Du kanske märker att Netfilter har några "kedjor" (kedjor) - åtminstone INPUT, OUTPUT och FORWARD. Jag personligen har också en Docker-kedja på min maskin. För första gången kan du tänka på de två första som all inkommande respektive utgående trafik och tillfälligt glömma resten. Det finns en god chans att du aldrig kommer att behöva dem alls.

Ta bort alla regler:

iptables -F

Ändra policy (standardbeteende) för kedjan:

iptables -P INPUT DROP
iptables -P INPUT ACCEPT

Neka åtkomst från värd/undernät:

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

Du kan också använda domännamn:

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

Förbud mot utgående anslutningar:

iptables -A OUTPUT -d 123.45.67.89 -j DROP

Negativ kan användas i regler:

iptables -EN INGÅNG! -s 123.45.67.89 -j DROPPA

Ta bort en regel efter dess nummer i kedjan:

iptables -D INPUT 1

Ta bort en regel baserat på vad den gör:

iptables -D INPUT -s 123.45.67.89 -j DROP

Alternativet -p anger protokollet. Du kan använda all, icmp, tcp, udp eller protokollnumret från /etc/protocols. Flagga - -sport anger porten från vilken paketet skickades, och - -dport anger destinationsporten:

iptables -A INPUT -p tcp --sport 80 -j ACCEPTERA
iptables -A INPUT -p tcp --dport 80 -j ACCEPTERAR

Infoga en regel i början av kedjan:

iptables -I INPUT ...

Eller så kan du ange en specifik position:

iptables -I INPUT 3 ...

iptables-save > /etc/iptables.rules

Återställ regler:

iptables återställning< / etc/ iptables.rules

Låt oss nu titta på några praktiska exempel. Så här ser till exempel netsplit-emulering ut i ett test som kontrollerar beteendet hos en applikation som använder Akka Cluster:

kör(nod1, s "iptables -A INPUT -s $node2 -j DROP")
kör(nod1, s "iptables -A INPUT -s $node3 -j DROP")
kör(nod1, s "iptables -A OUTPUT -d $node2 -j DROP")
kör(nod1, s "iptables -A OUTPUT -d $node3 -j DROP")

Återställningen är exakt densamma, bara -A-flaggan ersätts med -D-flaggan.

Ett annat exempel. Det krävs för att ta reda på vilka portar som lyssnar på maskinen och stänga de extra. Vi går till bilen och säger:

netstat-tuwpln

Exempelutgång:

Aktiva internetanslutningar (endast servrar)
Proto Recv-Q Send-Q Lokal adress Utländsk adress Status PID/Prog namn
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:* LISTEN 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:* LISTEN 990/postgres

Nginx och SSHd tittar på internet, det är bra. PostgreSQL lyssnar bara på det lokala gränssnittet, så det är inga problem med det heller. Men epmd sticker ut (du kan kolla med telnet från en annan maskin), och det här är inte bra. Du kan bara stänga port 4369. Hur man gör detta visades ovan. Eller så kan du gå ännu längre och neka alla anslutningar utifrån till port 81 och äldre.