[ IPTABLES ] iptables & squid pb redirection

Fermé
lisulana - 5 avril 2007 à 10:40
 Khoufou - 28 janv. 2009 à 16:47
Bonjour a tous ,

J'ai un probleme sur lequel je penche depuis maintenant de longues journées , je suis novice et je n'arrive pas a le resoudre , je vais peter un cable surtout qu'il me le faut ABSOLUMENT .

j'ai ecrit mes regles netfilter . je vais vous les donner ci-dessous. tout marchait correctement (mis a part les translation d'adresse ) . je dois installer un proxy et j'ai mis squid .

il faudrait que je le rende transparent avec la redirection de port . hors cela ne fonctionne pas . j'ai beau bloquer le port 80 , le client accede toujours a internet . donc je suppose que je le bloque mal ...

voici mes regles de firewall :

tout d'abord je tiens a vous preciser que ETH2 c'est internet , eth0 et eth1 sont 2 reseaux locaux que je separe avec le routeur/firewall/proxy (ils sont tous sur le meme poste)

#!/bin/sh
#modules a charger
modprobe ip_tables
modprobe ip_conntrack
modprobe iptable_nat
modprobe iptable_filter
modprobe ip_nat_ftp
modprobe ip_nat_irc
modprobe ip_conntrack_ftp
modprobe ip_conntrack_irc

#initialisation de la table filter , flush des regles existantes et suppression des chaines eventuellement crées
iptables -F
iptables -X


#initialisation de la table nat ,flush des regles existantes et suppression des chaines eventuellement crées
iptables -t nat -F
iptables -t nat -X


#regles par defaut, on refuse tout ce qui sort (en local) , en entrée et en traversée du firewall; on rajoutera les regles desirées apres, on commence par tout interdire puis autoriser
iptables -P OUTPUT DROP
iptables -P INPUT DROP
iptables -P FORWARD DROP
#iptables -t nat -P PREROUTING DROP
#iptables -t nat -P POSTROUTING DROP
#iptables -t nat -P OUTPUT DROP

-- G du commenter les regles par defaut de la table nat car sinon ca ne fonctionnait pas .. encore un mystere pour moi --

#configuration de la passerelle pour le NAT
#iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 10.22.202.50

-- la regles de nat fonctionne a condition que les regles par defaut du nat soit commenter (donc accepter) --

#configuration pour la redirection des requetes http sur le port 80 pour qu'elles passent par le proxy qur le port 3128
iptables -A OUTPUT -o eth1 -p tcp --destination-port 80 -j DROP
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

--voila les regles que j'ai mis pour la redirection ... mais cela ne fonctionne pas ; j'ai essayer de drop le port 80 mais ce passe toujours --

#on active le forwarding ipv4, par defaut normalement le noyau est configurer pour autoriser le routage
echo 1 > /proc/sys/net/ipv4/ip_forward

#communication des processus locaux par l'interface locale, on suppose que la machine est sure
iptables -A INPUT -i lo -j ACCEPT
iptables -A OUTPUT -o lo -j ACCEPT

#Les connexions deja etablie sont acceptées
iptables -A INPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A OUTPUT -m state --state ESTABLISHED -j ACCEPT
iptables -A FORWARD -m state --state ESTABLISHED -j ACCEPT

#icmp , les interfaces des 2 réseaux locaux ping le firewall
iptables -A INPUT -p icmp -j ACCEPT

#icmp , les 2 réseaux locaux se ping
iptables -A FORWARD -p icmp -j ACCEPT

#icmp , le firewall ping eth1 , mais l'icmp est refusé en direction de eth0
iptables -A OUTPUT -o eth1 -p icmp -j ACCEPT
iptables -A OUTPUT -o eth0 -p icmp -j REJECT --reject-with icmp-host-prohibited

-- la regles de icmp reject c'est juste pour un test --

#ouverture des ports DNS
iptables -A FORWARD -o eth2 -p udp --dport 53 -j ACCEPT
iptables -A FORWARD -o eth2 -p tcp --destination-port 53 -j ACCEPT
iptables -A OUTPUT -o eth2 -p udp --destination-port 53 -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --destination-port 53 -j ACCEPT

#on autorise les requetes HTTP sur les interfaces
iptables -A INPUT -i eth1 -p tcp --destination-port 3128 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --destination-port 3128 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --destination-port 3128 -j ACCEPT
iptables -A FORWARD -i eth0 -p tcp --destination-port 3128 -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --destination-port 80 -j ACCEPT
iptables -A FORWARD -o eth2 -p tcp --destination-port 80 -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --destination-port 443 -j ACCEPT
iptables -A FORWARD -o eth2 -p tcp --destination-port 443 -j ACCEPT

-- je pense qu'au niveau de ces regles pour acceder au web doit y avoir des erreurs ... --

#on va logger ce qui ne passe pas
iptables -N logNdrop
iptables -A logNdrop -j LOG --log-prefix "! iptables DROP :"
iptables -A logNdrop -j DROP

#tout ce qui est DROP , apparait dans les logs visibles dans /var/log/messages
iptables -A FORWARD -j logNdrop >> /var/log/messages
iptables -A INPUT -j logNdrop >> /var/log/messages
iptables -A OUPUT -j logNdrop >> /var/log/messages


voici la config de mon squid :

