Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

iptables + proxy transparent

9 réponses
Avatar
Cedric
Bonjour a vous
J'ai un s=E9rieux probl=E8me avec les tables de routages et l'utilisation
d'iptables (enfin je pense que ca vient de la).
M=EAme en parcourant le web j'arrive pas trouver la solution.
C'est pourquoi je fait appel =E0 vous.

Mon but : Mettre en place un proxy transparent

Ma configuration
Routeur WRT54G (192.168.1.254) firmware Tomato 1.19 Noyau 2.4.20
PC sous windows XP (192.168.1.1)
Linux ubuntu 8.04 (192.168.1.10) sous vmware sur le pc sous XP


J'ai install=E9 Squid3 sur le linux et apparemment ca semble fonctionner
quand je configure les navagateurs pour l'utiliser
Du coup j'ai voulu essayer en transparent pour le fun et la ca se
corse.


Mon probl=E8me je pense vient du routeur que je doit configurer mais
apres plusieurs tentatives rien n'y fait

Voi la les tables du routeur
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
DROP 0 -- anywhere ANancy-
xxxxxxxxxxxxxxxxx.xxxxxxxx.fr
DROP 0 -- anywhere anywhere state
INVALID
ACCEPT 0 -- anywhere anywhere state
RELATED,ESTABLISHED
ACCEPT 0 -- anywhere anywhere
ACCEPT 0 -- anywhere anywhere
ACCEPT igmp -- anywhere anywhere

Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT 0 -- anywhere anywhere
DROP 0 -- anywhere anywhere state
INVALID
TCPMSS tcp -- anywhere anywhere tcp
flags:SYN,RST/SYN tcpmss match 1453:65535 TCPMSS set 1452
ACCEPT 0 -- anywhere anywhere state
RELATED,ESTABLISHED
wanin 0 -- anywhere anywhere
wanout 0 -- anywhere anywhere
ACCEPT 0 -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain wanin (1 references)
target prot opt source destination
ACCEPT udp -- anywhere BASE-ADDRESS.MCAST.NET/4 udp
ACCEPT tcp -- anywhere dreaml tcp dpt:
3389
ACCEPT udp -- anywhere dreaml udp dpt:
3389
ACCEPT udp -- anywhere dreaml udp dpt:
38864
ACCEPT tcp -- anywhere dreaml tcp
dpt:ftp
ACCEPT udp -- anywhere dreaml udp
dpt:fsp
ACCEPT tcp -- anywhere dreaml tcp dpt:
32459
ACCEPT udp -- anywhere dreaml udp dpt:
32459
ACCEPT tcp -- anywhere dreaml tcp dpt:
63671

Chain wanout (1 references)
target prot opt source destination
# iptables -L
Chain INPUT (policy DROP)
target prot opt source destination
DROP 0 -- anywhere
xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
DROP 0 -- anywhere anywhere state
INVALID
ACCEPT 0 -- anywhere anywhere state
RELATED,ESTABLISHED
ACCEPT 0 -- anywhere anywhere
ACCEPT 0 -- anywhere anywhere
ACCEPT igmp -- anywhere anywhere

Chain FORWARD (policy DROP)
target prot opt source destination
ACCEPT 0 -- anywhere anywhere
DROP 0 -- anywhere anywhere state
INVALID
TCPMSS tcp -- anywhere anywhere tcp
flags:SYN,RST/SYN tcpmss match 1453:65535 TCPMSS set 1452
ACCEPT 0 -- anywhere anywhere state
RELATED,ESTABLISHED
wanin 0 -- anywhere anywhere
wanout 0 -- anywhere anywhere
ACCEPT 0 -- anywhere anywhere

Chain OUTPUT (policy ACCEPT)
target prot opt source destination

Chain wanin (1 references)
target prot opt source destination
ACCEPT udp -- anywhere BASE-ADDRESS.MCAST.NET/4 udp
ACCEPT tcp -- anywhere dreaml tcp dpt:
3389
ACCEPT udp -- anywhere dreaml udp dpt:
3389
ACCEPT udp -- anywhere dreaml udp dpt:
38864
ACCEPT tcp -- anywhere dreaml tcp
dpt:ftp
ACCEPT udp -- anywhere dreaml udp
dpt:fsp
ACCEPT tcp -- anywhere dreaml tcp dpt:
32459
ACCEPT udp -- anywhere dreaml udp dpt:
32459
ACCEPT tcp -- anywhere dreaml tcp dpt:
63671

