iptables

sziasztok.
a fórumon rengeteg iptables kérdés van, de mégsem tudok zöldágra vergődni. csak félig.
a problémám:
Az ubuntu.hu -n olvasott dokumentációt átolvasva ( http://ubuntu.hu/konyvlap/alap-tuzfal-otthoni-pc-re-iptables ), létrehoztam egy iptables scriptet.
a script működik (legalábbis a scriptet lefuttatva a változások megtörténnek), viszont p2p alkalmazásokat sehogyan sem tudok kommunikációra bírni.
p2p alkalmazások nálam = linuxdcpp és deluge torrent.
a használt portokat megadtam a scriptben (linuxdcpp esetén udp-t is, sőt később már mindkét esetben adtam tcp-t és udp-t is az input és output láncon is).
mégsem akar működni, az eredmény mindkét alkalmazás esetén connection timeout.

fontosabb információk:
a gép router mögött van (sajnos arra nem tér ki a leírás, hogy ezt hogyan kell definiálni a scriptben, talán ez a probléma? persze a neten sok script kering, de nem akartam többől összeollózni), a routeren a portforwardok rendesen be vannak állítva, a szükséges portok a megfelelő ip-kre vannak irányítva. régóta működik.
a gépben 2 hálókártya van, egy alaplapi és egy pci. a pci-t használom, de az alaplapi sincs letiltva. pci = eth0, alaplapi = eth1
a router ip címe: 192.168.0.1 (ez a gw) adsl nettel;
a gépem ip címe: 192.168.0.2 (fixen beállítva)

a jelenlegi, elkeseredett utolsó próbálkozásom eredménye (így sem működik sem a torrent sem a dc, de ezeken kívül minden megy, levelezés, böngészés, stb):

#!/bin/bash

IFACE_INT=eth0

# ip tovabbitas bekapcsolasa
echo "1" > /proc/sys/net/ipv4/ip_forward

# modulok betoltese
modprobe ip_conntrack_ftp

iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# INPUT lanc
iptables -A INPUT -i eth0
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP
iptables -A INPUT -i eth0 -p tcp --dport 42 -m limit --limit 3/m -j LOG --log-prefix "SSH_ACCEPT: "
iptables -A INPUT -i eth0 -p tcp --dport 42 -m limit --limit 3/m -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --dport 5000,6464,6881 -j ACCEPT # ldcpp, aquila, deluge

iptables -A INPUT -i eth0 -p udp --dport 5000 -j ACCEPT # ldcpp
iptables -A INPUT -i eth0 -p udp --dport 6464 -j ACCEPT # aquila
iptables -A INPUT -i eth0 -p udp --dport 6881 -j ACCEPT # deluge
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 3/m --limit-burst 1 -j ACCEPT
iptables -A INPUT -j LOG --log-prefix "INPUT_DROP: "
iptables -A INPUT -j DROP

# OUTPUT lanc
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp -m multiport --dport 20,21,22 -j ACCEPT # ftp, ssh
iptables -A OUTPUT -p tcp -m multiport --dport 25,110,443,465,993,995 -j ACCEPT # levelezes
iptables -A OUTPUT -p tcp -m multiport --dport 80,143 -j ACCEPT # web
iptables -A OUTPUT -p tcp -m multiport --dport 1863,6667 # msn, irc
iptables -A OUTPUT -p tcp -m multiport --dport 5000,6464,6881 -j ACCEPT # ldcpp, aquila, deluge

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # dns
iptables -A OUTPUT -p udp --dport 5000 -j ACCEPT # ldcpp
iptables -A OUTPUT -p udp --dport 6464 -j ACCEPT # aquila
iptables -A OUTPUT -p udp --dport 6881 -j ACCEPT # deluge
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT_DROP: "
iptables -A OUTPUT -j DROP

# FORWARD lanc
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p tcp ! --syn -m state --state NEW -j DROP
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 3/m --limit-burst 1 -j ACCEPT
iptables -A FORWARD -p icmp -j DROP

# nat
iptables -t nat -A POSTROUTING -o $IFACE_INT -s 192.168.0.2/24 -j MASQUERADE

a portok: az ssh service nem a 22-esen figyel, ezért is van a scriptben másképp megadva, a linuxdcpp 5000-es portot használ, a deluge 6881-et, a 6464 pedig egy hubszoftver (aquila), ami tesztelési, debugolási céllal kell, hogy fusson

gondolom a script már jól el van tolva, de már picit el voltam keseredve.
most a script át van nevezve, nem tud elindulni.

a segítséget előre is köszönöm: sumo.

p.s.: majd el felejtettem: ubuntu 7.10 / gnome

Hozzászólások

1. Az ilyenre való a fórum.
2. Ha valamit nem standard portra teszünk, akkor azt 1024 feletti portra pakoljuk, mert az az alatti portok un. privileged portok, valami számára ki vannak már osztva. Érdemes a /etc/services fájllal konzultálni a portot illetően.
3. A végén eldobom (INPUT, OUTPUT lánc) szabállyal konkrétan mi a célod a fő policy DROP-ra állítása után???
4. NAT MASQUERADE sor: -s 192.168.0.2/24 Ezt ugye te is érzed mennyire gáz? 192.168.0.0/24 a helyes megadás.
5. Én a -m state helyett a -m conntrack --ctstate -t jobban preferálom, a conntrack jobban tud FTP-t. (Pontosabban most nézem, betöltöd a conntrack ftp-t aztán a sima state-t használod. Ez most komoly?)
6. "iptables -A INPUT -i eth0" Ez mi? Mit akartál ezzel? Én egy syntax errort szagolok itt.
7. Asszem multiport UDP-hez is van. Jó lenne eldönteni, hogy milyen stílust használsz, egy idő után már te se fogod érteni a saját scripted.
8. "iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP" Itt mire gondoltál?
9. A NAT-hoz ugye tudod, hogy a sysctl.conf-ba is kell egy "net.ipv4.ip_forward = 1" sor is?

Végül egy tipp: Bonyolult tűzfalscriptek helyett ajánlom figyelmedbe a iptables-save, iptables-restore parancsot, sokkal egyszerűbb vele konfigot kimenteni-tölteni, és nem kell hosszú scripteket futtatni, csak egy parancs az egész. Gyorsabban tölt tőle a gép :D

szia,

köszi a választ, nézzük sorban:
1: igen, természetesen tudom, hogy a fórum erre való. ám valahogy olyan érzésem volt ezzel kapcsolatban, hogy már annyian szenvedtek vele, hogy az emberek többségének feláll a szőr a hátán egy n+1-edik iptables script láttan. gondoltam itt nem zavar annyi embert.
2: igaz, erre gondolhattam volna.
3: én úgy tudom (kérlek javíts ki, ha tévedek), hogy így a logolás után lesznek eldobva a nem illeszkedő csomagok. (bár itt én is érzek némi fogalomzavart :))
4: igen, köszi a javítást.
5: erre nem tudok mit mondani, csak követtem a linken lévő dokumentációt. a magyarázatod után érthető a helytelenség, javítottam.
6: elvileg, ezzel a lánc elején lévő policyval tudom számolni a forgalmat, amit aztán a "sudo iptables -L INPUT -v -n" parancsal tudok meglesni. ezen a szabályon minden csomag átmegy az input láncon.
7: igen, az udp-t is multiport-al fogom megadni, eredetileg is úgy volt. ez a mostani egy szerencsétlen szelekció eredménye.
8: ezt is egy doksiból szedtem, a doksi szerint így azok a tcp csomagok, amik nem syn bittel kezdődnek, el lesznek dobva. ha hülyeség szaga van, kérlek szólj:)
9:ezzel kezdődik a script:
# ip tovabbitas bekapcsolasa
echo "1" > /proc/sys/net/ipv4/ip_forward
előre is köszi a további segítséget: sumo
ps: ez az első iptables próbálkozásom, nem értek még igazából mindent ezzel kapcsolatban. (gondolom ez látszik is)
::sumo.conf::