#Default:
http_port 3128

hierarchy_stoplist cgi-bin ?
acl QUERY urlpath_regex cgi-bin \?
no_cache deny QUERY

cache_mem 64 MB

cache_swap_low 75
cache_swap_high 95

maximum_object_size 4096 KB

cache_dir ufs /var/spool/squid 1000 16 256

cache_access_log /var/log/squid/access.log

cache_log /var/log/squid/cache.log

cache_store_log /var/log/squid/store.log

dns_nameservers 172.16.0.150

hosts_file /etc/hosts

redirect_children 4

refresh_pattern ^ftp: 1440 20% 10080
refresh_pattern ^gopher: 1440 0% 1440
refresh_pattern . 0 20% 4320

#Recommended minimum configuration:
acl reseausabrina src 192.168.52.0/255.255.255.0
acl reseaunicolas src 192.168.51.0/255.255.255.0
acl all src 0.0.0.0/0.0.0.0
acl manager proto cache_object
acl localhost src 127.0.0.1/255.255.255.255
acl to_localhost dst 127.0.0.0/8
acl SSL_ports port 443 563 # https, snews
acl SSL_ports port 873 # rsync
acl Safe_ports port 80 # http
acl Safe_ports port 21 # ftp
acl Safe_ports port 443 563 # https, snews
acl Safe_ports port 70 # gopher
acl Safe_ports port 210 # wais
acl Safe_ports port 1025-65535 # unregistered ports
acl Safe_ports port 280 # http-mgmt
acl Safe_ports port 488 # gss-http
acl Safe_ports port 591 # filemaker
acl Safe_ports port 777 # multiling http
acl Safe_ports port 631 # cups
acl Safe_ports port 873 # rsync
acl Safe_ports port 901 # SWAT
acl purge method PURGE
acl CONNECT method CONNECT

#Recommended minimum configuration:
#
# Only allow cachemgr access from localhost
http_access allow manager localhost
http_access deny manager
# Only allow purge requests from localhost
http_access allow purge localhost
http_access deny purge
# Deny requests to unknown ports
#http_access deny !Safe_ports
#on donne l'acces HTTP
http_access allow reseaunicolas
http_access allow reseausabrina
http_access allow localhost
http_access deny all
http_reply_access allow all

httpd_accel_with_proxy on
httpd_accel_uses_host_header on
httpd_accel_host virtual
httpd_accel_port 80

coredump_dir /var/spool/squid



voila toutes les ligne qui ne sotn pas commentées ..

merci de m'aider faut vraiment que j'y arrive !! :'(

1 réponse

Salut:

Remplace:

http_port 3128

Par

http_port 3128 transparent


D'autre part:

#iptables -t nat -P PREROUTING DROP
#iptables -t nat -P POSTROUTING DROP
#iptables -t nat -P OUTPUT DROP

-- G du commenter les regles par defaut de la table nat car sinon ca ne fonctionnait pas .. encore un mystere pour moi --

Ne change pas la policy sur le Nat

Change:

#iptables -t nat -A POSTROUTING -o eth2 -j SNAT --to-source 10.22.202.50

Par:

iptables -t nat -A POSTROUTING -o eth2 -j MASQUERADE

(equivalent a ton "to-source", mais si tu n'as qu'un accès Internet, laisse netfilter choisir lui meme l'@ source de sortie).

Les règles suivantes ne servent à rien à part aurotiser l'accès *explicite* au proxy (regles avec dport 3128). Les autres autorisent le flux 80 et 443 vers le LAN, ce qui est faux, il faut en fait mettre le *source port* au lieu du destination port. Les serveurs répondent *depuis* les ports 80/443.


iptables -A INPUT -i eth1 -p tcp --destination-port 3128 -j ACCEPT
iptables -A FORWARD -i eth1 -p tcp --destination-port 3128 -j ACCEPT
iptables -A INPUT -i eth0 -p tcp --destination-port 3128 -j ACCEPT
iptables -A FORWARD -i eth0 -p tcp --destination-port 3128 -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --destination-port 80 -j ACCEPT
iptables -A FORWARD -o eth2 -p tcp --destination-port 80 -j ACCEPT
iptables -A OUTPUT -o eth2 -p tcp --destination-port 443 -j ACCEPT
iptables -A FORWARD -o eth2 -p tcp --destination-port 443 -j ACCEPT


Je te conseillerais plutot les règles suivantes pour OUTPUT:

iptables -F OUTPUT
iptables -P OUTPUT ACCEPT

En gros: supprime tout ce qui a trait à OUTPUT. Cette chaine n'est utilisée *que* pour les flux en *provenance* du firewall, donc, généralement, on accept que le firewall sorte avec ce qu'il veux.

Pour autoriser donc un accès *explicite* et transparent en meme temps:

iptables -A INPUT -i eth0 -p tcp --destination-port 3128 -j ACCEPT
iptables -A INPUT -i eth1 -p tcp --destination-port 3128 -j ACCEPTiptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128

Met par contre:
iptables -A FORWARD -i eth1 -p tcp --destination-port 443 -j ACCEPT
iptables -A FORWARD -i eth2 -p tcp --destination-port 443 -j ACCEPT

Histoire de faire du HTTPS en direct sans passer par le proxy. Dur de cacher du flux crypté.
1