Newsgroup: it.comp.os.linux.sys
Titolo: ipchains e transparent proxy... pls

Ciao a tutti.
Sto diventando matto per configurare in modalità "transparent proxy" il mio
server/gateway (dico bene?).
Ho configurato squid come si deve, infatti provando ad imporre il proxy in
qualsiasi browser i siti vengono filtrati correttamente. Ora però vorrei non
dover configurare ogni computer, cioè vorrei che tutti passassero in
automatico tramite il proxy, ecco perché il transparent proxying.
La regola per ipchains dovrebbe essere :
ipchains -A input   -i eth1 -p tcp -s 0/0 -d 0/0 www -j REDIRECT 3128
nonostante questo non funziona.
Cosa c'è che sbaglio?
Potreste aiutarmi?
Grazie
Giulio

 
Si la regola è buona ma sei sicuro di aver detto a squid di accettare le 
richieste in formato http. Guarda meglio qui:
http://squid.visolve.com/white_papers/trans_caching.htm
oltre alla regola del firewall devi impostare altri parametri, sia per il 
kernel (che grossomodo nella maggioranza dei casi anno bene) si aper squid.
--
Rizio
__________________________________
Il vero problema nella vita e' essere sufficientemente
sveglio per capire i problemi ma non abbastanza per risolverli 

 
la tua regola dice di cambiare la porta di destinazione, ma non cambia 
l'host destinazione, che invece dovrebbe diventare il proxy...
-- 
+-------
| Paolo opg
|
| janickg ( at ) hotmail ( dot ) com
+-------

 si aper squid.
Ciao,
intendi le regole seguenti?
----------------------------------------------------------------------------
-------------------------
To Run Squid in a transparent mode, enable the following directives in
Squid.conf.
httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
The httpd_accel_port directive tells which port the origin server is
listening on (port 80). Squid does not need to know how requests arrive at
its listening port (3128). This must be done by the operating system or
router. Squid sees a request for a URL and connects to port 80 on the server
where it thinks the URL resides. Squid does not have any control over what
types of request arrive to it. If Squid is listening to port 3128 then it
assumes the data arriving there is a protocol it can handler (HTTP, FTP,
etc). The type of packets that are redirected to Squid is determined
entirely by the TCP/IP implementation of the host (i.e. ipchains forwarding)
and is out of Squid's control.
----------------------------------------------------------------------------
---------------------------------
Ok, erano impostate correttamente.
L'unica cosa che non era scritta correttamente era il "virtual", ma ho
corretto.
Nonostante questo non funge.
Ho la sensazione che dipenda tutto dalla configurazione della mia rete, e
dal routing...
che ne pensi?
Posso scendere più nel dettaglio?
Grazie
Giulio

 Posso scendere più nel dettaglio?
Vediamo se riusciamo a capire; posta il route -n, eventualmente controlla le 
impostazioni di rete di squid. Prova a navigare direttamente con l'ip sul 
browser, prova a disabilitare il firewall per due sec. lasciando solo la 
regola del redirect, ecc.
Insomma chiariamoci un po le idee, così sappiamo da dove partire analizzando 
tutto il quanto.


 analizzando tutto il quanto.
Ok :-)
root@server2:~# route -n
Kernel IP routing table
Destination     Gateway         Genmask             Flags Metric Ref    Use
Iface
213.213.77.96   0.0.0.0         255.255.255.224  U     0      0        0
eth1
192.168.1.0       0.0.0.0         255.255.255.0      U     0      0        0
eth0
127.0.0.0           0.0.0.0          255.0.0.0              U     0      0
0      lo
0.0.0.0         213.213.77.97   0.0.0.0                UG    1      0
0      eth1
Per quanto riguarda squid da quello che capisco dalla documentazione ho
configurato tutto...
Per quanto riguarda invece il firewall io mi aspetterei che, avendo
reindirizzato tutto il traffico della 80 su 3128, se squid non è attivo non
si dovrebbe poter navigare... E questo non succede. Insomma mi aspetterei
comunque la 80 bloccata.
Sbaglio?
Giulio

 analizzando tutto il quanto.