Egy kis pontositas ehhez-ahhoz:

2) Ne keverjuk a privileged portot a well known porttal! Az elso arrol szol, hogy 1024 alatti portra nem bindolhatsz (azaz kb. nem hasznalhatod) bizonyos jogok nelkul (legalabbis Unix es Unix-like rendszereken), a masik pedig az IANA (Internet Assigned Numbers Authority) ajanlasa/szabvanya a portok hasznalatara. Nincs minden 1024 alatti port kiosztva. Ha csak magadnak kell tudnod a megvaltoztatott portszamot, nagyjabol mindegy mit hasznalsz. Egyebkent ha a celja az, hogy kevesebb jelszoprobalgatas legyen, akkor egy magas es az /etc/services-ben nem szereplo portot erdemes valasztani.

3) Itt valoszinuleg az oldja fol a zavart, hogy a LOG non-terminating target. Magyarul: Tfh egy csomag megy vegig a szabalyokon egy lancban, es az egyikre illeszkedik, akkor bizonyos targeteknel (ACCPET, DROP stb.) befejezodik itt a feldolgozas, azaz nem jut el a kesobbi szabalyokig, mig mas targeteknel (LOG, MARK stb.) pedig tovabbmegy. Ezert szoktak ugy logolni, hogy:
iptables [match] -j LOG
iptables [ugyanaz-a-match] -j DROP
De erre itt nincs szukseg, mert az utolso szabaly helyett ott a policy.

