SQUID transparent redirection https

Bonjour,

Je possède un Squid sous Debian qui me sert exclusivement à loguer le traffic web des utilisateurs. Nous n’utilisons pas de cache et celui ci est transparent.

Par contre il est impossible de voir les sites en https, il faut savoir que le Squid n’a qu’une seule carte réseau.

Je sais que le https ne peut pas fonctionner avec un transparent mais est il possible de faire une règle pour que tout ce qui arrive du port 443 ne soit pas analyser et rediriger directement vers la gateway ?

J’ai beaucoup de mal avec le firewall, serait il possible de me montrer un exemple.

Mon réseau 192.168.0.0/255.255.255.0
Squid 192.168.0.250
Routeur 192.168.0.240

Merci à vous.

Donne déjà tes règles (script ou sortie d’iptables-save).
Le proxy est défini comme passerelle par défaut sur les postes du LAN ou bien c’est le routeur qui redirige les communications HTTP vers lui ?

Voici mon unique régle:

iptables -t nat -A PREROUTING -s 192.168.0.0/255.255.255.0 -p tcp -m tcp --dport 80 -j REDIRECT --to-ports 3128

J’ai essayé de faire pareil mais avec le 443, cela ne donne rien.

Oui les PC ont comme gateway le squid et le squid repart vers le Cisco après.
Le squid n’a qu’une seule carte réseau.

Il faut configurer la machine en routeur afin que les connexions qui ne sont pas interceptées par le proxy soient retransmises vers le routeur Cisco (ip_forward=1).
Il faut aussi désactiver l’envoi de messages ICMP Redirect (send_redirects=0).

Un grand merci, ca va déja me mettre sur une piste.
Il n’y a que ca à changer ou dois faire plus ?

Désolé pour mes questions mais je débute

/etc/sysctl.conf
net/ipv4/conf/all/send_redirects = 0

/etc/sysctl.conf
net.ipv4.ip_forward = 1

Ca fontionne génial !

Pas d’autres conf à faire ?

Merci à toi :stuck_out_tongue:

Pour un débutant, tu te débrouilles plutôt bien avec mes indications sommaires.

Un mot sur l’ICMP Redirect. Quand la machine retransmet un paquet vers le routeur qui est dans le même réseau que le poste émetteur, normalement elle devrait renvoyer à ce dernier un message ICMP Redirect pour lui signaler qu’il y a une route plus courte pour cette adresse de destination en envoyant directement les paquets suivants au routeur. Ça a l’air plutôt bien dans le principe puisque ça évite un détour inutile, mais il y a un inconvénient : ça concerne tous les paquets envoyés à cette adresse de destination, quel que soit le port. Donc dans le cas de communications en HTTPS (ou autre protocole) puis en HTTP vers un même serveur, les communications en HTTP court-circuiteraient aussi le proxy, ce qui n’est probablement pas souhaitable. Je dois néanmoins préciser que certains OS ignorent les ICMP Redirect par défaut.

Pour désactiver l’envoi d’ICMP Redirect sur une interface, il faut mettre à la fois net/ipv4/conf/all/send_redirects et net/ipv4/conf//send_redirects à 0, alors qu’ils sont à 1 par défaut. Le premier ne suffit pas. On peut modifier la valeur par défaut sur les interfaces en mettant net/ipv4/conf/default/send_redirects à 0 aussi.
Alternativement, on peut ajouter une commande sysctl pour une interface donnée dans une option up dans /etc/network/interfaces.

iface eth0 inet static ... up sysctl net.ipv4.conf.eth0.send_redirects=0
Ou bien, plus radicalement, on peut bloquer ce type ICMP en sortie avec une règle iptables.

Une petite amélioration supplémentaire consisterait à ne pas faire de suivi de connexion sur les paquets routés. En effet les paquets retour ne repassent pas par la machine, ils vont directement du routeur au poste client. Dans cette configuration de routage asymétrique, le suivi de connexion n’a pas de sens. On peut exonérer des paquets du suivi de connexion avec un règle iptables ayant la cible NOTRACK dans la table ‘raw’.

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT iptables -t raw -A PREROUTING -j NOTRACK

C’est parfait, je viens de faire des tests ce matin.

J’ai rajouté également:

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 443 -j ACCEPT iptables -t raw -A PREROUTING -j NOTRACK

Un très grand merci.

Si tu mets ACCEPT pour le port 443, tu laisses le suivi de connexion actif pour les communications en HTTPS, ce qui n’a pas d’intérêt comme je l’ai expliqué. Les seules communications nécessitant le suivi de connexion sont celles en HTTP (port 80) pour que la règle REDIRECT fonctionne.

Effectivement je n’ai pas compris.

Merci de me dire si c’est correct, le ICMP (redirect à 0) va éviter de rediriger mes requètes arrivant en 80 vers le routeur sans etre filtrées.
Le ip_forward=1 lui va permettre au 443 non géré par le proxy d’etre rerouté directement vers le Cisco.

Par contre pour éviter de tracer les paquets que l’on acceoper du 80 on ajoute :

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT iptables -t raw -A PREROUTING -j NOTRACK

Les paquets du 443 étant eux rediriger directement vers le Cisco n’ont pas besoin d’etre marqué comme NOTRACK car ils le sont déja vu qu’aucun filtrage n’est fait sur eux.

