Debian Squeeze Tűzfal iptables
A rendszergazdákat rémálmaikban sokszor kísérti az a gondolat, hogy miért is ilyen bonyolult ez az iptables? Annyira nem bonyolult, csak nem érthető meg pár nap alatt. |
|
Az iptables debian-ban alapból fel van telepítve és alapértelmezetten fut is, így nem nagyon kell vele törődni. Ha mégse hisszük el, akkor az iptables -L paranccsal látni fogunk pár sort, de hogy miket? Az iptables-ban táblák vannak amikben különböző láncok mentén definiálhatunk szabályokat. Ezekre a szabályokra illeszkedő adatcsomagokkal pedig az fog történni amit szeretnénk. A következő táblák léteznek: raw,mangle,nat,filter. - raw tábla: PREROUTING és OUTPUT láncot tartalmaz és megjelölhetjük benne azokat a csomagokat, amelyekre nem kérünk kapcsolatkövetést. Ettől többet viszont nem tudok erről írni, nem volt rá még szükség semmilyen formában. - mangle tábla: PREROUTING, INPUT, FORWARD, OUTPUT, POSTROUTING láncot tartalmat és csomag módosításokat lehet végezni vele. Csomagok megjelölésére is lehet használni. Az internet vonal kiválasztásához fogjuk használni. -nat tábla: PREROUTING, OUTPUT és POSTROUTING láncokat tartalmaz és hálózati címfordítást lehet végezni vele. Jól lehet vele irányítani, hogy milyen hálókártyáról vagy ip tartományról hova mennyen az információ. -filter tábla: INPUT, OUTPUT és FORWARD láncokat tartalmaz és szűrésre lehet használni. Itt fogjuk meg mondani azt, hogy melyik csomag dobjuk el vagy nem engedjük tovább vagy pont mi az amit engedünk tovább menni. -PREROUTING: előfeldolgozás, mielőtt a csomagok beérkeznének, akkor előtte szabályozza őket. -INPUT: amikor beérkeznek a csomagokat szabályozza. -FORWARD: az átmenő forgalmat szabályozza, amik elkerülik a programokat szolgáltatásokat a szerveren. -OUTPUT: a kimenő csomagokat szabályozza. -POSTROUTING: mielőtt elhagynák a rendszert még legutoljára érvényesülő szabályok. A végrehajtási sorrend egy kicsit összetett. A következő képen látott ábra alapján haladnak az adatcsomagok: iptables Amikor beérkezik az adatcsomag a gépünkre, akkor először a PREROUTING láncokba fog beleütközni a különböző táblákon át(raw,mangle,nat) majd az INPUT láncokban a filter táblában megszűrjük az adatcsomagokat és bejutnak a szerverre a szolgáltatásokhoz. Ezután kifelé az OUTPUT láncokon indul el, majd a POSTROUTING szabályokkal még egy kicsit befolyásolhatjuk őket mielőtt elhagynák a rendszert. Persze lehet a PREROUTING - FORWARD - POSTROUTING irányba is terelni a csomagokat. Visszatérve az elejére az iptables -L parancs kimenetén a filter táblát látjuk benne az INPUT, OUTPUT és FORWARD láncokkal és hogy tök üres, ha most telepítettük a szerverünket. Ugyanezen a módon megnézhetjük a többi tábla tartalmát is: iptables -t nat -L iptables -t mangle -L A tűzfalnak elkell indulnia még akkor amikor a hálókártyák nem éledtek fel. Erre a legjobb megoldás az /etc/networking mappában található if-pre-up.d mappába tenni a tűzfal scriptünket. Ez már boot közben a hálókártyák éledése előtt elindul és így már védettek leszünk, mielőtt a hálózatról bármiféle támadás áldozatai lennénk. Az elméleti bevezető után csapjunk a közepébe! Csinálunk egy fájlt és írjunk bele szabályokat. Kezdjük a fájlunkat azzal, hogy definiálunk változókat a könnyebb kezelhetőség érdekében: #!/bin/sh export term=linux # Konfiguricio # Programok ECHO="/bin/echo" IPTABLES="/sbin/iptables" [ -x $ECHO ] || exit 5 [ -x $IPTABLES ] || exit 5 Változókat definiáljunk a hálókártyáinkhoz és ip tartományainkhoz, hogy könnyebben boldoguljunk: $ECHO "####################" $ECHO "Konfiguralas..." # Kartyak IF_LO="lo" # Visszacsatolo interface #IF_INTERNET="ppp0" # ADSL -es internet esetén IF_INTERNET="eth0" # dinamikus dhcp-s internet vonal IF_HALO1="eth1" # az egyik hálózati kártyánk amire a kliensek vannak kötve IF_HALO2="eth2" # a másik hálózati kártyánk amire a kliensek vannak kötve # IP cim tartomanyok NET_ALL="0.0.0.0/0" # Minden cim NET_BELSO="10.0.0.0/16" # belso hálózat NET_BELSO2="10.1.0.0/16" # belso hálózat2 # Egyedi cimek #IP_KULSO="197.218.200.101/32" # kulso fix ip -je az internetnek IP_SZERVER2="10.0.0.2/32" # szerver2 egy másik szerver a hálózatban IP_GAZDASAGI="10.0.12.0/24" # Gazdasagi iroda Egy jó tűzfal úgy kezdődik, hogy nem eresztünk be semmit se. Kifele, hogy ki mit ereszt ez már egy másik történet. A paranoiásabbak kifele is szűrhetnek, de mi megbízunk a felhasználóinkban, hogy nem csinálnak bajt(lehet nem kellene, de majd, akkor bekeményítünk). Csak azokat a láncokat és táblákat érdemes törölni amiket használunk, a többi úgyis üres. -F minden szabályt töröl a láncokból, -X minden láncot töröl, -Z csomagszámláló értékeit törli. # Meglevo szabalyok torlese $ECHO "Tuzfal inicializalasa..." $IPTABLES -F $IPTABLES -F -t nat $IPTABLES -F PREROUTING -t nat $IPTABLES -F POSTROUTING -t nat $IPTABLES -X $IPTABLES -X -t nat $IPTABLES -Z $IPTABLES -Z -t nat $IPTABLES -F -t mangle $IPTABLES -F PREROUTING -t mangle $IPTABLES -X -t mangle $IPTABLES -Z -t mangle Hozzuk létre a láncokat. Alapértelmezetten mi csak a bejövőeket nem engedjük tovább, amúgy minden mást igen. # Alapszabalyok letrehozasa $ECHO "Alapertelmezett szabalyok letrehozasa..." $IPTABLES -P INPUT DROP $IPTABLES -A INPUT -i $IF_LO -j ACCEPT $IPTABLES -P FORWARD ACCEPT $IPTABLES -P OUTPUT ACCEPT $IPTABLES -t nat -P POSTROUTING ACCEPT $IPTABLES -t nat -P PREROUTING ACCEPT Építsünk ki egy kis védelmet a dos támadások ellen. Ezek azon alapulnak, hogyha túl sok csomag jön adott időn belül, akkor nem engedünk be többet. A filter tábla input láncain fogjuk szűrni őket. # Vedelmek $ECHO "Vedelmek aktivalasa..." $IPTABLES -A INPUT -m state --state INVALID -j DROP $IPTABLES -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT # Kapcsolat csak SYN bittel kezdodhet $ECHO "> Kapcsolat csak SYN bittel kezdodhet" $IPTABLES -A INPUT -p tcp ! --syn -m state --state NEW -j DROP # X-MAS csomag $ECHO "> X-MAS csomag" $IPTABLES -A INPUT -p tcp --tcp-flags ALL ALL -j DROP # NULL csomag $ECHO "> NULL csomag" $IPTABLES -A INPUT -p tcp --tcp-flags ALL NONE -j DROP # Syn flood DOS tamadas $ECHO "> Syn flood DOS tamadas" $IPTABLES -N input_syn_flood $IPTABLES -A input_syn_flood -m limit --limit 24/second --limit-burst 48 -j RETURN $IPTABLES -A input_syn_flood -m limit -j LOG --log-prefix "TCP DOS tamadas?: " --log-level info $IPTABLES -A input_syn_flood -j DROP $IPTABLES -A INPUT -p tcp --syn -j input_syn_floodinfo # UDP DOS tamadas $ECHO "> UDP DOS tamadas" $IPTABLES -N input_udp_flood $IPTABLES -A input_udp_flood -m limit --limit 50/second --limit-burst 100 -j RETURN $IPTABLES -A input_udp_flood -m limit -j LOG --log-prefix "UDP DOS tamadas?: " --log-level info $IPTABLES -A input_udp_flood -j DROP $IPTABLES -A INPUT -p udp -j input_udp_flood # ICMP DOS tamadas $ECHO "> ICMP DOS tamadas" $IPTABLES -N input_icmp_flood $IPTABLES -A input_icmp_flood -m limit --limit 10/second --limit-burst 15 -j RETURN $IPTABLES -A input_icmp_flood -m limit -j LOG --log-prefix "ICMP DOS tamadas?: " --log-level info $IPTABLES -A input_icmp_flood -j DROP $IPTABLES -A INPUT -p icmp -j input_icmp_flood # SMTP korlatozas $ECHO "> SMTP korlatozas" $IPTABLES -N pre_smtp $IPTABLES -A pre_smtp -m limit --limit 50/minute -j RETURN $IPTABLES -A pre_smtp -j DROP $IPTABLES -A INPUT -i $IF_INTERNET -d $IP_KULSO -p tcp --dport smtp --syn -j pre_smtp $IPTABLES -A INPUT -i $SZERVER2 -p tcp --dport smtp --syn -j pre_smtp A szolgáltatók kevésbé szeretnék, hogy feléjük dhcp szervert üzemeltessünk, mert egy kicsit összeakadhatnak náluk a dolguk. Persze alapból mindenki figyel az ilyesmire, de sose lehet tudni a tűzfalban azért tiltsuk az internet felé a dhcp szolgáltatás lehetőségét. Viszont magunknak engedélyezzük, mindenhol a hálózatban. # DHCP tiltsa internet fele $ECHO "DHCP tiltasa nem kivant zonakban..." $IPTABLES -A INPUT -i $IF_INTERNET -p udp -s $NET_ALL --dport 67:68 -j DROP $IPTABLES -A INPUT -p udp -s $NET_ALL --dport 67:68 -j ACCEPT Engedélyezzünk pár portot amilyen szolgáltatásokat szeretnénk nyújtani a szerverünkkel. # Mindenhonnan elerheto $ECHO "Mindenkinek elerheto portok engedelyezese..." $IPTABLES -A INPUT -p icmp -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport ftp-data -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport ftp -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport ssh -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport ssh -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport smtp -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport ssmtp -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport pop3s -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport pop3s -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport imaps -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport imaps -j ACCEPT Blokkoljuk az internet felől jövő kéréseket. # Internet felol jovo keresek $ECHO "Internet felol jovo adat blokkolosa..." $IPTABLES -A INPUT -i $IF_INTERNET -j DROP Majd hagyjunk a belső hálózatban portokat használni. # Belso halo $ECHO "Belso halozati portok engedelyezese..." $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport domain -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport domain -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport 137:139 -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport 137:139 -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport 445 -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport 445 -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport pop3 -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport pop3 -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport imap -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport imap -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport 3128 -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport 3128 -j ACCEPT $IPTABLES -A INPUT -p tcp -s $NET_ALL --dport 8080 -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport 8080 -j ACCEPT Ha van több szerverünk engedélyezzük, hogy elérhetőek legyünk számukra. # Szerverekrol elerheto portok engedelyezese $ECHO "Szerverekrol elerheto portok engedelyezese..." $IPTABLES -A INPUT -s $SZERVER2 -j ACCEPT Nálunk van itt egy kis trükk, hogy a webszerverünk a SZERVER2-n fut és még azzal van megcsavarva, hogy a belső weboldal fut a 80-as porton a külső pedig a 81-esen. Ennek az is az előnye, hogy a nem kedves emberek nem találnak a 80-ason semmit se kívülről :) Az az ip cím, a külső publikus netvonalunk ip-jét jelenti. # Routolas $ECHO "Routolas..." # WebSzerver (intranet miatt kivulrol 81-re teszi) $ECHO "> www -> 10.0.0.2" $IPTABLES -t nat -A PREROUTING -p tcp -d $IP_INTERNET --dport www -j DNAT --to 10.0.0.2:81 $IPTABLES -t nat -A PREROUTING -p tcp -d $IP_INTERNET --dport 81 -j DNAT --to 10.0.0.2:81 $IPTABLES -t nat -A PREROUTING -p tcp -d $IP_INTERNET --dport www -j ACCEPT $IPTABLES -t nat -A POSTROUTING -p tcp -d $IP_FIREWALL --dport www -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -p tcp -d $IP_FIREWALL --dport 81 -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -p tcp -s $IP_FIREWALL -d $NET_BELSO --sport www -j ACCEPT $IPTABLES -t nat -A POSTROUTING -p tcp -s $IP_FIREWALL --sport 81 -j SNAT --to 197.218.200.101:81 Nekünk van egy rendszergazdai alhálózatunk, ahol mindent engedélyezünk, mert ugye nekünk mindent szabad :) # Rendszergazdai halozat $ECHO "> Rendszergazda halozat" $IPTABLES -t nat -A PREROUTING -s 10.0.130.0/16 -j ACCEPT $IPTABLES -t nat -A POSTROUTING -s 10.0.130.0/16 -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -s 10.0.130.0/16 -j ACCEPT Eresszük tovább a https-t is, hogy mennyen a facebook rendesen :) # HTTPS $ECHO "> HTTPS" $IPTABLES -t nat -A PREROUTING -p tcp --dport https -j ACCEPT $IPTABLES -t nat -A PREROUTING -p udp --dport https -j ACCEPT $IPTABLES -t nat -A POSTROUTING -p tcp --dport https -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -p tcp --dport https -j ACCEPT $IPTABLES -t nat -A POSTROUTING -p udp --dport https -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -p udp --dport https -j ACCEPT Azért, hogy a szerverünk hálózatai/hálókártyái eltudják érni a SZERVER2-t írjuk be az alábbi sorokat. # Szerver halozat $ECHO "> Szerver halozat" $IPTABLES -t nat -A POSTROUTING -s $SZERVER2 -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -s $BELSO1 -d $SZERVER2 -j MASQUERADE $IPTABLES -t nat -A POSTROUTING -s $BELSO2 -d $SZERVER2 -j MASQUERADE Olykor előfordul, hogy szükség van arra, hogy valami netes programnak egyedi portja van és nem hajlandó kommunikálni, akkor így tudjuk engedélyezni neki: # egyedi program $ECHO "> Egyedi program" $IPTABLES -t nat -A POSTROUTING -p tcp -s $IP_GAZDASAGI -d 149.49.136.18/32 --dport 2362 -j MASQUERADE A proxy miatt irányítsuk át a netforgalmunkat a 80-asról a 3128-as portra, hogy a proxy-n keresztül fusson és cachelődhessen a netünk és fejezzük be a scriptet. # Transparent Proxy $ECHO "> Transparent Proxy" $IPTABLES -t nat -A PREROUTING -i $IF_HALO1 -p tcp --dport 80 -j REDIRECT --to-port 3128 $IPTABLES -t nat -A PREROUTING -i $IF_HALO2 -p tcp --dport 80 -j REDIRECT --to-port 3128 # Kesz $ECHO "Kesz." exit 0 Egyéb információk: -A-val a lánc végéhez fűzünk hozzá egy új szabályt. -D-vel pedig törölni lehet. Törölni úgy tudunk, hogy kiadjuk még egyszer ugyanazt a parancsot. pl: $IPTABLES -D INPUT -p udp -s $NET_ALL --dport 445 -j ACCEPT $IPTABLES -A INPUT -p udp -s $NET_ALL --dport 445 -j ACCEPT Legfontosabb oldal, hogy melyik szolgáltatás milyen portokat használ erre mindig szükség van: TCP és UDP portszámok listája Régen lehetett nat táblában is DROP-ot alkalmazni, de manapság már nem lehet, mert ugye csomagszűrésre a filter tábla való, ha mégis megpróbáljuk csúnya figyelmeztetést kapunk. Régebben debian-ban az rc.boot mappából is lehetett indítani a tűzfalat, de ez se megy már. Lehetne ide még rengeteget írni az iptables-ről és lehetne sokkal jobb tűzfalat is csinálni biztosan, de egyelőre nekünk ez megfelelt a céljainknak. Viszont akármennyit olvasgattunk, hogy ki hogyan oldotta meg a tűzfalát mindenki más eredményre jut. Két egyforma tűzfalat se találni, nem is létezik igazi megoldás mindenre, így mindenkinek magának kell összeállítania a számára megfelelőt. olvasnivalók: netfilter.org Csomagszűrés Tűzfalak iptables Linux Firewalls Using iptables Iptables Firewall |
2013.02.24. |
Figyelem! Az itt olvasható leírások, nem teljesek és nem biztos, hogy pontosak. Nem
frissülnek folyamatosan, ezért nem mindegyik használható az aktuális verziójú rendszerekben. Mindenki saját
felelősségére használja az itt található ötleteket. Az esetleges károkért nem vállalunk felelősséget.