iptables+l7-filter

Fórumok

Sziasztok!

Adott egy Linksys WRT54GL router, Tomato firmware-el, aminek a wikijében ez áll: "Netfilter/iptables with customizable settings, IPP2P and l7-filter"
Írtam egy scriptet a routerre, nagyjából műxik is, de a torrent kapcsolatot eléggé nehezen tudja kiépíteni ha csak ez a szabály van benne:

iptables -A FORWARD -i $IF_EXT -p tcp --dport 54896:54897 -m state --state NEW -j ACCEPT
iptables -A FORWARD -i $IF_EXT -p udp --dport 54896:54897 -m state --state NEW -j ACCEPT

Ezért jó lenne valahogy l7-el megoldani, de nem megy.

Modulok megvannak:

# lsmod
Module  Size Used by
ipt_ipp2p 7912 0 (unused)
ipt_layer7 11984 1
jffs2  75920 1
zlib_inflate 19096 0 [jffs2]
zlib_deflate 21064 0 [jffs2]
tomato_ct 1136 0 (unused)
wl  423640 0 (unused)
et  28088 0 (unused)
ip_nat_ftp 3712 0 (unused)
ip_conntrack_ftp 4936 1
ip_nat_rtsp 6656 0 (unused)
ip_conntrack_rtsp 6344 1
ip_nat_h323 2904 0 (unused)
ip_conntrack_h323 2888 1
ip_nat_pptp 2668 0 (unused)
ip_conntrack_pptp 3452 1
ip_nat_proto_gre 1888 0 (unused)
ip_conntrack_proto_gre 2776 0 [ip_nat_pptp ip_conntrack_pptp]

Szabályok között látszódik:

# iptables -vnL FORWARD|grep LAYER
36 3292 ACCEPT 0 -- * * 0.0.0.0/0 0.0.0.0/0 LAYER7 l7proto bittorrent 

Azonban a logokban:

<4>FORWARD_DROP: IN=br0 OUT=vlan1 SRC=192.168.1.2 DST=72.179.190.161 LEN=60 TOS=0x08 PREC=0x00 TTL=63 ID=28067 DF PROTO=TCP SPT=40044 DPT=57210 WINDOW=5840 RES=0x00 SYN URGP=0 
<4>FORWARD_DROP: IN=br0 OUT=vlan1 SRC=192.168.1.2 DST=213.93.87.20 LEN=60 TOS=0x08 PREC=0x00 TTL=63 ID=52187 DF PROTO=TCP SPT=51457 DPT=19880 WINDOW=5840 RES=0x00 SYN URGP=0 
<4>FORWARD_DROP: IN=br0 OUT=vlan1 SRC=192.168.1.2 DST=201.21.216.104 LEN=60 TOS=0x08 PREC=0x00 TTL=63 ID=4484 DF PROTO=TCP SPT=36386 DPT=29035 WINDOW=5840 RES=0x00 SYN URGP=0 
<4>INPUT_DROP: IN=vlan1 OUT= MAC=00:50:8d:f9:f3:e6:00:01:5c:23:94:48:08:00:45:00:00:83 SRC=201.37.53.199 DST=86.101.4.240 LEN=131 TOS=0x00 PREC=0x00 TTL=108 ID=28487 PROTO=UDP SPT=22330 DPT=1024 LEN=111 
<4>FORWARD_DROP: IN=vlan1 OUT=br0 SRC=83.11.152.10 DST=192.168.1.2 LEN=48 TOS=0x00 PREC=0x00 TTL=113 ID=4321 DF PROTO=TCP SPT=59482 DPT=54897 WINDOW=8192 RES=0x00 SYN URGP=0 
<4>FORWARD_DROP: IN=vlan1 OUT=br0 SRC=83.11.152.10 DST=192.168.1.2 LEN=48 TOS=0x00 PREC=0x00 TTL=113 ID=4466 DF PROTO=TCP SPT=59482 DPT=54897 WINDOW=8192 RES=0x00 SYN URGP=0 

Itt van maga a script:

## otthoni tuzfal

modprobe ipt_layer7
modprobe ipt_ipp2p
IF_INT=br0
IF_EXT=vlan1

## eloszor torlunk minden szabalyt.
iptables -F
iptables -X
iptables -Z
## alap policy
iptables -P INPUT ACCEPT
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT

## logolas debug eseten
#iptables -t mangle -A PREROUTING -j LOG --log-uid --log-prefix "MANGLE_PREROUTING: "
#iptables -t mangle -A INPUT -j LOG --log-uid --log-prefix "MANGLE_INPUT: "
#iptables -t mangle -A FORWARD -j LOG --log-uid --log-prefix "MANGLE_FORWARD: "
#iptables -t mangle -A OUTPUT -j LOG --log-uid --log-prefix "MANGLE_OUTPUT: "
#iptables -t mangle -A POSTROUTING -j LOG --log-uid --log-prefix "MANGLE_POSTROUTING: "
#iptables -t nat -A OUTPUT -j LOG --log-uid --log-prefix "NAT_OUTPUT: "
#iptables -t nat -A PREROUTING -j LOG --log-uid --log-prefix "NAT_PREROUTING: "
#iptables -t nat -A POSTROUTING -j LOG --log-uid --log-prefix "NAT_POSTROUTING: "
#iptables -A INPUT -j LOG --log-uid --log-prefix "INPUT: "
#iptables -A OUTPUT -j LOG --log-uid --log-prefix "OUTPUT: "
#iptables -A FORWARD -j LOG --log-uid --log-prefix "FORWARD: "

## INPUT szabalyok.
iptables -A INPUT -i lo -j ACCEPT ## loopback -en engedelyezzuk a forgalmat.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## engedelyezzuk befele, ami tolunk szarmazik.
iptables -A INPUT -i $IF_INT -s 192.168.1.2 -j ACCEPT
iptables -A INPUT -p tcp ! --syn -m state --state NEW -j DROP #nem syn-nel kezdodik, kulonben esetleg tamadas
iptables -A INPUT -p tcp --dport ssh -m limit --limit 3/m -j LOG --log-uid --log-prefix "SSH_ACCEPT: "
#iptables -A INPUT -p tcp --syn --dport ssh -m recent --set -j ACCEPT
iptables -A INPUT -p tcp --syn --dport ssh -m recent --update --seconds 60 --hitcount 3 -j DROP
iptables -A INPUT -i $IF_INT -p tcp -s 192.168.1.2 --syn --dport ssh -j ACCEPT
iptables -A INPUT -i $IF_EXT -p tcp -s IP --syn --dport ssh -j ACCEPT
iptables -A INPUT -i $IF_EXT -p tcp -s IP --syn --dport ssh -j ACCEPT
iptables -A INPUT -p tcp --dport 45761 -m state --state NEW -j ACCEPT ## router tavoli eleres
iptables -A INPUT -i $IF_EXT -p tcp --dport 56732 -m state --state NEW -j ACCEPT ## VNC
iptables -A INPUT -i $IF_EXT -p udp --dport 64561 -m state --state NEW -j ACCEPT ## dht peer exchange miatt
iptables -A INPUT -p icmp -j ACCEPT ## kintrol "ping" mehet.
iptables -A INPUT -i $IF_EXT -p udp -s 89.132.95.254 --dport 68 -j ACCEPT ## szolgaltatoi dhcp
iptables -A INPUT -j LOG --log-prefix "INPUT_DROP: "
iptables -A INPUT -j DROP

## OUTPUT szabalyok.
iptables -A OUTPUT -o lo -j ACCEPT ## loopback -en engedelyezzuk a forgalmat.
iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT ## jovahagyott kapcsolatok engedelyezese.
iptables -A OUTPUT -p tcp -d 192.168.1.2 --syn --dport ssh -m limit --limit 3/m -j ACCEPT
iptables -A OUTPUT -p tcp -o $IF_EXT -s IP --dport 80 -j ACCEPT ##port tunnel miatt
iptables -A OUTPUT -p tcp -o $IF_EXT -s IP --dport 443 -j ACCEPT
iptables -A OUTPUT -o $IF_EXT -d 213.46.246.53 -p udp --dport 53 -j ACCEPT ##dns
iptables -A OUTPUT -o $IF_EXT -d 213.46.246.54 -p udp --dport 53 -j ACCEPT
iptables -A OUTPUT -o $IF_EXT -d 213.46.246.53 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o $IF_EXT -d 213.46.246.54 -p tcp --dport 53 -j ACCEPT
iptables -A OUTPUT -o $IF_EXT -p tcp --dport 123 -j ACCEPT #ntp
iptables -A OUTPUT -o $IF_EXT -p udp --dport 123 -j ACCEPT
iptables -A OUTPUT -j LOG --log-prefix "OUTPUT_DROP: "
iptables -A OUTPUT -j DROP

