1. Firewall má povolit oprávněný přístup ke službám, zdrojům a naopak zamezit
neoprávněné komunikaci.
- když by si to dělala každá služba sama byla by to duplikace
- na jednom místě podchytíme veškerou komunikaci, můžeme třeba logovat
2. Není to nějaká mystická ochrana
3. Firewall je zlo
- všechno tak nějak v AT&T Bell Laboratories.
(NAT, překlad adres - historický relikt, před ipv6)
- Softwarová versus hardwarové firewally.
- krabička s Linuxem versus věc kde se o to stará opravdu hardware.
zmatené co je co - občas se pod pojmem iptables rozumí celý firewall apod. Zjednodušeně Netfilter je kernelová část a iptables user-space program pro manipulaci s tabulkami firewallu.
Netfilter je sada háčků v kernelu v síťovém stacku. - je to tam naháčkované když je paket v téhle fázi tak ho projeď touhle tabulkou. Jelikož je to součást jádra musíte ho mít v jádře zaplý, v distribučním jádře už je.
Networking support ---> Networking options ---> Network packet filtering framework (Netfilter) --->
iptables je pak pro manipulaci s tabulkami - přidáváme pomocí něho do nich pravidla.
ipfwadm (Linux 2.0)
ipchains (Linux 2.2)
iptables (Linux 2.4, 2.6) - stavový, forwardované pakety procházejí jen přes FORWARD
nftables
http://lwn.net/Articles/324251/
# nft add rule output tcp dport 22 log accept
________ _____ _________ / \ / \ / \ příchozí ->|PREROUTING|-->[směrovací ]---->|FORWARD|---->|POSTROUTING|--> odcházející pakety \________/ [rozhodnutí ] \_____/ \_________/ pakety | ^ v ____ | _|_ / \ | / \ |OUTPUT|-->[směrovací ] |INPUT| \____/ [rozhodnutí ] \___/ ^ | | `--> lokální proces --'převzato a přeloženo:)
Nejdůležitější tabulka je filter, obsahuje řetězce INPUT, OUTPUT, FORWARD. PREROUTING a POSTROUTING jsou z tabulky nat, když bychom je vyputili tak pořád každý paket spadne do některého řetězce z filter.
Tabulka filter:
Tabulka nat:
Výše popsány jsou výchozí řetězce v tabulkách, můžeme přidávat své vlastní (mazat výchozí nelze).
Tabulky jsou v manuálu iptables popsány čtyři - výše zmíněný filter, pak nat který slouží k manipulaci s překladem adres, mangle pro značkování paketů (MARK - což se využije například dále pro shapování provozu) či manipulaci s TOS a TTL.
---------------------------------------------------------- filter | | --------------------------------------- -----------------| INPUT (P: DROP) | |OUTPUT(P:ACCEPT)| -A INPUT -p tcp --dport 80 -j DROP | | | -A INPUT -p icmp -j ACCEPT | | | | | | --------------------------------------| |----------------| | | | -----------------------------------------------------------
Například máme tabulku filter, v ní řetězec (chain) INPUT - tady spadnou příchozí pakety určené pro náš stroj. Dále se v tomto řetězci zkouší paket "napasovat" na jednotlivé pravidla. Pravidlo popisuje nějaký druh paketů a co se s ním má udělat (TARGET). Jakmile paket narazí na TARGET ukončující (např. ACCEPT, DROP...) tak průchod končí a další pravidla se neaplikují (na pořadí tedy záleží). Může narazit na TARGET neukončující (třeba LOG). Projde-li paket až na konec, bez toho aby byl zachycen nějakým ukončujícím pravidlem aplikuje se na něj výchozí politika (policy) řetězce (ACCEPT, DROP...)
binárka iptables většinou v /sbin/iptables. Musíme spouštět jako root. Mámě několik možností jak "spouštět" firewall. Vy výchozím nastavení se přijímá vše. Jedna možnost je vytvořit init script přímo s pravidly (pohodlné, nečisté v tom že init script obsahuje nějaká data a není to pěkně někde v konfiguračním souboru -- ale jednoduší na skriptování). Druhá možnost je použít příkazy iptables-save/restore.
iptables -A INPUT -i eth0 -s 192.168.3.1 -p tcp --dport 22 -j ACCEPT -A INPUT - přidat pravidlo do řetězce INPUT -i eth0 - vyhovuje paket který přijde rozhraním eth0 -s 192.168.3.1 - paket má zdrojovou IP adresu 192.168.3.1 -p tcp - odpovídá protokol tcp --dport 22 - destination port - port na našem stroji 22 -j ACCEPT - propusť takový paket
iptables -L -n -L vypíše tabulku -n nebude vyhledávat jména pro IP adresy Chain INPUT (policy DROP) target prot opt source destination ACCEPT all -- anywhere anywhere ACCEPT icmp -- anywhere anywhere ACCEPT all -- anywhere anywhere state RELATED,ESTABLISHED Chain FORWARD (policy DROP) target prot opt source destination Chain OUTPUT (policy ACCEPT) target prot opt source destination
Příkazy pro manipulaci s pravidly:
iptables -A //přidá pravidlo iptables -D //vymaže pravidlo iptables -I //vloží - 1 - výchozí - na začátek iptables -F //vymaže pravidla
Povětšinou nepřidáváme pravidla divoce z příkazové řádky, ale máme nějaký skript. Nějaký minimální základ vypadá většinou takto:
# vymaže všechny pravidla $IPTABLES -F $IPTABLES -F -t nat # vymaže všechny nezabudované řetězce (musí být prázdné) $IPTABLES -X # výchozí politika by měla být co není povoleno je zakázáno. $IPTABLES -P INPUT DROP $IPTABLES -P OUTPUT ACCEPT $IPTABLES -P FORWARD DROP # iptables man (except loopback traffic, which involves both INPUT and OUTPUT chains) $IPTABLES -A INPUT -i lo -j ACCEPT # jak je to s přijímáním ICMP paketů, někdo vybírá některé $IPTABLES -A INPUT -p icmp -j ACCEPT # využití stavového firewallu $IPTABLES -A INPUT -i $ETH_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT
Potřebné moduly (třeba ipt_REJECT) by se měly načíst automaticky.
Můžeme vytvářet vlastních řetězce - přehlednost, rychlost. Uživatelem vytvořené řetězce nemají Policy, jakmile dojde paket na konec našeho chainu, zase se vynoří v hlavním řetězci.
iptables -N tcp_segmenty iptables -A INPUT -p TCP -i eth0 -j tcp_segmenty iptables -A tcp_segmenty -p TCP --dport 80 -j ACCEPT iptables -A tcp_segmenty -p TCP --dport 25 -j ACCEPT
$IPTABLES -A INPUT -i $ETH_LAN -p tcp --dport 22 -s aisa -j DROP ssh: connect to host eden.mine.cz port 22: Connection timed out (pomalé)
$IPTABLES -A INPUT -i $ETH_LAN -p tcp --dport 22 -s aisa -j REJECT --reject-with tcp-reset ssh: connect to host eden.mine.cz port 22: Connection refused (rychlé)
REJECT - náročnější pro stroj, musí poslat odpověď, ale uživatel nemusí čekat.
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 5 -j ACCEPT
...-m time --timestart 12:30 --timestop 13:30...
- aisa - neuvádět doménové názvy které se resolvují vzdáleně přes DNS je hodně špatný nápad. Nebo byl před nástupem dnssec.
$IPTABLES -t nat -A PREROUTING -p tcp --dport 5900 -j DNAT --to 192.168.1.2:5900
Ve výchozím stavu linuxový stroj neforwarduje pakety, je třeba povolit v
zapsat hodnotu 1 do /proc/sys/net/ipv4/ip_forward. Systémové řešení je v
debianu povolit net.ipv4.ip_forward=1
v
/etc/sysctl.conf
nebo v sysctl.d
. Ve stejném souboru
najdeme i net.ipv4.conf.all.rp_filter=1
, což hlídá aby se
rozhraní neobjevily zdrojové adresy které tam nemají co dělat (z internetu by
nám asi neměl přijít paket se zdrojovou adresou 192.168.1.1).
http://en.wikipedia.org/wiki/Ipfirewall (FreeBSD)
http://www.openbsd.org/faq/pf/ (OpenBSD)
- bsd licence
Nechce-li se vám psát pravidla pro iptables "ručně", lze využít některé
buildery.
http://firehol.sourceforge.net/