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í)ipadresy schovají zaveřejnouadresou,pomocíkterésepakpočítačeznaší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
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 snic,můžete 1 všechnatatozařízenípropojitdosvéprivátnísítě,zjednohopcudělat router,zanatovatvšechnatazařízenízanímarouterpřipojitksítish.vašeledniceteď můževeseleklábositosvýchzkaženýchpotravináchnainternetuanikdonepozná 2,žeksí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 Nemůžete;o) 2 Pokudovšemnebudechtít... Středisko UN*Xových technologií 2
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šehocopřijdenaport80najinýstrojnaport8080: # 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ů. Portyjsourozdělenydo3tříd(do512,512 1023,1024avýše),přemapováváníportů (pokudnanějdojde)seprovádívrámcijednétřídy. Některéprotokoly(např.ftp)senemajísNATemrády,buďsesnimimusíterozlouč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 PREROU- TING a POSTROUTING řetězcích vymýšlet nějaká filtrovací pravidla. Na to je určen především řetězec FORWARD. HlavnívýhodaDNATuspočívávtom,žemůžemeschovatsvéserveryasměrovatnaně pouze konkrétní povolené konexe. Středisko UN*Xových technologií 3
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í naportyjenutnéprovéstvesprávnémpořadí.nížeuvedenýskriptjemož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-n INTO-PHASE2 /sbin/iptables-a INTO-PHASE2-m recent --name PHASE1 --remove /sbin/iptables-a INTO-PHASE2-m recent --name PHASE2 --set /sbin/iptables-a INTO-PHASE2-j LOG --log-prefix"into PHASE2:" /sbin/iptables-n INTO-PHASE3 /sbin/iptables-a INTO-PHASE3-m recent --name PHASE2 --remove /sbin/iptables-a INTO-PHASE3-m recent --name PHASE3 --set /sbin/iptables-a INTO-PHASE3-j LOG --log-prefix"into PHASE3:" /sbin/iptables-a INPUT -m recent --update--name PHASE1 /sbin/iptables-a INPUT -p tcp --dport 100 -m recent \ --set --name PHASE1 /sbin/iptables-a INPUT -p tcp --dport 200 -m recent \ --rcheck--name PHASE1 -j INTO-PHASE2 /sbin/iptables-a INPUT -p tcp --dport 300 -m recent \ --rcheck--name PHASE2 -j 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
2.3 Manuálová stránka modulu recent ipt_recent Allows you to dynamicallycreate a list of IP addresses and then match against that list in a few differentways. For example,you can create a badguy list out of people attemptingto 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 currentlyin 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 currentlyin the list and if so that address will be removedfrom the list and the rule will return true. If the addressis not found, false is returned. [!] --secondsseconds 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. [!] --hitcounthits 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 packetshad been received greaterthan or equal to the given value. This option may be used along with --secondsto 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
When used, this will narrow the match to only happen when the address is in the list and the TTL of the currentpacket matches that of the packet which hit the --set rule. This may be useful if you have problems with people faking their source addressin 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
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ěkuněhožjerouterkvašílincevámtenportdokážeotevřít. 4 Literatura Víceseoprobranýchtématechdozvítevnásledujícíliteratuře 3 : 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í oiptables) 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 k.dedecius@sh.cvut.cz 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ánapodlenormy,alezatoměsnadpopotahovatnebudete:o)) Středisko UN*Xových technologií 7