Chain wanout (1 references)
target prot opt source destination

J'ai ajout=E9 cette ligne de commande par exemple mais j'ai plus de net
apres
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp -m tcp --dport
80 -j DNAT --to-destination 192.168.1.10:3128

Voila, je pense avoir donn=E9 pas mal d'info
Merci pour votre aide

9 réponses

Avatar
Nicolas Bouthors
Cedric nous disait :
J'ai ajouté cette ligne de commande par exemple mais j'ai plus de net
apres
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp -m tcp --dport
80 -j DNAT --to-destination 192.168.1.10:3128



J'avoue ne pas avoir lu en détail les règles qui précèdaient, mais
en tous cas pour un proxy transparent moi j'ai toujours utilisé le
target REDIRECT et pas DNAT.

Quelque chose comme ça :
iptables -t nat -I PREROUTING -p tcp --dport 80
-m owner ! --uid-owner squid
-j REDIRECT --to 3128

Il faut ensuite configurer squid pour ajouter 1) les ACL permettant de
surfer 2) modifier la directive "http_port 3128" en ajoutant
"transparent" à la fin.

Tout ça dans l'optique où "iptables" et le "squid" sont sur la même
machine qui sert de passerelle vers internet.

Cordialement,

Nicolas BOUTHORS

--
Nicolas - 06 20 71 62 34 - http://nicolas.bouthors.org/album/
Avatar
Pascal Hambourg
Salut,

Cedric a écrit :

Ma configuration
Routeur WRT54G (192.168.1.254) firmware Tomato 1.19 Noyau 2.4.20
PC sous windows XP (192.168.1.1)
Linux ubuntu 8.04 (192.168.1.10) sous vmware sur le pc sous XP

J'ai installé Squid3 sur le linux et apparemment ca semble fonctionner
quand je configure les navagateurs pour l'utiliser
Du coup j'ai voulu essayer en transparent pour le fun et la ca se
corse.



Ah, pour le fun... Tu ne serais un peu maso sur les bords ?

Mon problème je pense vient du routeur que je doit configurer mais
apres plusieurs tentatives rien n'y fait

Voi la les tables du routeur
# iptables -L



Sans les interfaces, les adresses sous forme numérique et les chaînes de
la table 'nat' on ne va pas pouvoir en tirer grand chose. Il n'y a pas
iptables-save sur ton bidule ? A défaut, ajoute les options -n et -v, et
refais la même chose avec -t nat.

J'ai ajouté cette ligne de commande par exemple mais j'ai plus de net
apres
iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp -m tcp --dport
80 -j DNAT --to-destination 192.168.1.10:3128



Plus de web, tu veux dire ? Cette règle n'affecte que les connexions
vers le port 80/TCP.
Il manque au moins deux choses pour que ça puisse marcher.
1) Exclure l'adresse source du proxy, parce que sinon ça va reboucler.
2) NATer l'adresse source des connexions redirigées pour que les
réponses du proxy repassent par le routeur au lieu d'être envoyées
directement au client (problème classique du routage triangulaire).
Avatar
Pascal Hambourg
Nicolas Bouthors a écrit :

J'avoue ne pas avoir lu en détail les règles qui précèdaient, mais
en tous cas pour un proxy transparent moi j'ai toujours utilisé le
target REDIRECT et pas DNAT.



REDIRECT ne marche que si le proxy tourne en local sur la passerelle et
non sur une autre machine.

J'en profite pour rappeler qu'un proxy séparé n'a aucun moyen simple de
connaître l'adresse IP destination d'origine donc le HTTP 1.0 ne
marchera pas car il manque l'en-tête "Host:" contenant le nom de domaine
du site permettant de la retrouver. Mébon, qui utilise encore un
navigateur pas compatible HTTP 1.1 ?
Avatar
Cedric
> Sans les interfaces, les adresses sous forme numérique et les chaînes de
la table 'nat' on ne va pas pouvoir en tirer grand chose. Il n'y a pas
iptables-save sur ton bidule ? A défaut, ajoute les options -n et -v, e t
refais la même chose avec -t nat.