Est ce bien ca ?

Merci.

Oui.

Oui, ainsi que les autres ports et protocoles, en fait tout sauf TCP 80. Si ce n’est pas ce que tu souhaites, il faut mettre en place du filtrage dans la chaîne FORWARD.

Il ne s’agit pas de tracer mais de faire du suivi de connexion, qui est indispensable pour que la cible REDIRECT fonctionne.

En fait c’est précisément ceux qu’on a intérêt à marquer avec NOTRACK pour ne pas les suivre, parce que la machine ne verra pas les paquets de réponse. Par défaut tous les paquets sont suivis. Mais pour que le suivi de connexion fonctionne correctement la machine doit voir les paquets aller et retour.

Après relecture, pour bien faire il faudrait un peu modifier mes règles. Ça donnerait, en tout :

[code]# interception des connexion HTTP par le proxy
iptables -t nat -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j REDIRECT --to-ports 3128

suivi de connexion pour les paquets à intercepter

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 80 -j ACCEPT

pas de suivi de connexion pour les autres paquets à router (non destinés à la machine)

iptables -t raw -A PREROUTING ! -d 192.168.0.250 -j NOTRACK

blocage de l’émission d’ICMP redirect (optionnel, si send_redirects pas désactivé)

iptables -t filter -A OUTPUT -p icmp --icmp-type redirect -j DROP[/code]

C’est parfait, j’ai bien compris ton explication. Je pense en avoir fini avec cette demande :slightly_smiling:

Par contre question de nul mais question quand meme

Comment fais-tu pour retirer les 2 lignes que j’ai rajouté ?

iptables -t raw -A PREROUTING -s 192.168.0.0/24 -p tcp --dport 443 -j ACCEPT iptables -t raw -A PREROUTING -j NOTRACK

Si je fais cette commande, je peux voir les lignes en trop :

J’ai lu la commande iptables -D FORWARD (num de la chaine) mais je n’y arrive pas
Elles sont en 3 et 4, j’ai donc voulu faire:

Merci

Le plus simple est de remplacer -A par -D.
Sinon, on vide toute la chaîne (iptables -t raw -F PREROUTING) et on recrée les règles.
D’ailleurs dans un script de création de jeu de règles, il est recommandé de réinitialiser les chaînes (cf options -P, -F, -X dans la page de manuel d’iptables) avant d’ajouter les règles à mettre en place.

Un grand merci pour l’aide que j’ai pu obtenir.

bonsoir,
je serai intéressé par votre mode de fonctionnement
je suis quasiment dans la même configuration que bartoch
sauf que je possède deux cartes réseaux, quant à l’os c 'est du ubuntu
et je n’arrive pas à faire du https
novice sous unix

un aperçu de mon squid.conf:

visible_hostname xxxxx
########
always_direct allow all
ssl_bump allow all
# transparent pour eviter de passer sur les postes
http_port 3128 intercept 
#https_port 3129 intercept ssl-bump generate-host-certificates=on dynamic_cert_mem_cache_size=4MB cert=/etc/pki/squid/proxy.pem key=/etc/pki/squid/proxy.key
ssl_bump server-first all
# Changer la taille du cache de squid, changer la valeur 100 par ce que vous voulez (valeur en Mo)
cache_dir ufs /var/spool/squid 100000 16 256
#################################### ACL ####################################
#acl all src all # ACL pour autoriser/refuser tous les réseaux (Source = All) – ACL obligatoire
acl lan src 192.168.1.0/16 # ACL pour autoriser/refuser le réseau
acl Safe_ports port 80
#acl Safe_ports port 443
acl Safe_ports port 8080
acl Safe_ports port 777
acl Safe_ports port 1025-65535
#acl SSL_ports port 443
acl CONNECT method CONNECT

############################################################################
# Désactiver tous les protocoles sauf les ports sures
http_access deny !lan
http_access deny !Safe_ports
http_access deny CONNECT !SSL_ports
#déclarer un fichier qui contient les domaines à bloquer
acl deny_domain url_regex -i "/etc/squid/denydomain.txt"
#refuser les domaines decclare dans le fichier
http_access deny deny_domain
###########################################################################
#acl horraire time S M T W H F A 08:00-21:45
#http_access allow horraire
####releve d'adresse mac
eui_lookup on
logformat squid %{%Y/%m/%d:%H:%M:S}tl %6tr %>eui %>a %Ss/%03>Hs %<st %rm %ru %un %Sh/%<A %mt
#mac_log /var/log/squid/mac.log maclog
#####afficher l'ip
forwarded_for on
dns_v4_first 

l 'ip forward est à 1
et voici ma régle iptables :slight_smile:

iptables -t nat -A PREROUTING -s 192.168.1.0/24 -p tcp --dport 80 -j REDIRECT --to-port 3128 

Merci de votre aide

ce qui apparait en gras dans le squid.conf c’est en commenatire

Bonsoir

Je me suis permis de modifier, dans ton message, la présentation de certains blocs de texte.

Après avoir collé un bloc de texte de ce genre dans un message du forum
mets une ligne vide avant et après le bloc de lignes collées,
ensuite, tu sélectionnes le tout (avec les lignes vides avant et après le bloc),
et tu cliques sur l’icône </>

1 J'aime

Ok merci

SVP
merci