Problème de redirection avec Iptables

Forum d'assistance et d'échange sur l'installation, la configuration, et l'utilisation des système Linux et BSD. Vous pouvez y poster vos questions concernant ces systèmes d'exploitation en faisant l'effort préalable de rechercher dans le forum, dans les manuels et les documentations que la réponse n'y figure pas.

Modérateur: modos Ixus

Problème de redirection avec Iptables

Messagepar Pierre-Luc » 19 Juil 2004 01:30

J'ai défini une règle pour Iptables me permettant de rediriger tout le traffic web entrant du port 80 de eth0 de mon firewall vers un serveur web. Cependant, rien ne semble s'être appliqué. Voici cette règle:

Code: Tout sélectionner
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 174.168.101.10:80


Lorsque j'essai de rejoindre le serveur depuis l'adresse externe (donc en passant par la redirection) j'ai le message suivant dans Mozilla:

The connection was refused when attempting to contact 24.226.174.258

Sous Konqueror c'est plutôt:

Un problème est survenu lors du chargement de http://24.226.174.258 :


Impossible de se connecter à 24.226.174.258


Une règle identique avait aussi été ajoutée de manière à rediriger les connections ssh ailleurs sur le réseau. Mais encore une fois il y a problème car j'arrive à me connecter uniquement sur le firewall et non sur le serveur que je désire atteindre.

Dans tout les cas, les règles passées à Iptables ne semblent pas être mises en application. C'est plutôt rageant après tout ce temps à bidouiller...
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar tomtom » 19 Juil 2004 08:24

Il faut en plus autoriser le paquet à traverser le firewall vers la nouvelle addresse..

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 174.168.101.10:80
iptables A FORWARD -p tcp --dport 80 -d 174.168.101.10 -j ACCEPT


et en prenant garde qu'une autre règle ne le bloque pas avant !!!


t.
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Messagepar Pierre-Luc » 19 Juil 2004 14:47

Il n'y a toujours pas de changements même après avoir ajouté cette ligne. Un truc étrange, c'est qu'en inscrivant l'adresse locale du serveur web j'obtiens l'adresse externe du firewall. J'ai d'ailleurs lu un topic semblable sur un forum dont je n'arrive pas à me souvenir de l'adresse. On y disait qu'il y avait nécessairement une "reverse translation" et qu'il fallait ainsi charger au moins les modules ip_table et ip_conntrack. Cependant ce ip_conntrack n'est pas trouvé quand j'exécute un "modprobe".
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar Pierre-Luc » 20 Juil 2004 05:02

Après plusieurs versions de mon script, voici une version minimale d'essai pour la redirection et autres. Mais je n'obtiens toujours pas de changements...

10.10.10.1 ---> gateway
10.10.10.2 ---> serveur web
1.2.3.4 ---> IP externe
Code: Tout sélectionner
#!/bin/sh
NORMAL="tput sgr0"
GRASO="\033[1m"
GRASOFF="\033[0m"

VERSION="1.0"
NOM="rc.firewall"

IPTABLES="/usr/sbin/iptables -v"

EXTIF="eth0"
INTIF="eth1"
SWEB="10.10.10.2"
SSH="10.10.10.2"
IPEXT="1.2.3.4"
clear
echo -e "$***------------------------------------IPTABLES-----------------------------------***"

#Etablissement des nouvelles regles
echo -en "\n${GRASO}Etablissement des nouvelles regles\n${GRASOFF}"
${IPTABLES} -P INPUT ACCEPT
${IPTABLES} -F INPUT
${IPTABLES} -P OUTPUT ACCEPT
${IPTABLES} -F OUTPUT
${IPTABLES} -P FORWARD DROP
${IPTABLES} -F FORWARD
${IPTABLES} -t nat -F

#Fermeture de ports specifiques
${IPTABLES} -A INPUT -p tcp --dport 515 -j REJECT
${IPTABLES} -A INPUT -p tcp --dport 21 -j REJECT
${IPTABLES} -A INPUT -p tcp --dport 23 -j REJECT
${IPTABLES} -A INPUT -p tcp --dport 143 -j REJECT
${IPTABLES} -A INPUT -p tcp --dport 443 -j REJECT
${IPTABLES} -A INPUT -p tcp --dport 110 -j REJECT
${IPTABLES} -A INPUT -p tcp --dport 79 -j REJECT

