DEB9 Iptables/squid3, règles qui ne fonctionnent pas

Bonsoir,
Au travail, nous avions un vieux P4, qui faisait office de serveur web local, proxy et DNS. Il existait avant mon arrivée dans l’établissement. Ce matin, le disque a lâché, le système ne parvient plus à monter les partitions.

Je l’ai donc remplacé par un i3, sous Debian 9, avec serveur web (pour les applications locales), squid3 (pour le proxy) et bind9 (pour utiliser des NDD pour accéder aux applications locales).

J’avais ufw activé, j’ai ouvert les ports nécessaires, squid3 marche bien, avec un PC teste, il y a accès à internet en configurant le proxy sur le navigateur et pas d’accès en l’enlevant.

Il restait une dernière chose à faire pour que le nouveau serveur soit opérationnel comme l’ancien, ajouter des règles iptables pour laisser quelques adresses IP contourner squid3.

J’ai donc ajouté ceci:
iptables -t nat -A PREROUTING -s adresse_IP -j ACCEPT

Le PC teste est sensé avoir internet sans config proxy sur le navigateur, mais ça ne marche pas.

Remplacer -A par -I (vu sur des forums) n’a rien changé
Sur des pages web ils disent que ça ne marche qu’avec un proxy transparent, or, le vieux P4 n’était pas configuré en mode transparent, et pourtant, on pouvait ajouter des adresses IP locales pour contourner squid.

D’ailleurs je voulais le rendre transparent, et même dans ce cas, le mode transparent ne marche pas, vu sur un tuto:
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Dans mon cas, j’ai remplacé eth0 par enp1s0, car sous deb9, les interfaces réseaux ont été renommés.

J’ai aussi remplacé le port 80 par 443; puis j’ai désactivé ufw pensant qu’il entrait en conflit avec iptables;

Conclusion, rien n’y fait, les règles iptables ne sont pas pris en compte.

Une idée s’il vous plait?

Merci

1 J'aime

Bonjour,
Ma question va te paraître stupide, mais tu as bien installé Debian Stretch, qui est la «oldstable» ?

L’ordinateur est sous debian 9.4.

Juste pour éliminer le changement IPtables par NFtables dans Buster, mais c’était une mauvaise piste.
J’aurais aimé pouvoir t’aider, mais mes maigres compétences sont, déjà, dépassées.
Si cela fonctionnait, qu’est ce qui a changé ?
Les versions de squid3, de bind9, de ufw, IPv4/IPv6, des reliquats de configuration, etc.

Ban la règle que tu veux mettre ACCEPT sur une ip source doit effectivement se retrouver avant la règle de REDIRECT vers le 3128 du proxy transparent, donc il faudrait voir dans iptables-save dans quel ordre sont classé les règles.
D’ailleurs la sortie de cette commande searit bien pratique.

C’est d’ailleurs bizarre que tu ne parles que aprés tes contournements du probléme de proxy transparent qui ne marche pas, c’est le premier truc à faire marcher, avant de commencer avec les exceptions.
Ca serait utile de comprendre comment est organisé ton réseau:

  • comment sont attribuées les routes (dhcp ?)
  • est ce que ton proxy est aussi le routeur et est ce que tu as activé le forward, pour les machines qui ne passent pas par squid ?
  • au fait, est ce que ton serveur accède au net correctement ?

C’est à dire ?
Il se passe quoi et où ?

Comment ça, contourner squid ? Si ce n’est pas un proxy transparent, il n’y a aucun besoin de le contourner, il suffit de ne pas l’utiliser.

@mattotop
Bonjour, pour l’instant il n’y a aucune règle iptables, les deux que je veux mettre, c’est (proxy transparent) et (exception de certaines IP pour contourner squid)

J’ai effectivement pensé que l’ordre avait une importance, j’avais donc essayé les règles citées plus haut individuellement, mais ça ne marchait pas ( = le PC de teste ne se connecte pas à internet)

le serveur est bien connecté à internet, et les PC du réseau aussi.

Comment est organisé le réseau?

@PascalHambourg Bonjour, ceci peut répondre à ta question (pourquoi il faut mettre une règle de contournement)

