Iptables

Cílem článku je základní seznámení s problematikou filtrování paketů, nastavení a uložení iptables na systému Debian na virtuálních serverech 4smart.cz. Článek v žádném případě nevysvětluje všechny možnosti a nastavení iptables, pro zájemce je na konci uvedeno několik odakzů na články, které iptables vysvětlují detailněji.

Iptables je nástroj pro práci se síťovou komunikací. Pomocí něj lze vytvořit firewall pro kontrolu a omezení síťové komunikace.

Proč filtrovat síťovou komunikaci

Filtrování síťové komunikace zajišťuje základní ochranu proti útokům na jednotlivé služby systému. Každá síťová služba, která není určena pro přístup celému světu, by měla být zabezpečena proti pokusům o napadení (např. ssh):

  • Pokus o uhodnudí hesla např. služby ssh, ftp, nebo i SIP účtu, a následné zneužití
  • Útoky typu DoS - velké množství požadavků, které zatěžují systém a mohou vést k nekorektnímu chování popř. pádu systému

Typickým příkladem použití iptables může být :

  • povolení ssh přístupu (nebo i jiné služby) jen z vybraných IP adres
  • zablokování probíhajícího síťového útoku

Pokud má váš systém veřejnou IP adresu, může být z internetu vystaven útokům. Pokud používáte neveřejou adresu a máte pouze promapované vybrané porty, neznamená to, že je váš systém v bezpečí. Je sice nižší riziko útoku z internetu, protože namapované porty k jednotlivým službám neodpovídají portům, na kterém tato služba na serveru běží. Proto útočící roboti tyto nestandartní porty pravděpodobně zkoušet nebudou. Může ale dojít k útoku z jiného virtuálního stroje, který také využívá neveřejnou IP adresu. Takže i v tomto případě doporučuji systém zabezpečit.

Jak vytvořit pravidla

Základním příkazem je

iptables

V základním balíčku debian-6.0-x86_64 a pravděpodobně i z něj odvozených je již tento balíček nainstalován. Pokud jej v systému nemáte, proveďte instalaci :

apt-get install iptables

Existuje několik tabulek:

  • FILTER - filtrování paketů
  • NAT - slouží k modifikaci adres (NAT, promapování portů, …)
  • MANGLE - modifikace paketů nad rámec NATu a filtrování paketů

V tomto článku budeme pracovat s tabulkou FILTER. Pro zjištění aktuálního nastavení pravidel slouží volba:

iptables -L
nebo 
iptables -t filter -L

Volba -t určuje tabulku, není-li uvedeno, pracuje se s tabulkou filter.

Volba -L provádí výpis nastavení.

Výpis by měl vypadat asi takto:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Na výpisu je vidět, že existuje několik řetězů (Chain):

  • INPUT - pakety přicházející do systému zvenku
  • OUTPUT - pakety odcházející ze systému
  • FORWARD - pakety přecházející mezi sítěmi, pokud server funguje jako router

Ve výchozím stavu je u všech řetězců nastavena politika (policy) na ACCEPT - veškerá komunikace je povolena, žádná další pravidla nejsou definována. Pro práci s pravidly se používají volby:

  • iptables -F jmeno_retezu - odstraní všechna pravidla
  • iptables -P jmeno_retezu cil - nastaví výchozí politiku (ACCEPT, DROP, REJECT, …)
  • iptables -A jmeno_retezu … - přidává pravidlo na konec seznamu

Ukažme si nyní, jak vytvořit pravidlo, které povolí vzdálený přístup pomocí ssh (tcp port 22) z IP adresy např. 77.93.202.202.

iptables -A INPUT -p tcp --dport 22 -s 77.93.202.202 -j ACCEPT

Nyní vysvětlení jednotlivých voleb:

  • -A INPUT - Přidáváme do řetězu INPUT (přicházející pakety)
  • -p tcp - pravidlo platí pro TCP pakety
  • –dport 22 - pravidlo platí pro pakety na portu 22
  • -s 77.93.202.202 - pravidlo platí pro pakety přicházející z IP 77.93.202.202
  • -j ACCEPT - tyto pakety budou akceptovány

Dále zakážeme ostatní pakety přicházející na port 22:

iptables -A INPUT -p tcp --dport 22 -j DROP

Podobným způsobem lze přidávat pravidla i pro další služby. Nyní můžeme vypsat aktuální nastavení dříve použitým příkazem iptables -L a dostaneme výpis:

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
ACCEPT     tcp  --  77.93.202.202        anywhere            tcp dpt:ssh
DROP       tcp  --  anywhere             anywhere            tcp dpt:ssh

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Detailnější výpis můžeme dostat iptables -L -v :