root@server2:~# ipchains -L
Chain input (policy DENY):
target     prot opt     source                destination           ports
ACCEPT     all  ------  anywhere             anywhere              n/a
ACCEPT     all  ------  anywhere             anywhere              n/a
REJECT     tcp  ------  localnet/24          !
213.213.77.96/27
      any ->
www
REDIRECT   tcp  ------  localnet/24          anywhere              any ->
www => 3128
REDIRECT   tcp  ------  anywhere             localnet/24           any ->
www => 3128
Chain forward (policy REJECT):
target     prot opt     source                destination           ports
ACCEPT     all  ------  localnet/24          localnet/24           n/a
MASQ       all  ------  localnet/24          anywhere              n/a
Chain output (policy REJECT):
target     prot opt     source                destination           ports
ACCEPT     all  ------  anywhere             anywhere              n/a
ACCEPT     all  ------  anywhere             anywhere              n/a
REJECT     tcp  ------  localnet/24          !
213.213.77.96/27
      any ->
www
----------------------------------------------------------------------------
---------------------------
Mi sembra che in questa configurazione minima ci sia un buco fondamentale: i
primi due accept.
Sbaglio?
Questo è il firewall di test incriminato.
#!/bin/sh
#
# Impostazioni Firewall
#
LAN=
192.168.1.0/24
DMZ=
213.213.77.96/27
#
 ipchains -F input
 ipchains -F output
 ipchains -F forward
#
 ipchains -P input      DENY
 ipchains -P output     REJECT
 ipchains -P forward    REJECT
#
 ipchains -A input  -i lo   -j ACCEPT
 ipchains -A output -i lo   -j ACCEPT
 ipchains -A input  -i eth0 -j ACCEPT
 ipchains -A output -i eth0 -j ACCEPT
# Blocca la porta 80 (www)
 ipchains -A input  -i eth1 -p tcp -s $LAN -d ! $DMZ www -j REJECT
 ipchains -A output -i eth1 -p tcp -s $LAN -d ! $DMZ www -j REJECT
#
# Redirect for transparent proxy
 ipchains -A input   -i eth1 -p tcp -s $LAN -d 0/0 www -j REDIRECT 3128
 ipchains -A input   -i eth1 -p tcp -s 0/0  -d $LAN www -j REDIRECT 3128
#
#
# Non maschera il traffico interno
#
 ipchains -A forward -s $LAN -d $LAN -j ACCEPT
# ipchains -A input   -i eth0:0 -s 
192.167.14.1/24
 -d 
192.167.14.112/24
 -j
ACCEPT
# ipchains -A output  -i eth0:0 -s 
192.167.14.1/24
 -d 
192.167.14.112/24
 -j
ACCEPT
#
# Maschera il traffico verso l'esterno
#
 ipchains -A forward -s $LAN -i eth1  -j MASQ
#
# Blocca tutto il resto
# ipchains  -A input   -i eth1  -j DENY
# ipchains  -A output  -i eth1  -j REJECT
# ipchains  -A forward -i eth1  -j REJECT
----------------------------------------------------------------------------
---------------------
Grazie
Giulio

 # ipchains  -A forward -i eth1  -j REJECT
Ok e qui ristabiliamo un equilibrio, anche se troppo tardi per i filtri che 
matchano con le prime due ACCEPT.
Conferma o correggimi.
Cmq prova a lanciare lo script con "sh -x ....." così vedi se le regole 
vengono accettate tutte o se ci sono dei problemi di sintassi.
Prova anche disabilitando il firewall e usando solo le regole del 
transparent perchè come sopra secondo mè routi i pacchetti sull'interfaccia 
sbagliata.


 sull'interfaccia sbagliata.