# FORWARD lanc
iptables -A FORWARD -p icmp -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT ## jovahagyott kapcsolatok engedelyezese.
iptables -A FORWARD -i $IF_INT -p udp --dport 53 -j ACCEPT ## a DNS -re szukseg van.
iptables -A FORWARD -i $IF_INT -p tcp --dport 53 -j ACCEPT
iptables -A FORWARD -i $IF_INT -p udp --dport 123 -j ACCEPT ## ntp mehet
iptables -A FORWARD -i $IF_INT -p tcp --dport 123 -m state --state NEW -j ACCEPT

#iptables -A FORWARD -j QUEUE
iptables -A FORWARD -i $IF_INT -p tcp --dport 80 -m state --state NEW -j ACCEPT ## http mehet.
iptables -A FORWARD -i $IF_INT -p tcp --dport 443 -m state --state NEW -j ACCEPT ## https mehet
iptables -A FORWARD -i $IF_INT -p tcp --dport 22 -m state --state NEW -j ACCEPT ## ssh mehet.
iptables -A FORWARD -i $IF_INT -p tcp --dport 20:21 -m state --state NEW -j ACCEPT ## ftp mehet
iptables -A FORWARD -i $IF_INT -p tcp -d host -m state --state NEW -j ACCEPT ## ftp
iptables -A FORWARD -i $IF_INT -p tcp --dport 43 -m state --state NEW -j ACCEPT ## whois
iptables -A FORWARD -i $IF_INT -p tcp -d mail.chello.hu --dport 25 -m state --state NEW -j ACCEPT ## Levelezes SMTP
iptables -A FORWARD -i $IF_INT -p tcp --dport 993 -m state --state NEW -j ACCEPT ## Levelezes IMAP4s

iptables -A FORWARD -i $IF_INT -p tcp --dport 1863 -m state --state NEW -j ACCEPT ## msn
iptables -A FORWARD -i $IF_INT -p tcp --dport 6667 -m state --state NEW -j ACCEPT ## irc
iptables -A FORWARD -i $IF_INT -p tcp --dport 2710 -m state --state NEW -j ACCEPT ## torrent tracker
#iptables -A FORWARD -i $IF_EXT --dport 54896:54897 -m state --state NEW -j ACCEPT ## torrent
iptables -A FORWARD -m layer7 --l7proto bittorrent -j ACCEPT
iptables -A FORWARD -i $IF_INT -p udp --sport 64561 -m state --state NEW -j ACCEPT ##dht
iptables -A FORWARD -j LOG --log-prefix "FORWARD_DROP: "
iptables -A FORWARD -j DROP

Eléggé összecsapott, majd ha megy minden rendesen akkor rendbe teszem, de addig nincs értelme.
Érdekesség még, hogy ha belépek routerre és futtatom a scriptet, ezt kapom:

# sh /tmp/script_fire.sh 
iptables: No chain/target/match by that name

Valamelyik szabály nem tetszik neki, de nem tudom melyik, összehasonlítottam sorról sorra a scriptet és az "iptables -L" kimenetét és egyezett vagyis az INPUT, OUTPUT és FORWARD láncra vonatkozó összes szabály bekerült.
A többi meg nincs semmi extra.
Eleinte 2 ilyen sor volt, az egyiket ez okozta:

iptables -A INPUT -p tcp --syn --dport ssh -m recent --set -j ACCEPT

Azért is lett most kikommentezve, bár nem tudom mi baja van vele.

Ha ipp2p-vel próbálom akkor sem megy, olyankor ez van a layer7-es sor helyén:

iptables -A FORWARD -m ipp2p --bit -j ACCEPT

Hozzászólások

Senkinek semmi ötlet?
l7 vagy ipp2p nélkül egyáltalán nem megoldható, nincs semmi olyan jellemzője a torrentnek ami alapján modulok nélkül is lehetne szűrni?

Az meg van, nem az a gond, hogy kívülről nem érik el, hanem, hogy ha egy új torrentet adok hozzá, akkor a tűzfal miatt nehézkesen kapcsolódik kifelé.
A trackerre regisztrálja magát, dht-n szintén, de csak azon a korlátozott port tartományon tud kifelé kommunikálni, így eleinte rengeteg csomag dropolva lesz.
Persze egy idő után beindul, mivel csak kijut valahogy, meg mások kezdeményeznek kapcsolatot felém s tőlük már lehet szedni, de nehezen indul be a folyamat.
Lehet az lesz, hogy mondjuk egy 5-ös vagy 10-es port tartományt megkap s így hátha lecsökken ez az idő.