6) Nincs itt syntax error. En akkor szoktam ilyen szabalyokat hasznalni, ha csak a hozza tartozo csomag- es byteszamlalok erteke erdekel.

8) Ezzel kulonfele portscan-ek (null, fin, xmas) csomagjait lehet szurni. Meg peldaul ott talalkoztam az ilyesmi ertelmes hasznalataval, amikor kreten ISP-k a routereiken RST-ket szurnak be a kapcsolatba mondjuk P2P korlatozasi cellal. Elesben nem lattam meg ilyet, ugyhogy nem tudom jo lenne-e ez a szabaly. (Valoszinuleg inkabb a nem EXPECTED RST-t kene eldobni.)

Egyebkent nem a TCP csomagok kezdodnek SYN bittel, hanem a TCP kapcsolat kiepitese kezdodik egy olyan csomaggal, amiben a SYN bit 1.

a) A '--dport 20,21,22' helyett lehet '--dport 20:22' irni, es igy meg a multiport match sem kell.

b) A multiport hasznalata tobb sor helyett nem csak stilus kerdese, gondoljunk megint csak a szamlalokra.

c) A LOG target hasznalatanal erdemes uid-ot (--log-uid) is logolni, hogy legyen valami lovesed arrol, mi is kuldte a csomagot.

d) ICMP-t soha ne dropolj ugy, ahogy a FORWARD lancban teszed! A pingen kivul mas haszna is van (port-unreachable stb.). Inkabb limitald az osszes ICMP-t, de ne dobd el mindet!

e) A portszamok helyett lehet a nevuket is hasznalni, ha szerepelnek az /etc/services-ben.

f) A leirasodbol nekem az jon le, hogy ezt a gepet semmi sem hasznalja routernek, hanem helyette a 192.168.0.1-et. Ha ez igy van, akkor eleg a FORWARD lancban a policyt DROP-ra allitani, es az ip_forward meg a MASQUERADE sem kell. (Ezen a FORWARD lancon ugysem jut at a pingen kivul semmi.)

g) Azok a portszamok, amiket a P2P kliensekhez irsz, a tuzfal OUTPUT lancaban valoszinuleg forrasportkent latszanak, nem celportkent. Ezeket valoszinuleg inkabb az INPUT lancba kene tenni. (Ja latom, ott is van.)