Je n'ai pas la commande iptables-save

J'ai uploadé un fichier avec les règles, ca sera peut etre plus
lisible
http://rapidshare.com/files/136354576/iptables-L-n-v.txt.html
Sinon les voici
# iptables -L -n -v
Chain INPUT (policy DROP 3560 packets, 228K bytes)
pkts bytes target prot opt in out source
destination

0 0 DROP 0 -- br0 * 0.0.0.0/0
90.26.198.18

70 7865 DROP 0 -- * * 0.0.0.0/0
0.0.0.0/0
state INVALID
1514 158K ACCEPT 0 -- * * 0.0.0.0/0
0.0.0.0/0
state RELATED,ESTABLISHED
1774 143K ACCEPT 0 -- br0 * 0.0.0.0/0
0.0.0.0/0

4 245 ACCEPT 0 -- lo * 0.0.0.0/0
0.0.0.0/0

3 96 ACCEPT 2 -- * * 0.0.0.0/0
0.0.0.0/0


Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source
destination

0 0 ACCEPT 0 -- br0 br0 0.0.0.0/0
0.0.0.0/0

0 0 DROP 0 -- * * 0.0.0.0/0
0.0.0.0/0
state INVALID
32890 1584K TCPMSS tcp -- * * 0.0.0.0/0
0.0.0.0/0
tcp flags:0x06/0x02 tcpmss match 1453:65535 TCPMSS set 1452
731K 293M ACCEPT 0 -- * * 0.0.0.0/0
0.0.0.0/0
state RELATED,ESTABLISHED
45698 5927K wanin 0 -- ppp+ * 0.0.0.0/0
0.0.0.0/0

45933 3817K wanout 0 -- * ppp+ 0.0.0.0/0
0.0.0.0/0

45933 3817K ACCEPT 0 -- br0 * 0.0.0.0/0
0.0.0.0/0


# iptables -L -n -v -t nat
Chain PREROUTING (policy ACCEPT 47068 packets, 3987K bytes)
pkts bytes target prot opt in out source
destination
0 0 DROP 0 -- ppp+ * 0.0.0.0/0
192.168.1.0/24
107 8148 DNAT icmp -- * * 0.0.0.0/0
90.26.198.18 to:192.168.1.254
0 0 DNAT tcp -- * * 0.0.0.0/0
90.26.198.18 tcp dpt:3389 to:192.168.1.1
0 0 DNAT udp -- * * 0.0.0.0/0
90.26.198.18 udp dpt:3389 to:192.168.1.1
0 0 DNAT udp -- * * 0.0.0.0/0
90.26.198.18 udp dpt:38864 to:192.168.1.1
5 300 DNAT tcp -- * * 0.0.0.0/0
90.26.198.18 tcp dpt:21 to:192.168.1.1
0 0 DNAT udp -- * * 0.0.0.0/0
90.26.198.18 udp dpt:21 to:192.168.1.1
76 3480 DNAT tcp -- * * 0.0.0.0/0
90.26.198.18 tcp dpt:32459 to:192.168.1.1
46246 6007K DNAT udp -- * * 0.0.0.0/0
90.26.198.18 udp dpt:32459 to:192.168.1.1
0 0 DNAT tcp -- * * 0.0.0.0/0
90.26.198.18 tcp dpt:63671 to:192.168.1.1

