Vyhledávání na webu

Jak nastavit bránu Iptables Firewall k povolení vzdáleného přístupu ke službám v systému Linux – část 8


Představujeme certifikační program Linux Foundation

Z části 1 – O Iptables této série LFCE (Linux Foundation Certified Engineer) si vzpomínáte, že jsme poskytli základní popis toho, co je firewall: mechanismus pro správu pakety přicházející a opouštějící síť. Slovem „spravovat“ ve skutečnosti myslíme:

  1. Povolit nebo zabránit určitým paketům ve vstupu nebo opuštění naší sítě.
  2. Předávat další pakety z jednoho bodu sítě do druhého.

na základě předem stanovených kritérií.

V tomto článku probereme, jak implementovat základní filtrování paketů a jak nakonfigurovat firewall pomocí iptables, frontendu k netfilter, což je nativní modul jádra používaný pro firewalling.

Vezměte prosím na vědomí, že firewalling je rozsáhlé téma a tento článek nemá být komplexním průvodcem k pochopení všeho, co je o něm třeba vědět, ale spíše jako výchozí bod pro hlubší studium tohoto tématu. K tématu se však vrátíme v části 10 této série, když prozkoumáme několik konkrétních případů použití firewallu v Linuxu.

Firewall si můžete představit jako mezinárodní letiště, kam osobní letadla přilétají a odlétají téměř 24 hodin denně, 7 dní v týdnu. Na základě řady podmínek, jako je platnost cestovního pasu osoby nebo země jejího původu (abychom uvedli několik příkladů), jí může, ale nemusí být povolen vstup do určité země nebo ji opustit.

Zároveň mohou letištní úředníci nařídit lidem, aby se v případě potřeby přesunuli z jednoho místa na letišti na druhé, například když potřebují projít celní správou.

Analogie s letištěm může být užitečná ve zbytku tohoto tutoriálu. Při postupu mějte na paměti následující vztahy:

  1. Osoby=balíčky
  2. Firewall=letiště
  3. Země č. 1=Síť č. 1
  4. Země č. 2=Síť č. 2
  5. Letištní předpisy vynucované důstojníky=pravidla firewallu

Iptables – základy

Na nižší úrovni je to samotné jádro, které „rozhoduje“, co dělat s pakety na základě pravidel seskupených do řetězců neboli vět. Tyto řetězce definují, jaké akce by měly být provedeny, když balíček splňuje kritéria jimi určená.

První akce provedená iptables bude spočívat v rozhodnutí, co s paketem udělat:

  1. Přijmout to (nechat to projít do naší sítě)?
  2. Odmítnout (zabránit mu v přístupu k naší síti)?
  3. Přeposlat to (do jiného řetězce)?

Jen pro případ, že by vás zajímalo, proč se tento nástroj nazývá iptables, je to proto, že tyto řetězce jsou organizovány v tabulkách, přičemž tabulka filtrů je nejznámější a ta, která je používá se k implementaci filtrování paketů s jeho třemi výchozími řetězci:

1. Řetězec INPUT zpracovává pakety přicházející do sítě, které jsou určeny pro místní programy.

2. Řetězec OUTPUT se používá k analýze paketů pocházejících z místní sítě, které mají být odeslány ven.

3. Řetězec FORWARD zpracovává pakety, které by měly být předány jinému cíli (jako v případě routeru).

Pro každý z těchto řetězců existuje výchozí politika, která určuje, co by se mělo standardně dělat, když pakety neodpovídají žádnému z pravidel v řetězci. Pravidla vytvořená pro každý řetězec a výchozí zásady můžete zobrazit spuštěním následujícího příkazu:

iptables -L

Dostupné zásady jsou následující:

  1. AKCEPTOVAT → nechá paket projít. Jakýkoli paket, který neodpovídá žádným pravidlům v řetězci, je povolen do sítě.
  2. DROP → tiše zahodí paket. Každému paketu, který neodpovídá žádným pravidlům v řetězci, je zabráněno ve vstupu do sítě.
  3. REJECT → odmítne paket a vrátí informativní zprávu. Konkrétně tato nefunguje jako výchozí politika. Místo toho má doplňovat pravidla filtrování paketů.

Při rozhodování o tom, kterou politiku zavedete, musíte zvážit klady a nevýhody každého přístupu, jak je vysvětleno výše – všimněte si, že neexistuje žádný univerzální - veškeré řešení.

Přidávání pravidel

Chcete-li přidat pravidlo do brány firewall, vyvolejte příkaz iptables následovně:

iptables -A chain_name criteria -j target

kde,

  1. -A znamená Append (připojit aktuální pravidlo na konec řetězce).
  2. chain_name je buď INPUT, OUTPUT nebo FORWARD.
  3. cíl je akce nebo zásada, která se má v tomto případě použít (ACCEPT, REJECT nebo DROP).
  4. kritéria je sada podmínek, podle kterých mají být pakety zkoumány. Skládá se z alespoň jednoho (pravděpodobně více) z následujících příznaků. Možnosti uvnitř závorek, oddělené svislou čárou, jsou navzájem ekvivalentní. Zbytek představuje volitelné přepínače:
[--protocol | -p] protocol: specifies the protocol involved in a rule.
[--source-port | -sport] port:[port]: defines the port (or range of ports) where the packet originated.
[--destination-port | -dport] port:[port]: defines the port (or range of ports) to which the packet is destined.
[--source | -s] address[/mask]: represents the source address or network/mask.
[--destination | -d] address[/mask]: represents the destination address or network/mask.
[--state] state (preceded by -m state): manage packets depending on whether they are part of a state connection, where state can be NEW, ESTABLISHED, RELATED, or INVALID.
[--in-interface | -i] interface: specifies the input interface of the packet.
[--out-interface | -o] interface: the output interface.
[--jump | -j] target: what to do when the packet matches the rule.

Naše testovací prostředí

Pojďme to vše slepit do 3 klasických příkladů s použitím následujícího testovacího prostředí pro první dva:

Firewall: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
Source: CentOS 7 
Hostname: dev1.gabrielcanepa.com
IP Address: 192.168.0.17

A to je poslední příklad

NFSv4 server and firewall: Debian Wheezy 7.5 
Hostname: debian
IP Address: 192.168.0.10
Source: Debian Wheezy 7.5 
Hostname: dev2.gabrielcanepa.com
IP Address: 192.168.0.15
PŘÍKLAD 1: Analýza rozdílu mezi zásadami DROP a REJECT

Nejprve definujeme politiku DROP pro vstupní pingy do našeho firewallu. To znamená, že pakety icmp budou tiše zahazovány.

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

Než budeme pokračovat v části REJECT, vyprázdníme všechna pravidla z řetězce INPUT, abychom se ujistili, že naše pakety budou testovány tímto novým pravidlem:

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

PŘÍKLAD 2: Deaktivace/opětovné povolení přihlášení ssh z dev2 do dev1

Řetězec OUTPUT budeme řešit, když zpracováváme odchozí provoz:

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

PŘÍKLAD 3: Povolení/zabránění klientům NFS (od 192.168.0.0/24) připojovat sdílené složky NFS4

Spuštěním následujících příkazů na serveru/bráně firewall NFSv4 zavřete porty 2049 a 111 pro všechny druhy provozu:

iptables -F
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j REJECT

Nyní otevřeme tyto porty a uvidíme, co se stane.

iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 111 -j ACCEPT
iptables -A INPUT -i eth0 -s 0/0 -p tcp --dport 2049 -j ACCEPT

Jak můžete vidět, po otevření provozu se nám podařilo připojit sdílení NFSv4.

Vkládání, přidávání a mazání pravidel

V předchozích příkladech jsme si ukázali, jak připojit pravidla k řetězcům INPUT a OUTPUT. Pokud bychom je místo toho chtěli vložit na předdefinovanou pozici, měli bychom místo toho použít přepínač -I (velké i).

Musíte si pamatovat, že pravidla budou vyhodnocována jedno po druhém a že vyhodnocení se zastaví (nebo přeskočí), když je splněna zásada DROP nebo ACCEPT. Z tohoto důvodu se můžete ocitnout v potřebě posunout pravidla nahoru nebo dolů v seznamu řetězců podle potřeby.

K tomu použijeme triviální příklad:

Uveďme následující pravidlo,

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

na pozici 2) v řetězci INPUT (tím se přesune předchozí #2 jako #3)

Pomocí výše uvedeného nastavení se před kontrolou portu 2049 zkontroluje provoz, aby se zjistilo, zda je směrován na port 80.

Případně můžete smazat pravidlo a změnit cíl zbývajících pravidel na ODMIETNIT (pomocí přepínače -R):

iptables -D INPUT 1
iptables -nL -v --line-numbers
iptables -R INPUT 2 -i eth0 -s 0/0 -p tcp --dport 2049 -j REJECT
iptables -R INPUT 1 -p tcp --dport 80 -j REJECT

V neposlední řadě si musíte pamatovat, že aby byla pravidla brány firewall trvalá, budete je muset uložit do souboru a poté je automaticky obnovit při spuštění (pomocí preferované metody dle vašeho výběru nebo metody, která je k dispozici pro vaši distribuci).

Ukládání pravidel brány firewall:

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

Pravidla obnovy:

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

Zde můžeme vidět podobný postup (ruční ukládání a obnovování pravidel brány firewall) s použitím fiktivního souboru s názvem iptables.dump namísto výchozího souboru, jak je uvedeno výše.

iptables-save > iptables.dump

Chcete-li, aby tyto změny byly trvalé napříč bootováním:

Ubuntu: Nainstalujte balíček iptables-persistent, který načte pravidla uložená v souboru /etc/iptables/rules.v4.

apt-get install iptables-persistent

CentOS: Přidejte následující 2 řádky do souboru /etc/sysconfig/iptables-config.

IPTABLES_SAVE_ON_STOP="yes"
IPTABLES_SAVE_ON_RESTART="yes"

OpenSUSE: Seznam povolených portů, protokolů, adres a tak dále (oddělených čárkami) v /etc/sysconfig/SuSEfirewall2.

Více informací naleznete v samotném souboru, který je silně komentován.

Závěr

Příklady uvedené v tomto článku, i když nepokrývají všechny zvonky a píšťalky iptables, slouží k tomu, aby ilustrovaly, jak povolit a zakázat příchozí nebo odchozí provoz.

Pro ty z vás, kteří jsou fanoušky firewallu, mějte na paměti, že se k tomuto tématu vrátíme s konkrétnějšími aplikacemi v části 10 této série LFCE.

Pokud máte nějaké dotazy nebo připomínky, dejte mi vědět.