OVH Cloud OVH Cloud

[PF] rdr sans nat ?

8 réponses
Avatar
Nicolas Ecarnot
Bonjour,

J'ai un réseau sans NAT, avec un serveur qui reçoit d'internet des requêtes
http et apache qui s'en charge.
Je voudrais configurer le pf de ce serveur pour établir une redirection
vers un autre serveur, de sorte à soulager le serveur d'entrée.

J'ai écris ça en vain:
rdr on $ext_if proto tcp from any to any port 80 -> $ip_autre_serveur

mais je ne parviens pas à comprendre si je dois utiliser du nat pour que ça
marche ?
Puis-je simplement mettre en place une redirection de port, sans nat ?
Si oui, pf se chargera-t-il de transmettre la réponse aux requêtes, ou
dois-je rajouter des règles ?

--
Nicolas Ecarnot

8 réponses

Avatar
Bruno Rohee
On 2005-04-28, Nicolas Ecarnot wrote:
Bonjour,

J'ai un réseau sans NAT, avec un serveur qui reçoit d'internet des requêtes
http et apache qui s'en charge.
Je voudrais configurer le pf de ce serveur pour établir une redirection
vers un autre serveur, de sorte à soulager le serveur d'entrée.

J'ai écris ça en vain:
rdr on $ext_if proto tcp from any to any port 80 -> $ip_autre_serveur


Question con, si to serveur d'entree fait du filtrage il faut autoriser
le traffic que tu vient de definir, genre

rdr pass on $ext_if proto tcp from any to any port 80 -> $ip_autre_serveur
^

Ou une vrai regle pass si tu veux quelque chose de plus fin...

mais je ne parviens pas à comprendre si je dois utiliser du nat pour que ça
marche ?
Puis-je simplement mettre en place une redirection de port, sans nat ?


Oui. Au sens que le paquet devrait bien être redirigé. Tu peux verifier
en sniffant sur le serveur interne que tu recoit bien les paquets

Si oui, pf se chargera-t-il de transmettre la réponse aux requêtes, ou
dois-je rajouter des règles ?


Le serveur interne a bien le serveur faisant le filtrage comme route
par defaut?

Pour debugger ce genre de probleme tu commence par mettre "log" sur
toute tes regles block au cas ou tu te sois plante a ce niveau...

Ensuite tu sniffes sur chaque interface des deux machines (simplement
sur l'interieure et l'exterieure du firewall est generalement suffisant..)

Avatar
Nicolas Ecarnot
Sur fr.comp.os.bsd, vous écriviez :
On 2005-04-28, Nicolas Ecarnot wrote:
Le serveur interne a bien le serveur faisant le filtrage comme route
par defaut?


C'est là que toute la connerie de ma démarche s'exprime clairement :

- j'ai une freebox paramétrée en routeur avec un switch branché dessus
- sur ce switch, j'ai deux serveurs : petitServeur et grosServeur
- sur chaque serveur, je n'ai qu'une seule carte réseau (je dis ça pour
bien faire comprendre que petitServeur n'est pas un firewall au sens
NAT, et ne pourra donc pas faire une vraie DMZ)
- sur petitServeur, j'ai un serveur httpd qui rame. Forcément,
petitServeur est petit.
- Ce que je voudrais faire, c'est que quand petitServeur détecte que
grosServeur est alive, il active une règle dans PaquetFilter pour que
le traffic http soit redirigé sur grosServeur.

Donc je m'étais dis qu'une simple règle suffirait du style :

rdr pass on $ext_if proto tcp from any to $petitServeur
port 80 -> $grosServeur

Un tcpdump sur petitServeur me montre bien les paquets arrivant
joyeusement.
Hélas, mon incompétence fait que je n'ai pas encore de tcpdump sur
grosServeur pour accueillir les éventuels paquets...
Toujours est-il que le httpd de grosServeur ne frémit pas.
Je ne sais donc même pas encore si les paquets sont transmis à
grosServeur.

Mon idée vous semble-t-elle réalisable ?

--
Nicolas Ecarnot

Avatar
Eric Lalitte
"Nicolas Ecarnot" wrote in message
news:
Un tcpdump sur petitServeur me montre bien les paquets arrivant
joyeusement.


Il devrait aussi pouvoir te dire s'ils ressortent de petitServeur.
S'ils ressortent, ils vont arriver vers grosServeur (ce n'est que de la
commutation alors on considère que ça marche)
Et là tu peux voir les logs de apache pour voir ce qui est fait des
requêtes.

S'ils ne ressortent pas, il faut voir les logs du firewall :-)
Un pfctl -ss doit pouvoir aider dans un premier temps, mais pour y voir
plus clair log les paquets qui t'intéressent.


--
Posted via Mailgate.ORG Server - http://www.Mailgate.ORG

Avatar
Nicolas Ecarnot
Nicolas Ecarnot wrote in
news::

Mon idée vous semble-t-elle réalisable ?


Je me réponds à moi-même, avec l'espoir qu'un connaisseur de PF confirme ce
que j'ai trouvé :

Dans le man de pf.conf, au sujet de rdr, je lis :

|Redirections cannot reflect packets back through the interface they arrive
|on, they can only be redirected to hosts connected to different interfaces
|or to the firewall itself.

Or ça semble exactement ce que je cherche à faire :
- du traffic entre sur la seule carte réseau de mon petitServeur
- je voulais le rediriger vers un autre host, via la même carte réseau