Chain POSTROUTING (policy ACCEPT 46353 packets, 6018K bytes)
pkts bytes target prot opt in out source
destination
0 0 SNAT tcp -- * * 192.168.1.0/24
192.168.1.1 tcp dpt:3389 to:192.168.1.254
0 0 SNAT udp -- * * 192.168.1.0/24
192.168.1.1 udp dpt:3389 to:192.168.1.254
0 0 SNAT udp -- * * 192.168.1.0/24
192.168.1.1 udp dpt:38864 to:192.168.1.254
0 0 SNAT tcp -- * * 192.168.1.0/24
192.168.1.1 tcp dpt:21 to:192.168.1.254
0 0 SNAT udp -- * * 192.168.1.0/24
192.168.1.1 udp dpt:21 to:192.168.1.254
0 0 SNAT tcp -- * * 192.168.1.0/24
192.168.1.1 tcp dpt:32459 to:192.168.1.254
0 0 SNAT udp -- * * 192.168.1.0/24
192.168.1.1 udp dpt:32459 to:192.168.1.254
0 0 SNAT tcp -- * * 192.168.1.0/24
192.168.1.1 tcp dpt:63671 to:192.168.1.254
41822 3622K MASQUERADE 0 -- * ppp+ 0.0.0.0/0
0.0.0.0/0

Chain OUTPUT (policy ACCEPT 75 packets, 9780 bytes)
pkts bytes target prot opt in out source
destination


Chain OUTPUT (policy ACCEPT 2822 packets, 257K bytes)
pkts bytes target prot opt in out source
destination


Chain wanin (1 references)
pkts bytes target prot opt in out source
destination

0 0 ACCEPT udp -- * * 0.0.0.0/0
224.0.0.0/4
udp
0 0 ACCEPT tcp -- * * 0.0.0.0/0
192.168.1.1
tcp dpt:3389
0 0 ACCEPT udp -- * * 0.0.0.0/0
192.168.1.1
udp dpt:3389
0 0 ACCEPT udp -- * * 0.0.0.0/0
192.168.1.1
udp dpt:38864
5 300 ACCEPT tcp -- * * 0.0.0.0/0
192.168.1.1
tcp dpt:21
0 0 ACCEPT udp -- * * 0.0.0.0/0
192.168.1.1
udp dpt:21
76 3480 ACCEPT tcp -- * * 0.0.0.0/0
192.168.1.1
tcp dpt:32459
45617 5923K ACCEPT udp -- * * 0.0.0.0/0
192.168.1.1
udp dpt:32459
0 0 ACCEPT tcp -- * * 0.0.0.0/0
192.168.1.1
tcp dpt:63671

Chain wanout (1 references)
pkts bytes target prot opt in out source
destination





Plus de web, tu veux dire ? Cette règle n'affecte que les connexions
vers le port 80/TCP.
Il manque au moins deux choses pour que ça puisse marcher.
1) Exclure l'adresse source du proxy, parce que sinon ça va reboucler.



En efftet, je me suis mal exprimé, je n'avais plus web mais sinon les
autres protocols fonctionnés.

2) NATer l'adresse source des connexions redirigées pour que les
réponses du proxy repassent par le routeur au lieu d'être envoyées
directement au client (problème classique du routage triangulaire).



Il faut peut etre ajouter une regle NAT sur le serveur hébergeant le
proxy squid ?
Avatar
Pascal Hambourg
Pascal Hambourg a écrit :

J'en profite pour rappeler qu'un proxy séparé n'a aucun moyen simple de
connaître l'adresse IP destination d'origine donc le HTTP 1.0 ne
marchera pas car il manque l'en-tête "Host:" contenant le nom de domaine
du site permettant de la retrouver.



Petit correctif : ceci est valable lorsque les connexions HTTP sont
redirigées vers le proxy avec du NAT destination (DNAT). Mais il y a une
autre possibilité : les rediriger avec du routage avancé. En gros on dit
au routeur que les connexions HTTP doivent être routées via le proxy et
non via la connexion internet. Sous GNU/Linux, il faut iptables pour
marquer les paquets concernés avec MARK, et ip (iproute2) pour
configurer le routage des paquets marqués. Il y a plusieurs avantages :
le proxy connaît l'adresse destination d'origine puisque le routeur ne
la modifie pas, et le routeur n'a plus besoin de faire aussi du NAT
source sur les paquets routés vers le proxy. Le LARTC (Linux Advanced
Routing and Traffic Control) howto doit expliquer tout ça.
Avatar
Pascal Hambourg
Cedric a écrit :

J'ai uploadé un fichier avec les règles, ca sera peut etre plus
lisible



