View Single Post
Old 28-01-2008, 16:40   #1
gurutech
Senior Member
 
L'Avatar di gurutech
 
Iscritto dal: Jun 2000
Città: S.Giuliano (MI)
Messaggi: 1047
[iptables] NFQUEUE, mangle e DNAT

Ciao,
sto facendo un accrocchio (chiamarlo programma è sempre troppo) per il filtro degli URL trasparente gestito via iptables.
Perchè gestito via iptables e non, ad esempio via squid+redirect?
perchè non voglio inserire altre strutture alla rete già esistente, per cui ho preso una macchina embedded con 2 schede di rete e faccio questo:

---INTERNET---ROUTER/PROXY DI RETE------1-MIO FIREWALL-2-----LAN

dove l'interfaccia 1 e 2 di MIO FIREWALL sono in bridge, così non hanno neanche bisogno di un indirizzo IP.

Veniamo al dunque:
ho pensato di fare il tutto in user space, per cui ho usato il target NFQUEUE e mi sono letto la documentazione per scrivere il programma necessario in C.
Ora quando devo emettere un verdetto, se si tratta di emettere NF_ACCEPT oppure NF_DROP nessun problema, il mio pacchetto viene bloccato.

Io però vorrei poter fare un'altra cosa: redirigere il pacchetto che matcha in user space verso altri lidi con DNAT.... come fare ?

Per il momento ho pensato di usare nf_set_verdict_mark con verdetto NF_REPEAT per riaccodare il pacchetto nella chain, ma... non funziona! perchè non riesce a reinserirlo nella chain NAT, l'unica in cui DNAT sia valido.

io avvio il firewall con questo script di iptables
Codice:
sudo su -c "echo 1 > /proc/sys/net/ipv4/ip_forward"
sudo /sbin/iptables -F
sudo /sbin/iptables -F -t nat
sudo /sbin/iptables -F -t mangle
sudo /sbin/iptables -t nat -A PREROUTING -m mark --mark 1 -j LOG --log-prefix "nat PREROUTING "
sudo /sbin/iptables -t nat -A POSTROUTING -m mark --mark 1 -j LOG --log-prefix sudo /sbin/iptables -A FORWARD -m mark --mark 1 -j LOG --log-prefix "filter FORWARD "
sudo /sbin/iptables -t mangle -A PREROUTING -m mark --mark 1 -j LOG --log-prefix "mangle PREROUTING "
sudo /sbin/iptables -t mangle -A PREROUTING -m mark --mark 2 -j ACCEPT
sudo /sbin/iptables -t mangle -A PREROUTING -m mark --mark 0 -m physdev -m multiport --physdev-in eth2 -p tcp --dports 80,3128 -j MARK --set-mark 2
sudo /sbin/iptables -t mangle -A PREROUTING -m physdev -m mark --mark 2 -m multiport --physdev-in eth2 -p tcp --dports 80,3128 -j NFQUEUE

sudo ./nfqnl
e ottengo come output di dmesg
Codice:
mangle PREROUTING IN=br0 OUT= PHYSIN=eth2 MAC=00:05:1c:04:f4:e1:00:a0:d1:d7:ee:98:08:00 SRC=192.168.0.9 DST=x.y.z.k LEN=608 TOS=0x00 PREC=0x00 TTL=64 ID=32856 DF PROTO=TCP SPT=42332 DPT=80 WINDOW=92 RES=0x00 ACK PSH URGP=0 
filter FORWARD IN=br0 OUT=br0 PHYSIN=eth2 PHYSOUT=eth1 SRC=192.168.0.9 DST=x.y.z.k LEN=608 TOS=0x00 PREC=0x00 TTL=64 ID=32856 DF PROTO=TCP SPT=42332 DPT=80 WINDOW=92 RES=0x00 ACK PSH URGP=0
(notare la mancanza di nat PREROUTING)
idee?
mi piacerebbe tanto poter redirezionare il "bad traffic" verso un IP in maniera che l'utente finale veda un messaggio di errore.

p.s. la redirezione funziona se non faccio mangling. Appena tocco la mangle table i pacchetti non passano più in nat. Inoltre in nat table non riesco a far andare NFQUEUE.
__________________
“No te tomes tan en serio la vida, al fin y al cabo no saldrás vivo de ella”
gurutech è offline   Rispondi citando il messaggio o parte di esso