Kamil ’JP’ Dedecius
Vychytávky v iptables
Vychytávky v iptables 1 NAT NAT neboli Network Address Translation je technika vyvinutá především kvůli omezení velikosti IPv4 adresního prostoru. Jeho princip spočívá jednoduše řečeno v tom, že se určité (privátní) IP adresy „schovajíÿ za veřejnou adresou, pomocí které se pak počítače z naší sítě prokazují za jejími hranicemi. Nemalou výhodou NATování je vyšší bezpečnost zařízení za NATem. Rozlišujeme DNAT, SNAT a speciální případ SNATu – Masquerade. Pravidla pro NAT se na GNU/Linuxu dnes dělají pomocí iptables. Na ipmasqadm můžete v klidu zapomenout (stejně jste o něm nikdy neslyšeli ;o)). Samozřejmě, jak už je u iptables zvykem, musíte mít příslušnou podporu v jádře, ať už jako moduly nebo staticky zakompilovanou. Na následujícím obrázku můžeme vidět, jak procházejí pakety skrz jádro. Všimněme si zejména řetězců PREROUTING a POSTROUTING, neboť ty jsou pro nás teď nejpodstatnější.
Všimněme si také řetězce FORWARD – zde pakety také protékají, proto nezapomeňme na povolení forwardingu: echo 1 > /proc/sys/net/ipv4/ip_forward
Středisko UN*Xových technologií
1
Kamil ’JP’ Dedecius
Vychytávky v iptables
1.1 SNAT SNAT neboli Source NAT je technika při které se mění zdrojová (source) IP adresa. Máme-li např. PC s adresou 192.168.1.5 za routerem který dělá SNAT na adresu 147.32.105.30, pak přistupujeme-li do internetu, prokazujeme se právě adresu 147.32.105.30. Jinými slovy, když máte na SH pokoji 2 počítače, notebook, IP kameru, WiFi AP, lednici, žehličku a pračku s NIC, můžete1 všechna tato zařízení propojit do své privátní sítě, z jednoho PC udělat router, zaNATovat všechna ta zařízení za ním a router připojit k síti SH. Vaše lednice teď může vesele klábosit o svých zkažených potravinách na internetu a nikdo nepozná2 , že k síti není připojen pouze jeden počítač tak, jak je to dovoleno. Ale k věci. Důležitá informace pro sestavování pravidel je, že SNAT se provádí po routování. Samotné nastavení SNATu je jednoduché, uveďme si 3 příklady: Změna adresy na jednu konkrétní: # iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4 Změna adresy na jednu z rozsahu: # iptables -t nat -A POSTROUTING -o eth0 -j SNAT \ --to 1.2.3.4-1.2.3.9 Změna adresy a portu: # iptables -t nat -A POSTROUTING -p tcp -o eth0 -j SNAT \ --to 1.2.3.4:1-1023
1.1.1
Masquerade neboli maškaráda
Maškaráda je zvláštní a zároveň asi nejpoužívanější případ SNATu. Všechny stroje za NATem se schovávají za jedno jediné IPčko, které je přiřazeno routeru. Tento případ NATu budete potřebovat, pokud si budete chtít doma (načerno :o)) připojit do sítě providera více počítačů. Jeho hlavní výhoda je použití dynamicky přiřazené adresy, ovšem používá se i při pevně přidělené adrese. Nastavení maškarády je veskrze jednoduché: # iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE A můžete vesele brouzdat netem dokud na vás nepřijdou :o))
1.2 DNAT DNAT neboli Destination NAT je naopak technika, při níž se mění cílová (destination) adresa IP zařízení. Můžete tak realizovat port forwarding, transparentní proxování atd. Důležitá avšak jasná připomínka – DNAT se provádí před routováním. 1 2
Nemůžete ;o) Pokud ovšem nebude chtít. . .
Středisko UN*Xových technologií
2
Kamil ’JP’ Dedecius
Vychytávky v iptables
Opět několik příkladů DNATu: Změna cílové adresy na jinou: # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8 Změna cílové adresy na jinou ze zadaného rozsahu: # iptables -t nat -A PREROUTING -i eth0 -j DNAT --to 5.6.7.8-5.6.7.10 Přesměrování všeho co přijde na port 80 na jiný stroj na port 8080: # iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 \ -j DNAT --to 5.6.7.8:8080 Přesměrování (redirect) na transparentní proxy: # iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 \ -j REDIRECT --to-port 3128
1.3 Závěrem k NATu Ukázali jsme si jak nastavit NAT. Ještě než toto téma opustíme, zmíníme pár (ne)zajímavých detailů o způsobu fungování tohoto mechanizmu: NAT se snaží měnit konexe minimálním možným způsobem, pokud to jde, zachovává čísla portů. Porty jsou rozděleny do 3 tříd (do 512, 512 – 1023, 1024 a výše), přemapovávání portů (pokud na něj dojde) se provádí v rámci jedné třídy. Některé protokoly (např. ftp) se nemají s NATem rády, buď se s nimi musíte rozloučit nebo můžete použít některé patche do iptables. NAT tabulka je použita pouze pro první paket spojení, proto nemá cenu v PREROUTING a POSTROUTING řetězcích vymýšlet nějaká filtrovací pravidla. Na to je určen především řetězec FORWARD. Hlavní výhoda DNATu spočívá v tom, že můžeme schovat své servery a směrovat na ně pouze konkrétní povolené konexe.
Středisko UN*Xových technologií
3
Kamil ’JP’ Dedecius
Vychytávky v iptables
2 Podmíněné otvírání portů V této kapitole se budeme bavit o portknockingu. Portknocking je technika, při které se otevírají porty teprve po poslání správných paketů na správné porty. Realizovat portknocking je možné více metodami - použitím démonu knockd, iptables aj. My, protože se bavíme o iptables, si ukážeme realizaci pomocí tohoto nástroje. Úvodem je třeba zmínit, že „zaklepáníÿ na porty je nutné provést ve správném pořadí. Níže uvedený skript je možné ještě vylepšit např. požadavkem na konkrétní nastavený příznak u jednotlivých paketů (SYN, ACK, FIN. . .), jednak časovým limitem pro provedení celého portknockingu apod.
2.1 Nejdříve něco o ipt recent Základem všeho je iptablový modul ipt recent. Jeho manuálovou stránku najdete na konci této kapitoly, než postoupíte k samotnému skriptu si ji určitě přečtěte.
2.2 Hurá na věc Pokud už máte představu jak recent modul funguje, můžeme se směle pustit do sestavení pravidel. Následuje skript, který můžeme buď přímo použít, nebo si jej upravit k obrazu svému. Jeho fungování probereme na přednášce, nicméně nebojte se experimentovat ;o) HOST_IP="12.34.56.78" /sbin/iptables /sbin/iptables /sbin/iptables /sbin/iptables
-N -A -A -A
INTO-PHASE2 INTO-PHASE2 -m recent --name PHASE1 --remove INTO-PHASE2 -m recent --name PHASE2 --set INTO-PHASE2 -j LOG --log-prefix "INTO PHASE2: "
/sbin/iptables /sbin/iptables /sbin/iptables /sbin/iptables
-N -A -A -A
INTO-PHASE3 INTO-PHASE3 -m recent --name PHASE2 --remove INTO-PHASE3 -m recent --name PHASE3 --set INTO-PHASE3 -j LOG --log-prefix "INTO PHASE3: "
/sbin/iptables -A INPUT -m recent --update --name PHASE1 /sbin/iptables -A INPUT -p tcp --set --name PHASE1 /sbin/iptables -A INPUT -p tcp --rcheck --name PHASE1 -j /sbin/iptables -A INPUT -p tcp --rcheck --name PHASE2 -j
--dport 100 -m recent \ --dport 200 -m recent \ INTO-PHASE2 --dport 300 -m recent \ INTO-PHASE3
/sbin/iptables -A INPUT -p tcp -s HOST_IP --dport 22 -m recent \ --rcheck --seconds 5 --name PHASE3 -j ACCEPT A jak port otevřít? Potřebujeme poslat pár paketů na konkrétní porty, což můžeme udělat např. pomocí netcatu, telnetu apod. Středisko UN*Xových technologií
4
Kamil ’JP’ Dedecius
Vychytávky v iptables
2.3 Manuálová stránka modulu recent ipt_recent Allows you to dynamically create a list of IP addresses and then match against that list in a few different ways. For example, you can create a ‘badguy’ list out of people attempting to connect to port 139 on your firewall and then DROP all future packets from them without considering them. --name name Specify the list to use for the commands. If no name is given then ’DEFAULT’ will be used. [!] --set This will add the source address of the packet to the list. If the source address is already in the list, this will update the existing entry. This will always return success (or failure if ‘!’ is passed in). [!] --rcheck Check if the source address of the packet is currently in the list. [!] --update Like --rcheck, except it will update the "last seen" timestamp if it matches. [!] --remove Check if the source address of the packet is currently in the list and if so that address will be removed from the list and the rule will return true. If the address is not found, false is returned. [!] --seconds seconds This option must be used in conjunction with one of --rcheck or --update. When used, this will narrow the match to only happen when the address is in the list and was seen within the last given number of seconds. [!] --hitcount hits This option must be used in conjunction with one of --rcheck or --update. When used, this will narrow the match to only happen when the address is in the list and packets had been received greater than or equal to the given value. This option may be used along with --seconds to create an even narrower match requiring a certain number of hits within a specific time frame. --rttl This option must be used in conjunction with one of --rcheck or --update. Středisko UN*Xových technologií
5
Kamil ’JP’ Dedecius
Vychytávky v iptables
When used, this will narrow the match to only happen when the address is in the list and the TTL of the current packet matches that of the packet which hit the --set rule. This may be useful if you have problems with people faking their source address in order to DoS you via this module by disallowing others access to your site by sending bogus packets to you. Examples: # iptables -A FORWARD -m recent --name badguy --rcheck --seconds 60 -j DROP # iptables -A FORWARD -p tcp -i eth0 --dport 139 -m recent --name badguy \ --set -j DROP Official website (http://snowman.net/projects/ipt_recent/) also has some examples of usage. /proc/net/ipt_recent/* are the current lists of addresses and information about each entry of each list. Each file in /proc/net/ipt_recent/ can be read from to see the current list or written two using the following commands to modify the list: echo xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT to Add to the DEFAULT list echo -xx.xx.xx.xx > /proc/net/ipt_recent/DEFAULT to Remove from the DEFAULT list echo clear > /proc/net/ipt_recent/DEFAULT to empty the DEFAULT list. The module itself accepts parameters, defaults shown: ip_list_tot=100 Number of addresses remembered per table ip_pkt_list_tot=20 Number of packets per address remembered ip_list_hash_size=0 Hash table size. 0 means to calculate it based on ip_list_tot, default: 512 ip_list_perms=0644 Permissions for /proc/net/ipt_recent/* files debug=0 Set to 1 to get lots of debugging info
Středisko UN*Xových technologií
6
Kamil ’JP’ Dedecius
Vychytávky v iptables
3 Závěr Sestavit pravidla pro jednoduchý NAT by nyní neměl být problém. Nicméně zkuste se např. zamyslet nad problematikou dvojitého NATu, určitě vám to trochu potrápí mozkové závity. Seznámili jsme se také s realizací portknockingu pomocí iptables, pokud jej budete někde zkoušet, zkuste trochu experimentovat. Také se zamyslete, jak portknocking udělat co nejbezpečnější, aby vám schovávaný port neotevřel např. portscan, nebo proč hrozí nebezpečí že člověk u něhož je router k vaší lince vám ten port dokáže otevřít.
4 Literatura Více se o probraných tématech dozvíte v následující literatuře3 : http://laurel.datsi.fi.upm.es/cgi-bin/man/man2html?iptables+8 manuálové stránky zmíněných programů NAT howto Netfilter Double NAT HOWTO http://iptables-tutorial.frozentux.net/ (Russelův iptables tutoriál, nejkvalitnější čtení o iptables)
5 O tomto dokumentu Tento dokument byl vysázen v systému LATEX. Autor se omlouvá za nedokonalou sazbu a problémy s některými fonty, ovšem již nezbývá čas zabývat se kompatibilitou s Acrobat Readerem. Věcné chyby reportujte na
[email protected] nebo na webových stránkách projektu SUT http://sut.sh.cvut.cz. Tento dokument byl připraven jako pomůcka k přednášce Vychytávky v iptables. Můžete jej volně šířit.
3
Není citována podle normy, ale za to mě snad popotahovat nebudete :o))
Středisko UN*Xových technologií
7