Chain INPUT (policy ACCEPT 8 packets, 3215 bytes)
 pkts bytes target     prot opt in     out     source               destination
  672 50140 ACCEPT     tcp  --  any    any     77.93.202.202        anywhere            tcp dpt:ssh
    0     0 DROP       tcp  --  any    any     anywhere             anywhere            tcp dpt:ssh

Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
 pkts bytes target     prot opt in     out     source               destination

Chain OUTPUT (policy ACCEPT 20 packets, 4032 bytes)
 pkts bytes target     prot opt in     out     source               destination

Tento výpis nám zobrazí informace, kolik paketů a bytů prošlo jednotlivými pravidly.

Pozor :

  • Nově zadaná pravidla se ukládají na konec tabulky.
  • Tímto způsobem vytvořená pravidla začínají platit ihned po zadání.
  • Pakety procházejí tabulkou zhora dolů, a paket který splní parametry některého pravidla, nebude dále tabulkou vyhodnocován. Proto jsme nejprve vytvořili pravidlo, které povoluje, a teprve po něm musí být pravidlo, které zakazuje všechno ostatní. Naopak by byly všechny požadavky na port 22 zahozeny a nebylo by možné se na systém vzdáleně připojit.

Uložení pravidel

Vytvořením pravidel práce nekončí. Pravidla máme vytvořená, vše pracuje, ale restartem systému by se vše ztratilo. Nyní musíme zajistit, aby se námi vytvořená pravidla uložila a po startu systému aplikovala. K uložení pravidel použijeme příkaz:

iptables-save >> /etc/network/iptables

Tím dojde k uložení konfigurace do souboru /etc/network/iptables v textové podobě. Tam můžete pravidla upravovat a přidávat. Soubor vypadá nějak takto:

# Generated by iptables-save v1.4.8 on Sat Sep 17 18:16:04 2011
*mangle
:PREROUTING ACCEPT [6792:798116]
:INPUT ACCEPT [6792:798116]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5457:2198551]
:POSTROUTING ACCEPT [5457:2198551]
COMMIT
# Completed on Sat Sep 17 18:16:04 2011
# Generated by iptables-save v1.4.8 on Sat Sep 17 18:16:04 2011
*filter
:INPUT ACCEPT [6792:798116]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [5457:2198551]
COMMIT
# Completed on Sat Sep 17 18:16:04 2011
# Generated by iptables-save v1.4.8 on Sat Sep 17 20:12:35 2011
*mangle
:PREROUTING ACCEPT [1399:255102]
:INPUT ACCEPT [1399:255102]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [992:259680]
:POSTROUTING ACCEPT [992:259680]
COMMIT
# Completed on Sat Sep 17 20:12:35 2011
# Generated by iptables-save v1.4.8 on Sat Sep 17 20:12:35 2011
*filter
:INPUT ACCEPT [55:27259]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [209:82588]
-A INPUT -s 77.93.202.202/32 -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j DROP
COMMIT
# Completed on Sat Sep 17 20:12:35 2011

Ve spodní části vidíme námi zadaná pravidla. Pokud se rozhodnete upravovat pravidla editací tohoto souboru, bude se vám hodit příkaz, který změny provedené v tomto souboru aplikuje:

iptables-apply
nebo 
iptables-restore < /etc/network/iptables

Posledním krokem je nastavení automatického načtení iptables z vytvořeného souboru. Toto lze provést editací souboru /etc/rc.local, který je volán při spuštění systému. Tam stačí doplnit příkaz

/sbin/iptables-restore < /etc/network/iptables

před řádek exit0. Tím dojde k načtení iptables při spouštění systému.

Další rady a doporučení

  • Pokud chcete omezit přístup přes ssh pro správu systému, zadejte alespoň 2 IP adresy ze kterých se můžete přihlásit (doma + v práci, …). Co když dojde ke změně vaší domácí IP adresy? Někteří poskytovatelé internetu (např. ADSL, …) totiž nabízejí veřejnou IP adresu, ale ne statickou - může vám být změněna.
  • Používejte bezpečná hesla.
  • Zvažte použití nestandartních portů pro síťové služby (např. ssh na portu 822, SIP na portu 5560, apod.).

Odkazy

 
filtrovani_paketu_pomoci_iptables.txt · Poslední úprava: 2011/09/22 20:45 autor: cert11