Il y a un modem VDSL (192.168.1.1), relié par un câble ethernet au nouveau serveur local (qui fait office de proxy et dns), sur l’interface enp4s0, sous l’adresse 192.168.1.3, puis, un câble ethernet sortant de la seconde carte réseau enp1s0 avec l’adresse 192.168.0.251, vers un switch Dlink 24 ports puis, une suite de cascade vers d’autres switchs 24 ports.

Les adresses IP des PC de l’entreprise sont configurées manuellement dans les paramètres réseaux Windows. Adresses 192.168.0.xx, passerelle par défaut 192.168.0.251

Aucun PC n’a par conséquence la possibilité d’avoir internet en passant directement par le modem, le 192.168.1.1 est invisible, alors sans la configuration proxy sur le navigateur et sans la configuration sur la carte réseau des PC, les utilisateurs n’ont rien.

L’ancienne machine fonctionnait comme ça, et la nouvelle aussi maintenant, seulement, sur l’ancienne pour certains PC, je pouvais via un fichier .sh qui contenait la règle iptables (que je n’ai pas retenu hélas), d’ajouter des adresses IP, d’executer le .sh et ces adresses pouvaient avoir internet sans configuration du proxy dans le navigateur, et ne sont pas visibles sur les log de squid (que j’exploitait avec lightsquid si vous connaissez)

avec cette commande, je pouvais lister les adresses d’exception, qui ont un accès total, sans restriction proxy, sans log etc.
iptables -t nat -L

Maintenant, ce que je cherche à faire:

1- Avoir la possibilité d’exempter certaines adresses de passer par squid comme sur l’ancien serveur, ils auront toujours une adresse de type 192.168.0.xx, c’est obligé, mais squid ne prend pas en charge leur requêtes (c’est surtout à cause du blocage du FTP, les informaticiens ne parviennent pas à utiliser les clients FTP à travers squid, même certaines autres applications)

2- C’est facultatif, puisque le proxy fonctionne, mais ça m’aiderait de le rendre transparent, juste pour éviter à chaque fois qu’on reçoit un groupe, ou en cas de changement de PC, de configurer leur navigateur chrome ou autre pour introduire l’adresse et le port du proxy, c’est surtout pour avoir du boulot en moins.

J’ai fait un schéma sur comment c’était avant:

Untitled%20Diagram

J’espère que vous y voyez plus clair, sinon vous pouvez toujours me demander.

Ouais. La machine n’est pas seulement un proxy mais aussi un routeur avec NAT. Il manque toute la partie routeur avec NAT.
Il faut activer le routage IP (sysctl net.ipv4.ip_forward=1) et le SNAT/MASQUERADE d’iptables sur l’interface externe. Ensuite il faut accepter/bloquer le trafic sortant dans la chaîne FORWARD en fonction de l’adresse IP source.

1 J'aime

Non, ce que tu décris garantit juste qu’aucun PC n’ai la possibilité d’atteindre le net sans passer par ton routeur/serveur, mais l’impossibilité à atteindre le net dépend totalement de comment sont configuré ces PC et surtout ton routeur/serveur.
Actuellement justement, comme tu n’as rien activé en matière de routage au niveau de ton serveur (ce que dit @PascalHambourg), ton routeur ne retransmet aucun paquet nulle part venant de l’intérieur, il bloque tout.
C’est tant mieux, il n’y a pas besoin de ça pour faire fonctionner le squid transparent, avant de se préoccuper de faire des exceptions d’ip.
Tu pourrais déjà vérifier, sans être aussi péremptoire quant au fait qu’il n’y ai rien, ce que rend ton iptables-save, juste pour vérifier qu’il est bien vide, comme tu le prétends (il y a tellement de trucs qui peuvent jouer avec on ne sait jamais).
Puis, tu n’as pas dit si tes clients sur le réseau arrivaient à utiliser le squid pour surfer sur internet, il faut vérifier ça en configurant le proxy sur un client.
Si ça marche, transparent, je cite https://www.stux6.net/unix/linux/proxy-transparent-linux-squid:

Si vous utilisez une version de SQUID > 2.6

http_port :3128 transparent
Si vous utilisez une version plus ancienne de SQUID