#Pas de reponse au PING
#
echo -e "${GRASO}\nInterdire les reponses aux requetes PING ${GRASOFF}"
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_all
#Pas de reponse de broadcast
#protection contre le Smurf
echo -e "${GRASO}Protection Anti-Smurf ${GRASOFF}"
echo "1" > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
#Initialisation des regles
#
echo 1 >/proc/sys/net/ipv4/ip_forward
echo -en "${GRASO}\nActivation IP MASQUERADING ${GRASOFF}"
${IPTABLES}  -t nat -A POSTROUTING -o eth0 -j MASQUERADE

#Redirection de ports
#
echo -e "${GRASO}Redirection du port 80${GRASOFF}"
${IPTABLES}  -t nat -A PREROUTING -p tcp -d ${IPEXT} --dport 80 -j DNAT --to ${SWEB}
${IPTABLES}  -t nat -A PREROUTING -p tcp -d ${IPEXT} --dport 22 -j DNAT --to ${SWEB}
${IPTABLES}  -t nat -A POSTROUTING -d ${SWEB} -j SNAT --to ${SWEB}
${IPTABLES}  -t nat -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to ${IPEXT}
${IPTABLES}  -A FORWARD -p tcp --dport 80 -d ${SWEB} -j ACCEPT
echo -en "\n${NOM} ${VERSION} complete\n"
echo -e "\n***------------------------------------------------------------------------------***"
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar tomtom » 20 Juil 2004 08:17

Pierre-Luc a écrit:
Code: Tout sélectionner
#Redirection de ports
#
echo -e "${GRASO}Redirection du port 80${GRASOFF}"
${IPTABLES}  -t nat -A PREROUTING -p tcp -d ${IPEXT} --dport 80 -j DNAT --to ${SWEB}
${IPTABLES}  -t nat -A PREROUTING -p tcp -d ${IPEXT} --dport 22 -j DNAT --to ${SWEB}
${IPTABLES}  -t nat -A POSTROUTING -d ${SWEB} -j SNAT --to ${SWEB}
${IPTABLES}  -t nat -A POSTROUTING -s 10.10.10.0/24 -j SNAT --to ${IPEXT}
${IPTABLES}  -A FORWARD -p tcp --dport 80 -d ${SWEB} -j ACCEPT
echo -en "\n${NOM} ${VERSION} complete\n"
echo -e "\n***------------------------------------------------------------------------------***"


Pourquoi fais-tu du source routing ????
avec ces règles, le paquet qui arrive au serveur sera :

ip source : SWEB
ip dest SWEB

il risque pas de pouvoir repondre !!!

La première ligne de postrouting est absolument inutile si le serveur web a une route par defaut pour aller sur internet, ce qui devrait etre le cas...

Quand à la seconde ligne de postrouting, elle sera avantageusement remplacée par
${IPTABLES} -t nat -A POSTROUTING -o ${EXTIF} -j MASQUERADE

qui te permettra de masquer toutes les connexions sortantes, ce qui est pratique quand on n'a qu'une ip publique !
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Messagepar Pierre-Luc » 20 Juil 2004 14:30

tomtom a écrit:Quand à la seconde ligne de postrouting, elle sera avantageusement remplacée par
${IPTABLES} -t nat -A POSTROUTING -o ${EXTIF} -j MASQUERADE

Dans ce cas je peux enveler cette ligne puisque le MASQUERADING est déjà activé.

tomtom a écrit:La première ligne de postrouting est absolument inutile si le serveur web a une route par defaut pour aller sur internet, ce qui devrait etre le cas...


Le serveur web connaît en effet l'adresse de la passerelle et internet fonctionne adéquatement. Donc hop, une ligne de moins !

Maintenant, faudrait-il ajouter cette règle que tu m'as proposé plus haut ?

Code: Tout sélectionner
iptables -A FORWARD -p tcp --dport 80 -d 174.168.101.10 -j ACCEPT


La chaîne FORWARD est affecté à DROP en début de script. Il va donc de soit d'intégrer cette ligne, non ?
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar tomtom » 20 Juil 2004 15:58

Bien sur, il faut autoriser ce transfert !

D'autre part, INUPT en policy ACCEPT n'est pas une bonne idee !

Et aussi, dans le sens LAN -> WAN, ca ne doit pas marcher la ???


Il te faut :

iptables -A FORWRD -i $INTIF -o $OUTIF -j ACCEPT (par exemple, pour tout autoriser par la) et
iptables -A FORWRD -m state --state ESTABLISHED, RELATED -j ACCEPT


pour pouvoir surfer depuis le lan !

t.
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Messagepar Pierre-Luc » 20 Juil 2004 16:22

tomtom a écrit:D'autre part, INUPT en policy ACCEPT n'est pas une bonne idee !