Ora riprovo... Comunque se vedi la tabella di routing per andare su internet
uso come gateway 213.213.77.97 che è il router passando per eth1...
Non va bene questo?
OK ora provo solo con il masquerading e il transparent proxy...
A presto
Giulio

Grande novità... :-)
Ho usato il seguente script:
#!/bin/sh
#
# Impostazioni Firewall
#
LAN=
192.168.1.0/24
DMZ=
213.213.77.96/27
#
 ipchains -F input
 ipchains -F output
 ipchains -F forward
#
#
# Redirect for transparent proxy
 ipchains -A input   -p tcp -s $LAN -d 0/0 www -j REDIRECT 3128
# Non maschera il traffico interno
 ipchains -A forward -s $LAN -d $LAN -j ACCEPT
#
# Maschera il traffico verso l'esterno
#
 ipchains -A forward -s $LAN -i eth1  -j MASQ
#
-------------------------------------------------------------------------
Così il transparent proxying ha funzionato.
Anche troppo...
Non mi ha consentito l'accesso ad alcuni siti interni alla nostra rete..che
hanno indirizzo 192.168.1.xxx (metto xxx perché non ricordo esattamente...)
Comunque è già un grande passo.
Così è troppo aperta la rete?
La domanda la faccio perché fin quando non riesco a fare di meglio vorrei
lasciare queste impostazioni che funzionano.
Grazie per il tuo prezioso contributo..
Ciao
Giulio
P.S.
A proposito. Dall'ultima riga del firewall (esattamente da quella del MASQ)
si capisce che la rete accede ad internet tramite eth1.
Che succede se specifico il transparent proxying solo su eth1 ?

 Che succede se specifico il transparent proxying solo su eth1 ?
Mi rispondo da solo:
Se uso
.............................
 ipchains -A input   -p tcp -s $LAN -d 0/0 www -j REDIRECT 3128
........................................
funziona,
se uso
........................................
 ipchains -A input   -i eth1 -p tcp -s $LAN -d 0/0 www -j REDIRECT 3128
..............................
non funziona.
Ora credo che disattivare il transparent proxying per alcuni siti o su
alcune interfaccie si debba fare da dentro squid...
O sbaglio ancora?
Grazie
Giulio

 Che succede se specifico il transparent proxying solo su eth1 ?
Che dipende da dove hai messo in ascolto Squid ? Non può essere altro che 
sull'eth0 perciò mettere il redirect sull'eth1 non ha senso no ?? Non gli 
deve arrivre nessuna richiesta http (sottostando all'acl our_network) 
dall'eth1. Il redirect devi metterlo sull'eth0 e impedire che dall'eth1 
provengano pacchetti di reti private (come da rfc), chiudere le porte di 
netbios, ecc. ecc. ecc.


 rfc), chiudere le porte di netbios, ecc. ecc. ecc.
Scusa, non scandalizzarti per la richiesta, ma dove trovo queste rfc? Io ho
sempre fatto riferimento al libro di Robert Ziegler "Linux Firewall", ed.
New Riders.
Grazie un mondo
Giulio

 Giulio


  REDIRECT 3128 
secondo me, l'errore è sempre in questa regola.
se arriva un pacchetto con questa destinazione:
1.2.3.4:80
dopo essere stato modificato dalla regola, la destinazione sarà diventata:
1.2.3.4:3128
oltre a cambiare la porta, devi cambiare anche l'ip destinazione, 
altrimenti al tuo proxy il pacchetto in questione non arriverà mai...


>
Ciao
non capisco il perché di quello che dici. E mi spiego:
Quello che io ho fatto (e che fino a ieri cercavo di fare) è deviare tutte
le comunicazioni in arrivo sulla porta 80 (www) su 3128 (proxy) ma sempre
della stessa macchina.
Non vedo perché avrei dovuto inviarle ad un'altra macchina.
Forse quello che dici tu sarebbe stato indicato se avessi usato come proxy
un computer diverso.
comunque ora funziona.
Ciao
Giulio

 
...
ho letto male il post iniziale e mi sono trascinato il malinteso...