h) De ugy altalaban jobban jarsz (mert a P2P kliensek nagyon sok portot hasznalnak), ha inkabb a '-m owner --uid-owner UID' match-csel engedelyezed a P2P klienst futtato felhasznalo osszes kapcsolatat az OUTPUT lancban.

i) A DNS-hez ne csak az udp:53 portot, hanem a tcp:53-ast is engedelyezd! (Kell a hosszu domainek feloldasahoz, meg a zone transferekhez is.)

j) Az ssh-s limittel valaki nagyon konnyen el tudja erni, hogy kizarjon teged a sajat ssh serveredrol.

udv. rubasov

szia!

köszönöm a választ, sokat segítettél, javítgattam is pár dolgot.
az ssh portot átállítottam egy magasabb értékre.
a láncok végéről kiszedtem a drop szabáylokat.
ezt a syn bites dolgot is hanyagolom inkább:)
a forward láncban lévő icmp dropot is kivettem.
igen, a gép valóban nem routerként működik, hanem egy routeren keresztül néz ki a netre. az ip_forward-ot és a natot kikommenteztem.
a tcp 53-as portot is felvettem az output láncba,
az ssh limittel nem tudom mi legyen így. ez egy itthoni gép, igazából nagyon ritkán van használva az ssh, általában én ssh-zok kifelé, de hozzám nagyon kevesen. mindenesetre gondolkodom rajta, köszi a tippet.

üdv: sumo

ps: ha hazaérek moziból, ki is próbálom:)
::sumo.conf::

Köszi szépen a segítséget, így végül jó lett:


#!/bin/bash

IFACE_INT=eth0

# ip tovabbitas bekapcsolasa
# echo "1" > /proc/sys/net/ipv4/ip_forward

# anti-synflood, anti-spoofing vedelem
echo "1" > /proc/sys/net/ipv4/tcp_syncookies
echo "1" > /proc/sys/net/ipv4/conf/default/rp_filter

# modulok betoltese
modprobe ip_conntrack_ftp

iptables -F
iptables -X
iptables -Z
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP

# INPUT lanc
iptables -A INPUT -i eth0
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --dport 4242 -m limit --limit 3/m -j LOG --log-prefix "SSH_ACCEPT: "
iptables -A INPUT -i eth0 -p tcp --dport 4242 -m limit --limit 3/m -j ACCEPT
iptables -A INPUT -i eth0 -p tcp -m multiport --dport 5000,6464,6881 -j ACCEPT # ldcpp, aquila, deluge

iptables -A INPUT -i eth0 -p udp -m multiport --dport 5000,6881 -j ACCEPT # ldcpp, aquila, deluge
iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 3/m --limit-burst 1 -j ACCEPT
iptables -A INPUT -j LOG --log-prefix "INPUT_DROP: "

# OUTPUT lanc
iptables -A OUTPUT -o lo -j ACCEPT
iptables -A OUTPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT
iptables -A OUTPUT -p tcp --dport 53 -j ACCEPT # dns

iptables -A OUTPUT -p udp --dport 53 -j ACCEPT # dns
iptables -A OUTPUT -m owner --uid-owner 1000 -m conntrack --ctstate NEW -j ACCEPT # uid 1000-nek minden kifele meno kapcsolat engedve
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT_DROP: "

# FORWARD lanc
iptables -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -A FORWARD -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
iptables -A FORWARD -p icmp --icmp-type echo-request -m limit --limit 3/m --limit-burst 1 -j ACCEPT

# nat
# iptables -t nat -A POSTROUTING -o $IFACE_INT -s 192.168.0.0/24 -j MASQUERADE

::sumo.conf::

shorewall, atolvasod 1-2szer a doksit, es csinalsz egy rendes configot.

--
A vegtelen ciklus is vegeter egyszer, csak kelloen eros hardver kell hozza!