httpd_accel_host virtual
httpd_accel_port 80
httpd_accel_with_proxy on
httpd_accel_uses_host_header on
et autorisez les utilisateurs du réseau a utiliser le proxy en utilisant la variable http_access

http_access allow all
Nous verrons par la suite comment parametrer les applications …

PUIS
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-port 3128
Où tu remarqueras que ça ne suit plus le tuto, puisque je n’ai mis aucun -i pour capter tout les ports 80 sur toutes les interfaces.
Là, normalement, si tes PC ont bien comme gateway 192.168.1.3 et savent interroger un dns situé à l’intèrieur du LAN, le web fonctionnera pour elles, mais pas le reste.
Maintenant, les exceptions.
Si ça fonctionne en proxy transparent (ce que je t’ai indiqué jusqu’ici), alors, tu pourras faire tes exceptions, avec la règle en -I
Mais ça veut juste dire que tu pourras dire à ces machines de ne pas utiliser squid, ça ne leur donnera pas accés à internet si tu ne fais pas ce qu’à indiqué @PascalHambourg.
Et une fois que tu auras mis le MASQ en place, ça veut dire qu’indépendament du port 80 que ton routeur va choper et rediriger sur le squid, toutes tes machines auront accés complet au net pour toutes les autres utilisations du réseau (se connecter à un proxy à eux sur le port 8080, faire des sessions ssh, installer un tunnel openvpn pourb être complètement libre, etc…

@mattotop
Avant de vous répondre, ce que vous avez cité plus bas et bien le tuto que j’ai suivi

Commençons par décortiquer votre réponse:

Non, ce que tu décris garantit juste qu’aucun PC n’ai la possibilité d’atteindre le net sans passer par ton routeur/serveur, mais l’impossibilité à atteindre le net dépend totalement de comment sont configuré ces PC et surtout ton routeur/serveur.

Il s’agit bien de ça, aucun PC ne peut avoir internet sans passer par le proxy

Actuellement justement, comme tu n’as rien activé en matière de routage au niveau de ton serveur (ce que dit @PascalHambourg), ton routeur ne retransmet aucun paquet nulle part venant de l’intérieur, il bloque tout.
C’est tant mieux, il n’y a pas besoin de ça pour faire fonctionner le squid transparent, avant de se préoccuper de faire des exceptions d’ip.

C’est peut être pour cela que les règles ne marchent pas, d’ailleurs j’ai refait un teste, après avoir lu la réponse de @PascalHambourg , j’ai activé le routage, puis j’ai réinséré la règle pour le mode transparent, et ça n’a pas marché, lorsque j’ai enlevé la config proxy du navigateur du PC de teste, impossible d’accéder à internet.

Tu pourrais déjà vérifier, sans être aussi péremptoire quant au fait qu’il n’y ai rien, ce que rend ton iptables-save , juste pour vérifier qu’il est bien vide, comme tu le prétends

J’ai qu’il était vide car iptables -L ne retourne aucune règle, de plus je n’ai pas encore paramétré la sauvegarde des règles, donc un reboot supprime tout. Mais toute fois, je vous met ce que retourne iptables-save

root@www:~# iptables-save
# Generated by iptables-save v1.6.0 on Wed Sep  4 13:49:03 2019
*filter
:INPUT ACCEPT [8599851:7115323926]
:FORWARD ACCEPT [18009:975940]
:OUTPUT ACCEPT [9930720:7127717656]
COMMIT
# Completed on Wed Sep  4 13:49:03 2019
# Generated by iptables-save v1.6.0 on Wed Sep  4 13:49:03 2019
*nat
:PREROUTING ACCEPT [16210:917684]
:INPUT ACCEPT [10315:585065]
:OUTPUT ACCEPT [10227:716426]
:POSTROUTING ACCEPT [13741:907022]
COMMIT
# Completed on Wed Sep  4 13:49:03 2019
root@www:~#

Puis, tu n’as pas dit si tes clients sur le réseau arrivaient à utiliser le squid pour surfer sur internet, il faut vérifier ça en configurant le proxy sur un client.

à l’heure où j’écris ces mots, les PC du réseau, arrivent à avoir internet uniquement s’ils configurent le proxy+port sur le navigateur web. Sans ça, ils n’ont accès qu’au réseau local (apache, pour les applications web qui tournent en local), alors oui ça marche, mais ce n’est toujours pas le mode transparent.

Toujours dans la pratique, si un PC du réseau, enlève la configuration de la carte réseau, si la config est mise en automatique pour l’IP, aucune adresse n’est attribuée, je n’ai pas activé de DHCP. En revanche, si elle est mise en mode manuelle, avec comme adresse 192.168.1.xx et la passerelle 192.168.1.1 qui est le modem, le PC n’a ni accès réseau ni accès internet, par conséquent, il n’y a plus aucune autre possibilité que de mettre l’adresse 192.168.0.xx et passerelle 192.168.0.251 (le proxy), pourquoi? Simplement parcequ’il n’y a pas de câble ethernet sortant du modem et allant vers les switch, je parle toujours en pratique, c’est du vécu, si je rajoute un câble du modem vers un port d’un switch, là il sera possible de configurer la carte réseau en passant par le modem comme passerelle et avoir internet sans passer par le proxy, mais ce n’est pas le cas, il n’y a qu’un seul câble qui va vers le serveur proxy.

Pour l’instant, j’ai activé le ip forwarding, mais j’ai supprimé les règles iptables, pour pouvoir comprendre ce qui n’a pas marché et reprendre pas à pas.

Il y a 2 choses distinctes, accèder à internet, et surfer sur internet.
Sur ton PC de test, il est possible que le proxy transparent fonctionne, mais que quand tu fais le test sur ton client, ça ne fonctionne plus parce que ton client ne sait pas résoudre le ndd auquel tu veux accèder (alors que le squid non transparent attaqué en direct, lui, ne s’en préoccupe pas, car c’est le squid qui prend la requête en ndd à sa charge et que lui sait résoudre les adresses).
Bref, premier truc: ton pc de test resoud il bien le nom de domaine que tu veux atteindre en http ?
Un ping <lendd> en ligne de commande sur le win de test devrait te le dire.

@mattotop Personnellement, je fais allusion au fait d’afficher des pages web.

Le PC de teste; est un laptop qui possède la même configuration que tout les autres PC du réseau. Son adresse est 192.168.0.109, j’arrive à surfer le plus normalement du monde, facebook, google, maps etc. mais la commande ping via la console ne marche pas, je crois que c’est normal, elle ne fonctionne pas derrière un proxy.

Oui, mais ce n’est pas ce que je demande:
est ce qu’elle résoud le ndd (et accessoirement elle se met à pinguer sans retour), ou bien est ce qu’elle refuse de pinguer parcequ’elle n’a pas l’ip du ndd ?
Je parlais de ping pour savoir si ton client faisait la résolution, mais je sais que le ping ne peut pas marcher.
Alors ça dit quoi, ça résout ou pas ?

Donc le proxy transparent fonctionne ?
Je ne comprends plus là.

@mattotop ah d’accord, alors oui ça résout, ça m’affiche l’adresse ip entre crochets.

Sauf erreur de ma part, le proxy transparent, veut dire que je n’ai pas à saisir l’adresse hôte du proxy et son port dans les paramètres du navigateur web. Si j’ai bon, alors non, le proxy transparent ne marche pas. Je suis toujours contraint de saisir ces infos dans le navigateur pour surfer. Le mode non transparent, marche, transparent marche pas.

Pour savoir si les paquets passent bien par le proxy, j’ai créé un ACL sur squid, pour bloquer youtube, si youtube ne s’ouvre pas, j sais que les paquets passent par le proxy

J’ai appliqué un autre tuto
sourcelinux.wikidot.com/setting-up-squid-in-gateway-as-a-transparent-proxy

il y a un long script en bas, j’ai tout fait, résultat:

1- Avec proxy je peux surfer, youtube bloqué
2- Sans proxy je peux surfer, youtube accessible

En lisant ce que tu as changé depuis que je t’ai répondu, là ou il y avait une capture, une remarque me vient:

Oui, mais iptables -L implique le -t filter et ne te liste pas les règles de forwarding et autres, si tu ne spécifies pas le -t qui va bien.
Alors qu’iptables-save t’indique toutes les règles.

Tu as bon.

Bon, en tous cas, ça résout, là n’est pas le problème.
Et dans ta config squid, tu as bien les éléments qui sont sensés le rendre transparent, et dans ton iptable-save tu as bien la règle de redirection du port 80 vers 3128, donc ça devrait marcher.
Sauf que j’étais passé à coté de ça:

Et ça:

Non, ça, mettre ces adresses là en gateway, tu ne peux même pas le faire (ou alors windows est bien tolérant), car 192.168.0.X n’est pas sur le même réseau que ton adresse manuelle 192.168.1.xx sur le réseau interne.
Forcément, ça peut pas marcher si tu veux passer par une porte qui est en dehors de la maison fermée.
La bonne gateway, si j’ai bien lu ta config d’interface du serveur/routeur, c’est sa face interne 192.168.1.3

1 J'aime

@mattotop J’ai du nouveau, sur un autre tuto ils demandent d’ajouter “intercept” à coté du port 3128 du fichier de configuration squid. Je l’ai fait puis j’ai saisie dans l’ordre (après avoir vider toutes les règles iptables)

iptables -t nat -A PREROUTING -i enp1s0 -p tcp --dport 80 -j DNAT --to 192.168.0.251:3128
iptables -t nat -A PREROUTING -i enp4s0 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables –t nat -A POSTROUTING --out-interface enp4s0 -j MASQUERADE 

Ensuite, j’ai enlevé la config proxy du navigateur, résultat:

1- Je peux surfer
2- L’acl squid pour bloquer un site http fonctionne, le site est bloqué
3 - l’acl squid pour bloquer un site https (youtube), ne fonctionne pas.

Ce qui veut dire que je passe bien par le proxy, mais uniquement le http qui est redirigé. Normal, je n’ai saisie que le port 80.

Alors j’ai refait l’opération, mais cette fois en ajoutant de nouvelles lignes en remplaçant 80 par 443, tout les sites en http s’ouvrent excepté ceux qui sont bloqués par les règles squid, aucun souci donc, en revanche, tout les sites https ne s’ouvrent pas “ERR_SSL_PROTOCOL_ERROR” que dit chrome.

EDIT:
Après quelques recherches, gérer le https en mode transparent est trop compliqué.
Du coup, ça vaut pas le coup le mode transparent. Je retourne sur le mode non-transparent.

Nous nous sommes focalisés sur le mode transparent, mais e problème qui me reste, c’est les exceptions des adresses IP. Même en mode non-transparent ça marche, puisque ça marchait sur l’ancien serveur.

Là, normalement, l’exception est à mettre dans la chaine nat, en insertion pour être sûr qu’elles passent avant les opération de DNAT et la redirection de port en PREROUTING, et c’est tout, car le MASQUERADE doit s’appliquer même aux exceptions.
Ca doit donner un truc genre:

iptables -t nat -I PREROUTING -i enp1s0 -s<ip> -p tcp --dport 80 -j ACCEPT
iptables -t nat -I PREROUTING -i enp4s0 -d<ip> -p tcp --dport 80 -j ACCEPT

Ceci dit, quel est l’objectif de ce squid ?
Parce que si c’est juste pour bloquer certains sites en http, mettre le squid comme ça n’empêchera pas l’utilisation de contournements faciles, comme proxysite, hidemyass, ou n’importe quelle solution de vpn.

Oui c’est pour restreindre les accès à certains sites, sur l’ancienne machine j’utilisais un dictionnaire de VPN et de proxy en ligne pour les bloquer.

Voici mes testes:
iptables -t nat -I PREROUTING -s 192.168.0.6 -j ACCEPT
En mode transparent => Fonctionne
En mode non-transparent=> Ne fonctionne pas

iptables -t nat -I PREROUTING -i enp1s0 -s 192.168.0.6 -p tcp --dport 80 -j ACCEPT
En mode non-transparent=> Ne fonctionne pas

Je précise que pour revenir au mode non-transparent j’ai dû vider la table nat. J’ignore s’il faut une règle supplémentaire. le MASQUERADE par exemple

J’ai l’impression que tu ne sais pas du tout comment ça marche ni où tu dois aller et que du coup tu fais un peu n’importe quoi. Est-ce que je me trompe ?