Je suppose que c'est bien la traduction de 'reflect'.

--
Nicolas Ecarnot

Avatar
talon
Nicolas Ecarnot wrote:

|Redirections cannot reflect packets back through the interface they arrive
|on, they can only be redirected to hosts connected to different interfaces
|or to the firewall itself.

Or ça semble exactement ce que je cherche à faire :
- du traffic entre sur la seule carte réseau de mon petitServeur
- je voulais le rediriger vers un autre host, via la même carte réseau

Je suppose que c'est bien la traduction de 'reflect'.



Oui, et ça ne marche pas, ni avec pf ni avec ipnat.


--

Michel TALON

Avatar
James
On 2005-05-10, Nicolas Ecarnot wrote:

|Redirections cannot reflect packets back through the interface they arrive
|on, they can only be redirected to hosts connected to different interfaces
|or to the firewall itself.

Or ça semble exactement ce que je cherche à faire :
- du traffic entre sur la seule carte réseau de mon petitServeur
- je voulais le rediriger vers un autre host, via la même carte réseau

Je suppose que c'est bien la traduction de 'reflect'.


Contrairement à ce que pent laisser penser cette page, il est tout à
fait possible de faire ce que tu vuex avec ou sans le NAT.

Exemple avec ET sans le NAT :

-------- 8< --- coupure --------- 8< ----------------
IP_IN="192.168.0.1"
table <IP_WAS> persist { 192.168.0.4, 192.168.0.5 }
table <IP_SQL> persist { 192.168.0.9 }
...
#--- sans NAT
rdr on $IF_IN proto tcp from any to $IP_IN port http -> <IP_WAS> port 80
round-robin

#--- avec NAT
rdr on $IF_IN proto tcp from any to $IP_IN port $PORT_SQL1 -> <IP_SQL>
nat on $IF_IN proto tcp from any to <IP_SQL> port $PORT_SQL1 -> $IP_IN
-------- 8< --- fin coupure --------- 8< ------------

Et ajouter ceci sur les machines de IP_WAS :
route add default 192.168.0.1

L'exemple est tiré d'un open 3.7, mais le même principe fonctionnait déjà
sur 3.5 à l'époque.

HTH

Avatar
Nicolas Ecarnot
Le 13-05-2005, James écrivait :
Contrairement à ce que pent laisser penser cette page, il est tout à
fait possible de faire ce que tu vuex avec ou sans le NAT.

Exemple avec ET sans le NAT :

-------- 8< --- coupure --------- 8< ----------------
IP_IN="192.168.0.1"
table <IP_WAS> persist { 192.168.0.4, 192.168.0.5 }
table <IP_SQL> persist { 192.168.0.9 }
...
#--- sans NAT
rdr on $IF_IN proto tcp from any to $IP_IN port http -> <IP_WAS> port 80
round-robin
Et ajouter ceci sur les machines de IP_WAS :
route add default 192.168.0.1

L'exemple est tiré d'un open 3.7, mais le même principe fonctionnait déjà
sur 3.5 à l'époque.


Merci pour ta réponse, mais je viens de faire un paquet de tests, j'ai
désormais un tcpdump sur grosServeur qui me permet de voir les paquets
entrants, et hélas çane fonctionne toujours pas.
Tout d'abord, mon firewall est un OpenBSD 3.6.
Pour ces tests, je désactive même toute règle de filtrage.
Je log tout et je ne vois rien sortir de mon interface de petitServeur.
Je n'ai donc peu de chance de voir quoi que ce soit entrer dans
grosServeur.

Puis-je te demander de vérifier que tu es bien dans le même cas que moi
(décris en début de ce thread), à savoir un firewall avec UNE SEULE
carte réseau ?

--
Nicolas Ecarnot

Avatar
James
On 2005-05-18, Nicolas Ecarnot wrote:

Puis-je te demander de vérifier que tu es bien dans le même cas que moi
(décris en début de ce thread), à savoir un firewall avec UNE SEULE
carte réseau ?


Oui.

Donc t'as une freebox en routeur avec un switch ou hub au cul.

Supposons que l'IP de ta freebox soit IPx en externe (publique) et IPf
en interne, ton "petit serveur" ait IPa et ton "gros serveur" IPb et
t'as fait les redirection de port comme il le faut :

Quand on fait "telnet IPx 80" depuis chez moi IPc :

I. Sur la freebox :
IPc->IPx port 80
IPc->IPa port 80

II. sur le "petit serveur" :
IPc->IPa port 80 : rdr from any to any port 80 -> IPb port 80

III. sur le "gros serveur" :
IPc->IPb port 80
Réponse : IPb port 80->IPc
C'est quoi la route pour IPc sur "gros serveur" ? IPf
IPb port 80->IPc (via IPf)

IV. Réponse rejetée.

Si tu change la route sur "gros serveur", ça va donner ça :

III.
IPc->IPb port 80
Réponse IPb->IPc
C'est quoi la route pour IPc : IPa
IPb port 80->IPc via IPa

IV. sur IPa
IPb port 80->IPc (ça match une règle de NAT/RDR)
IPa port 80->IPc

V. sur freebox, avec un NAT en mode routeur:
IPa port 80->IPc
IPx port 80->IPc

La boucle est bouclée.

L'exemple est un poil trop compliqué, prends toi une feuille A4 et un
beau stylo, fais toi un beau chemin, ça passe sans problème.