Préconises-tu plutôt l'utilisation d'une policy DENY ou REJECT et ensuite autoriser des ports spéfiques ?

Et aussi, dans le sens LAN -> WAN, ca ne doit pas marcher la ???


Ça ne devrait pas fonctionner en raison de INPUT en policy ACCEPT ?
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar tomtom » 20 Juil 2004 18:00

Bien evidemment, il faut bloquer ce qui entre par defaut, sinon le firewall ne sert pas a grand chose !

Pour la seconde question, je pesne qut tu confonds INPUT et FORWARD, je te renvoie a http://christian.caleca.free.fr/netfilter pour ceci.
La reponse est non, ca n'a rien a voir....


t.
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Messagepar Pierre-Luc » 20 Juil 2004 19:07

Pour cette deuzième question, ça va. J'avais mal compris ce que tu disais.
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar Pierre-Luc » 20 Juil 2004 22:28

J'ai monté cet autre script cette après-midi en me basant sur les infos du liens proposé plus haut. Une petit rafraîchissement des notions d'Iptables ne fait pas de tord... Mais voilà, toujours et encore rien, RIEN. J'en ai vraiment marre... Si l'on pouvait me donner un script de firewall avec les fonctions de redirection, j'en serais réjouï.

1.2.3.4 --> Internet
10.10.10.1 --> passerelle
10.10.10.2 --> serveur web

Code: Tout sélectionner
#!/bin/sh

IPTABLES="/usr/sbin/iptables"

${IPTABLES} -F
${IPTABLES} -X

${IPTABLES} -P INPUT DROP
${IPTABLES} -P OUTPUT DROP
${IPTABLES} -P FORWARD DROP

${IPTABLES} -t nat -F
${IPTABLES} -t nat -X

${IPTABLES} -t nat -P PREROUTING ACCEPT
${IPTABLES} -t nat -P POSTROUTING ACCEPT
${IPTABLES} -t nat -P OUTPUT ACCEPT

${IPTABLES} -t mangle -F
${IPTABLES} -t mangle -X

${IPTABLES} -t mangle -P PREROUTING ACCEPT
${IPTABLES} -t mangle -P POSTROUTING ACCEPT
${IPTABLES} -t mangle -P INPUT  ACCEPT
${IPTABLES} -t mangle -P OUTPUT ACCEPT
${IPTABLES} -t mangle -P FORWARD  ACCEPT

#Requetes en local acceptees
${IPTABLES} -A INPUT -i lo -j ACCEPT
${IPTABLES} -A OUTPUT -o lo -j ACCEPT

#Requetes du reseau acceptees
${IPTABLES} -A INPUT -i eth1 -j ACCEPT
${IPTABLES} -A OUTPUT -o eth1 -j ACCEPT

${IPTABLES} -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
${IPTABLES} -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT

#Acces SSH localement
${IPTABLES} -A INPUT -p tcp --dport ssh -i eth0 -j ACCEPT
${IPTABLES} -A OUTPUT -p tcp --sport ssh -o eth0 -j ACCEPT

${IPTABLES} -A INPUT -p icmp -m state --state RELATED -j ACCEPT

#Masquage du LAN
${IPTABLES} -t nat -A POSTROUTING -s 10.10.10.0/24 -o eth0 -j MASQUERADE

#Redirection vers le serveur web
${IPTABLES} -t nat -A PREROUTING -d 1.2.3.4 -p tcp --dport 80 -j DNAT --to 10.10.10.2:80

#Permettre les paquets TCP publiques à destination du port 80 de traverser le firewall
${IPTABLES} -A FORWARD -i eth0 -o eth1 -p tcp --destination-port 80 -m state --state NEW,ESTABLISHED -j ACCEPT
${IPTABLES} -A FORWARD -o eth0 -i eth1 -p tcp --source-port 80 -m state --state ESTABLISHED -j ACCEPT

#ip_forward
echo 1>/proc/sys/net/ipv4/ip_forward


Un peu plus propre, mais toujours non fonctionnel.

P.S. Les trucs concernant la table mangle sont inutiles pour le moment.
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar le_rasta » 26 Juil 2004 12:00

salut :D

Pour ta commande, pour la redirection web :
Code:
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 174.168.101.10:80

Je pense qu'il fodrai ke tu essaye avec ton interface web et non locale, donc plutot genre

iptables -t nat -A PREROUTING -p tcp --dport 80 -i ppp0 -j DNAT --to 174.168.101.10:80
ou
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j DNAT --to 174.168.101.10:80

