Iptables puust ja punaseks
Toores. Ehk seda pala võib täiendada.
Sisukord
Tööpõhimõte
Iptables või NetFilter on töövahend linuxi kernelisse ehitatud filtreerimismehanismi kasutamiseks. Kokku koosneb iptables niisiis kahest osast. Kerneli moodulitest ning käsurea utiliidist.
Iptables koosneb kolme tüüpi objektidest:
- Reeglid (Rules)
- Ahelad (Chains)
- Tabelid (Tables)
Lisaks on olemas täiendavad moodulid nt erinevate protokollide jälgimiseks.
Ülevaatlikult iseloomustab pakettide liikumist läbi ahelate ning tabelite järgnev skeem.
Reeglid
Peamisteks reegliteks mida rakendatakse on ACCEPT, DROP, LOG, REJECT, DNAT, SNAT ja MASQUERADE.
- ACCEPT - lubab paketi
- DROP - kustutab paketi armutult
- REJECT - kustutab paketi ja teavitab sellest ka paketi saatjat
- LOG - logib paketi ja liigutab paketi edasi järgmisele ahelale
- DNAT – paketi saaja aadress muutmine
- SNAT – paketi saatja aadressi muutmine
- MASQUERADE - Paketi saatja aadressi muutmine tulemüüri enda omaks
Tabelid
Paketid liiguvad läbi tabelite ning ahelate ning seejärel neile omakorda rakendatakse reegleid.
Kõik ahelad kasutavad ühte või teist tabelit. Kui tabel pole määratud võetakse vaikimisi FILTER tabel.
Iptables sisaldab kolme põhitabelit:
filter TABEL
Seda tabelit kasutatakse pakettide filtreerimiseks läbi tulemüüri. Eesmärgiks on puhtalt pakettide filtreerimine. Näiteks sissetulevate pakettide (incoming), väljuvate pakettide (outgoing) ja pakettide mis on edastatud võrgukaartide vahel (filtering).
See tabel sisaldab kolme ahelat:
- INPUT ahel - Sisenevate pakettide filtreerimine, ehk masinale endale suunatud liiklus.
- OUTPUT ahel - Väljuvate pakettide filtreerimine, ehk masina enda genereeritud paketid.
- FORWARD ahel - Võrgukaartide vahel edasi suunatud pakettide filtreerimine, või igasugune edastatav liiklus.
nat tabel Seda tabelit kasutatakse IP muutmiseks.
- PREROUTING ahel - Kasutatakse IP aadressi muutmiseks enne paketi edastamist
- POSTROUTING ahel - Kasutatakse IP muutmiseks peale paketi edastamist
- OUTPUT ahel - Väljuvate ühenduste filtreerimiseks
mangle tabel Leiab kasutamist pakettide märgistamiseks. Igal linuxi tuuma läbival paketil on 32 bitine number ehk märk.
Tabelite sisu näeb järgnevate käsuga iptables -f <tabelinimi> -L. Näiteks:
# iptables -t filter -L
Ahelad
Ahel kujutab endast objekti mis on seotud mingi tabeliga ning millele on omakorda kirjutatud peale hulk erinevaid reegleid.
Masinasse sisenenud oakett liigub mööda ahelaid ülevalt alla seni kuni mõni reegel ühildub paketiga. Näiteks lubab selle või kustutab.
Vaatleme esialgu ahelaid FILTER tabelis. Ehk siis ahelaid INPUT, OUTPUT JA FORWARD.
Ahelates olevaid reegleid näeb käsuga:
# iptables -L 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
Selline pilt näitab, et mingeid reegleid hetkel pole kehtestatud.
Igal ahelaga saab siduda reegleid. Näiteks tekitame järgneva reegli:
# iptables -A INPUT -i eth0 -j REJECT
See reegel on seotud INPUT ahelaga (-A) (ehk sissetulevad paketid) ja kehtib ainult pakettide kohta, mis sisenevad eth0 võrguliidesele (-i ehk input). -j Reject tähendab, et keeldutakse paketist ja antakse sellest ka paketi saatjale teada.
Ahelaid saab ka ise luua kasutades võtit -N. Aga selles juba edaspidi.
Ahela lõpetab ACCEPT, DROP, REJECT või RETURN. Lisaks on igal ahelal oma vaikimis poliitika. Kõigil kolmel põhiahelal (INPUT, FORWARD JA OUTPUT) on selleks ACCEPT.
Vaikepoliitikate seadistamine ahelatele.
# iptables -P INPUT ACCEPT # iptables -P OUTPUT ACCEPT # iptables -P FORWARD DROP
Kõik reeglid ahelast saab kustutada käsuga
# iptables --flush OUTPUT
Paneme nüüd ahelad, tabelid ja reeglid kokku
Mõned filtreerimise reeglid
Loome näiteks mõned filtreeirmise reeglid kasutades FILTER vaiketabelit ning ahelaid INPUT ja OUTPUT
Selleks, et masina sees olevad programmid saaksid internetti kasutada lubame pakettidel väljuda läbi OUTPUT ahela
# iptables -A OUTPUT -j ACCEPT
Selleks, et välismaailmast pääseksid kliendid ligi meie veebiserverile lubame 80nenda pordi kaudu INPUT ahelast pakettidel siseneda
# iptables -A INPUT -p tcp --dport 80 -j ACCEPT
Lisaks lubame välismaailmast serverit pingida
iptables -A INPUT -p icmp -m icmp --icmp-type 8 -j ACCEPT
Keelustame aga samas näiteks kõikidele ülejäänud portidele sissetulevad paketid
# iptables -A INPUT -j DROP
Veel paranoilisem logida kõik muud paketid ning seejärel need keelustada.
# iptables -A INPUT -j LOG --log-level 4 # iptables -A INPUT -j DROP
Ja põhimõtteliselt ongi meil masinale seadistatud primitiivne tulemüür mis lubab väljapoole ühendusi teha. Sisse lubab aga ainult ühendusi 80nendale pordile ning masinat pingida. Kõik muud ühendused logitakse ja keelatakse ilma paketi saatjat sellest teavitamata.
Pordiedastus
Suuname serveri välise pordi edasi sisevõrgul olevale masinale IP aadressiga 192.168.2.20
# iptables -A PREROUTING -p tcp --dport 80 -j DNAT --to-destination 192.168.2.20
Uute ahelate loomine ja reeglitega sidumine
Võimalik on luua ka täiesti uusi ahelaid ning siduda neid omakorda erinevate tabelitega. Kui tabel pole määratud kasutatakse automaatselt FILTER tabelit.
Näide1 Loome ahela nimega LOGDROP
# iptables -N LOGDROP
Lisame sinna ahelasse, et sealsed paketid logitakse
# iptables -A LOGDROP -j LOG
Ning seejärel kustutatakse
# iptables -A LOGDROP -j DROP
Edaspidi saame nüüd hoida ruumi kokku ning igalepoole ahelatele kahe LOG ja DROP reegli kirjutamise asemel võime suunata nad ümber meie loodud ahelale. Näiteks:
# iptables -I FORWARD -d 192.168.1.6 -p tcp --dport 21 -j LOGDROP
Näide 2. Loome ahela nimega blacklist kus olevad aadressid armutult blokeeritakse
# iptables -N blacklist
Lisame sinna tabelisse kaks aadresside vahemikku
# iptables -A blacklist -s 207.46.130.0/24 -j DROP # iptables -A blacklist -s 207.46.250.0/24 -j DROP
Seejärel blokeerime meie loodud ahela kõigis kolmes põhiahelas. Ehk siis keelame nii siseneva kui väljuva ja võrgukaartide vahel ruuditava liikluse neile võrkudele.
# iptables -A INPUT -j blacklist # iptables -A OUTPUT -j blacklist # iptables -A FORWARD -j blacklist
PS: tabelite/nimekirjade kasutamine ei ole iptablesis väga kergelt lahendatud Igast nimekirjast eraldi ahelate tegemine muudab iptablesi aeglaseks
Vajades suuri tabeleid on lahenduseks IPSet nimekirjad, mis tuleb eraldi paigaldada.
Network adress translation kasutades NAT tabelit
Lubame kerneline IP'de edastamise võrguseadmete vahel.
# echo "1" > /proc/sys/net/ipv4/ip_forward
Laadime NAT'i mooduli
# modprobe iptable_nat
Saatja aadress muudetakse tulemüüri omaks. Näiteks kasutame seda, et ühendada LAN internetiga:
# iptables -t nat -A POSTROUTING -o eth1 -j MASQUERADE
Võtmed tähendavad siin järgnevat:
- -t nat - Valime tabeli nat.
- -A - POSTROUTING Kasutame postrouting ahelat
- -o - eth1 reegel kehtib pakettidele mis väljuvad teiselt interfacelt (-o tähendab output)
- -j - MASQUERADE Saatja aadress asendatakse ruuteri aadressiga.
Juhul kui ruuter omab staatilist IP aadress on soovitatud ülaloleva näite kasutada source NAT'i. Selleks tuleb kirjutada järgnev käsk:
# iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to <eth0-ehk välise võrguseadme aadress>
Tarpit
you will need to enable the TARPIT option and rebuild the kernel. The new options will be found under "Networking Options -> IP: Netfilter Configuration". You will need to enable the "Packet Filtering" option to see the TARPIT option. Once you've successfully enabled the TARPIT module, rebuild the kernel and modules, and reboot if necessary.
To tarpit connections to TCP port 80 destined for the current machine:
iptables -A INPUT -p tcp -m tcp --dport 80 -j TARPIT
To significantly slow down Code Red/Nimda-style scans of unused address space, forward unused ip addresses to a Linux box not acting as a router (e.g. "ip route 10.0.0.0 255.0.0.0 ip.of.linux.box" on a Cisco), enable IP forwarding on the Linux box, and add:
iptables -A FORWARD -p tcp -j TARPIT iptables -A FORWARD -j DROP
You probably don't want the conntrack module loaded while you are using TARPIT, or you will be using resources per connection.
l7 filter
Paigaldame paketid. Gentoos käib see järgnevalt:
# emerge -av l7-protocols l7-filter
Ehitame kernelisse layer7 kontrolli mooduli
Networking Networking support (NET [=y]) Networking options Network packet filtering framework (Netfilter) Core Netfilter Configuration {*} Netfilter Xtables support (required for ip_tables) [M] "layer7" match support
Kasutamine
iptables -t filter -A INPUT -m layer7 --l7proto edonkey -j ACCEPT iptables -t filter -A OUTPUT -m layer7 --l7proto edonkey -j ACCEPT
Connection tracking helpers
http://www.faqs.org/docs/iptables/complexprotocols.html
Next type the following command to load two iptables modules:
# modprobe ip_conntrack # modprobe ip_conntrack_ftp
sip-conntrack-nat
Once you've recompiled the kernel, make sure you load the modules.
# modprobe ip_conntrack_sip ip_nat_sip
Vaatame laetud mooduleid
# lsmod | grep ip_nat_sip ip_nat_sip 4288 0 ip_conntrack_sip 6544 1 ip_nat_sip iptable_nat 20444 1 ip_nat_sip ip_conntrack 38808 3 ip_nat_sip,ip_conntrack_sip,iptable_nat
Netfilter will take care of the conntracking and NAT of SIP packets now, but don't forget the iptables rules. Examples as follows:
Set iptables rules to allow UDP packets on port 5060:
# iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # iptables -A INPUT -p udp --dport 5060 -j ACCEPT
And NAT as follows:
iptables -A FORWARD -o eth0 -p udp --dport 5060 -j ACCEPT iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 200.68.89.15
Liikluse limiteerimiseks on Linuxis Token Bucket (TB)
TC Function Command tc qdisc Create a queuing discipline. tc filter Create a filter. tc class Create a class.
Olemasolevate reeglite nägemiseks
# tc -s qdisc ls dev eth0
Näiteks järgneva käsuga saame aeglustada liikluse kiiruse alla 200 ms peale
# tc qdisc add dev eth0 root netem delay 200ms
Selle käsu töötamist saame kergelt kontrollida ping käsu abil
Reegli kustutamiseks
# tc qdisc del dev eth0 root
HTB - Hierarchy Token Bucket
To control the use of the outbound bandwidth on a given link use HTB:
- rate - You can set the allowed bandwidth.
- ceil - You can set burst bandwidth allowed when buckets are present.
- prio - You can set priority for additional bandwidth. So classes with lower prios are offered the *bandwidth first. For example, you can give lower prio for DNS traffic and higher for HTTP downloads.
- iptables and tc: You need to use iptables and tc as follows to control outbound HTTP traffic.
Example: HTTP Outbound Traffic Shaping
Turn on queuing discipline, enter:
# /sbin/tc qdisc add dev eth1 root handle 1:0 htb default 10
Define a class with limitations i.e. set the allowed bandwidth to 512 Kilobytes and burst bandwidth to 640 Kilobytes for port 80:
# /sbin/tc class add dev eth1 parent 1:0 classid 1:10 htb rate 512kbps ceil 640kbps prio 0
Define a class with limitations i.e. set the allowed bandwidth to 512 Kilobytes and burst bandwidth to 640 Kilobytes for port 80:
# /sbin/tc class add dev eth1 parent 1:0 classid 1:10 htb rate 512kbps ceil 640kbps prio 0
Please note that port 80 is NOT defined anywhere in above class. You will use iptables mangle rule as follows:
# /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 10
# tc filter add dev eth1 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
Here is another example for port 80 and 22:
/sbin/tc qdisc add dev eth0 root handle 1: htb /sbin/tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbps /sbin/tc class add dev eth0 parent 1:1 classid 1:5 htb rate 512kbps ceil 640kbps prio 1 /sbin/tc class add dev eth0 parent 1:1 classid 1:6 htb rate 100kbps ceil 160kbps prio 0
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 5 fw flowid 1:5 /sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 6 fw flowid 1:6
/sbin/iptables -A OUTPUT -t mangle -p tcp --sport 80 -j MARK --set-mark 5 /sbin/iptables -A OUTPUT -t mangle -p tcp --sport 22 -j MARK --set-mark 6
Põnevat lisalugemist ehk lingid
- https://wiki.itcollege.ee/index.php/Iptables
- https://help.ubuntu.com/community/IptablesHowTo
- http://math.ut.ee/~mroos/turve/praks/iptables.html
- http://www.linode.com/wiki/index.php/Netfilter_IPTables_Mini_Howto
- http://www.dd-wrt.com/wiki/index.php/Iptables
- http://www.frozentux.net/iptables-tutorial/iptables-tutorial.html
- http://viki.pingviin.org/Tulem%C3%BC%C3%BCrimas_IPTABLES_abiga
- http://newartisans.com/2007/09/neat-tricks-with-iptables/
- http://aplawrence.com/Linux/iptables.html
- http://en.gentoo-wiki.com/wiki/Iptables
- http://www.kmyfirewall.org/kmf_doc/iptables-concept.html
- http://www.gege.org/iptables/
- http://support.imagestream.com/QOS_with_iptables_CLASSIFY.html
- http://samsclass.info/124/proj11/p5x-iptables-layer7.html
http://wiki.openwrt.org/doc/howto/tc http://www.amiryan.org/2009/02/16/traffic-shaping-under-linux-with-tc-and-iptables/ http://lartc.org/howto/lartc.cookbook.fullnat.intro.html
- http://www.cyberciti.biz/faq/how-do-i-block-an-ip-on-my-linux-server/ hea kiire õpetus hädasolijatele saatmiseks. Kuidas IP blokeerida Linuxis
http://www.thice.nl/creating-ack-get-packets-with-scapy/
http://www.cyberciti.biz/faq/linux-traffic-shaping-using-tc-to-control-http-traffic/ liikluse limiteerimine!