Bonne idée, mais ça aurait été encore plus lisible en évitant les
retours à la ligne intempestifs.

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 0 -- br0 br0 0.0.0.0/0 0.0.0.0/0



Bien, on n'a besoin de rien de plus dans la table 'filter', et rien
n'interfère dans la table 'nat'.

Il manque au moins deux choses pour que ça puisse marcher.
1) Exclure l'adresse source du proxy, parce que sinon ça va reboucler.





iptables -t nat -A PREROUTING -i br0 -s 192.168.1.10 -p tcp -m tcp
--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i br0 -s 192.168.1.0/24 -p tcp -m tcp
--dport 80 -j DNAT --to-destination 192.168.1.10:3128

2) NATer l'adresse source des connexions redirigées pour que les
réponses du proxy repassent par le routeur au lieu d'être envoyées
directement au client (problème classique du routage triangulaire).





iptables -t nat -A POSTOUTING -o br0 -s 192.168.1.0/24 -p tcp -m tcp
--dport 3128 -j MASQUERADE

J'oubliais :
3) Il faut que squid soit configuré pour fonctionner en proxy
transparent, ce n'est pas systématique.

Il faut peut etre ajouter une regle NAT sur le serveur hébergeant le
proxy squid ?



Une règle de NAT source sur le proxy ? Non, ça ne marche que sur les
connexions sortantes, pas sur les paquets de réponse sortants d'une
connexion entrante.
Avatar
Pascal Hambourg
[supersedes]

Cedric a écrit :

J'ai uploadé un fichier avec les règles, ca sera peut etre plus
lisible



Bonne idée, mais ça aurait été encore plus lisible en évitant les
retours à la ligne intempestifs.

Chain FORWARD (policy DROP 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
0 0 ACCEPT 0 -- br0 br0 0.0.0.0/0 0.0.0.0/0



Bien, on n'a besoin de rien de plus dans la table 'filter', et rien
n'interfère dans la table 'nat'.

Il manque au moins deux choses pour que ça puisse marcher.
1) Exclure l'adresse source du proxy, parce que sinon ça va reboucler.





iptables -t nat -A PREROUTING -i br0 -s 192.168.1.10 -p tcp -m tcp
--dport 80 -j ACCEPT
iptables -t nat -A PREROUTING -i br0 -s 192.168.1.0/24 -p tcp -m tcp
--dport 80 -j DNAT --to-destination 192.168.1.10:3128

2) NATer l'adresse source des connexions redirigées pour que les
réponses du proxy repassent par le routeur au lieu d'être envoyées
directement au client (problème classique du routage triangulaire).





iptables -t nat -A POSTROUTING -o br0 -s 192.168.1.0/24 -p tcp -m tcp
--dport 3128 -d 192.168.1.10 -j MASQUERADE

J'oubliais :
3) Il faut que squid soit configuré pour fonctionner en proxy
transparent, ce n'est pas systématiquement le cas par défaut.

Il faut peut etre ajouter une regle NAT sur le serveur hébergeant le
proxy squid ?



Une règle de NAT source sur le proxy ? Non, ça ne marche que sur les
connexions sortantes, pas sur les paquets de réponse sortants d'une
connexion entrante.
Avatar
Nicolas Bouthors
Pascal Hambourg nous disait :
REDIRECT ne marche que si le proxy tourne en local sur la passerelle et
non sur une autre machine.



C'est même pour ça que je l'avais mis dans mon post initial :)


--
Nicolas - 06 20 71 62 34 - http://nicolas.bouthors.org/album/
Avatar
Cedric
Bonjour
Merci a tous pour votre coup de main
je vais tenir compte de vos remarques et de vos solutions pour essayer
d'en finir avec mon proxy.

Cordialement

On 11 août, 15:30, Nicolas Bouthors wrote:
Pascal Hambourg nous disait :

> REDIRECT ne marche que si le proxy tourne en local sur la passerelle et
> non sur une autre machine.

C'est même pour ça que je l'avais mis dans mon post initial :)

--
Nicolas - 06 20 71 62 34 -http://nicolas.bouthors.org/album/