Selon comment tu a configurer ta box .

c'est juste une supposition ... :o

Ciaooo tt le monde :)
Open Source POWA !
le_rasta
Matelot
Matelot
 
Messages: 9
Inscrit le: 26 Juil 2004 05:38

Messagepar tomtom » 26 Juil 2004 15:56

Pierre-Luc a écrit:
Code: Tout sélectionner
${IPTABLES} -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT
${IPTABLES} -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT



Hum, pourquoi 2 fois la meme ligne ?
le state ne sert a rien si tu prends tous les etats.
Si tu autorises tout dans ce sens, ce sera :
Code: Tout sélectionner
${IPTABLES} -A FORWARD -i eth1 -o eth0 -m state --state NEW,ESTABLISHED,RELATED -j ACCEPT


Code: Tout sélectionner
${IPTABLES} -A FORWARD -o eth0 -i eth1 -p tcp --source-port 80 -m state --state ESTABLISHED -j ACCEPT

A priori, cette ligne est inutile puisqie plus haut tu autorises tout a sortir !



Bon, sinon ca a l'air tout bien.

es-tu sur que le serveur fonctionne en local ?
d'ou fais tu tes tests ? de l'exterieur, ou de l'interieur en utilisant l'ip publique ?
Dans le second cas, verifie que tu n'as pas active les protections antispoofing (*rp_filter*)

sinon, n'as-tu pas quelquechose dans la conf du seveur web qui n'autorise que le reseau local ?



t.
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Messagepar Pierre-Luc » 26 Juil 2004 21:37

tomtom a écrit:es-tu sur que le serveur fonctionne en local ?
Oui, j'en ai la confimation sous mes yeux.

d'ou fais tu tes tests ? de l'exterieur, ou de l'interieur en utilisant l'ip publique ?


Sur mon réseau local en utilisant l'adresse qui m'a été attribuée par mon FAI.

Dans le second cas, verifie que tu n'as pas active les protections antispoofing (*rp_filter*)


un
Code: Tout sélectionner
cat /proc/sys/net/ipv4/conf/all/rp_filter
me renvoie 0

Maintenant je ne sais trop quelles modifications du script présenté plus haut font en sorte que le LAN n'a plus accès à internet. J'ai donc du mettre un autre script temporaire question de naviguer sur google.

Le problème que j'éprouve semble s'être produit pour un petit nombre de gens, mais sa résolution demeure tout de même ardue... faut voir ce qui cloche, c'est pas cette petite ligne qui est compliquée !
Vous pouvez nous faire part de votre experience avec Linux en participant sur notre site.
Pierre-Luc
Second Maître
Second Maître
 
Messages: 29
Inscrit le: 24 Avr 2004 14:06

Messagepar tomtom » 27 Juil 2004 08:22

le test depuis un reseau local ne peut pas fonctionner !!!

Imagine :

ton pc client emet une requete :
ip source : 10.10.10.1
ip dest : 1.2.3.4
port source xx
port dest 80
SYN

le ipcop modifie au prerouting...
ip source 10.10.10.1
ip dest 10.10.10.2
port source xx
port dest 80
SYN

(ne pas oublier que le DNAT ne change pas les ports, ce n'est pas du masquerading !)

le serveur web repond, bien sur, directement au client !
ip source 10.10.10.2
ip dest 10.10.10.1
port source 80
port dest xx
SYN, ACK

et le client ne coprend pas du tout !!!
Si tu fais l'effort de mettre un sniffer, tu verras qu'il renvoie probablement un RST ou unFIN au serveur web pour lui dire de se calmer.


Ploum, bref, soit tu testes depuis l'exterieur proprement (avec un proxy... ? un poste d'un pote, au boulot...), soit tu rajoutes une règle stupide de source nat pour que toute la com passe par ipcop.

Code: Tout sélectionner
iptables -t nat -A POSTROUTING -p tcp --dport 80 -d 10.10.10.1 -j SNAT --to IP_green_IPCop


Caz a déja été dit, ce n'est pas une tres bonne chose pour le reseau, mais pour un test ca devrait marcher...

Pour les problèmes de com sortante, je vois pas..


t.
One hundred thousand lemmings can't be wrong...
Avatar de l’utilisateur
tomtom
Amiral
Amiral
 
Messages: 6035
Inscrit le: 26 Avr 2002 00:00
Localisation: Paris

Suivant

Retour vers Linux et BSD (forum généraliste)

Qui est en ligne ?

Utilisateur(s) parcourant actuellement ce forum : Aucun utilisateur inscrit et 1 invité

cron