Comment puis-je rediriger le trafic sortant vers le port 80 en utilisant iptables localement?

19

J'essaie de rediriger localement les ports sur ma machine Ubuntu en utilisant iptables. Similaire au proxy transparent. Je veux attraper quoi que ce soit en essayant de laisser mon système sur le port 80 et le rediriger vers un hôte et un port distants.

Puis-je y parvenir en utilisant les fonctions NAT et de pré-routage de iptables?

pjf
la source

Réponses:

30

Essayez cette iptablesrègle:

$ sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination IP:80

Ce qui précède dit:

  • Ajoutez la règle suivante à la table NAT ( -t nat).
  • Cette règle sera ajoutée ( -A) au trafic sortant ( OUTPUT).
  • Nous ne sommes intéressés que par le trafic TCP ( -p tcp).
  • Nous ne sommes intéressés que par le trafic dont le port de destination est 80 ( --dport 80).
  • Lorsque nous avons un match, passez à DNAT ( -j DNAT).
  • Acheminez ce trafic vers le port IP @ 80 d'un autre serveur ( --to-destination IP:80).

Qu'est-ce que DNAT?

DNAT
    This target is only valid in the nat table, in the PREROUTING and OUTPUT 
    chains, and user-defined chains which are only called from those chains.
    It specifies that the destination address of the packet should be modified 
    (and all future packets in  this  connection will also be mangled), and
     rules should cease being examined.

Les références

slm
la source
merci pour ça mais ça ne semble pas marcher. J'ai cependant depuis trouvé cela qui fonctionne.
pjf
sudo iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination xx.xx.xx.xx: 3128
pjf
Est-ce parce que c'est localement et non via une passerelle? votre SNAT fonctionnerait via une passerelle?
pjf
@pjf - Je le pense. J'ai mis à jour ma réponse.
slm
@pjf - J'ai trouvé les deux règles et j'étais en train de mettre à jour ma réponse avec les deux. Je ne savais pas dans quelle situation vous étiez.
slm
6

Cela peut être rendu plus spécifique pour fonctionner uniquement sur le trafic vers un hôte de destination particulier. Par exemple, lorsque Postfix s'est trompé et que les e-mails en file d'attente veulent être envoyés à une ancienne adresse IP.

iptables -t nat -A OUTPUT -p tcp -d {ONLY_TO_THIS_DESTINATION} --dport 25 -j DNAT --to-destination {NEW_IP}:25
Widmo
la source
4

Cela peut vous permettre de traduire des ports vers toutes les adresses IP. La principale différence ici est l'absence d'une adresse IP sur le --to-destinationterrain.

iptables -t nat -A OUTPUT -p tcp --dport 80 -j DNAT --to-destination :80
Felipe Alvarez
la source
Astuce très utile; exactement ce dont j'avais besoin. Existe-t-il un moyen d'incrémenter le numéro de port? Disons que j'ai une gamme de 100 ports et que je veux les augmenter tous d'un montant spécifique.
Zdenek
Pas sûr de ce que vous voulez dire. Pourriez-vous écrire une boucle for dans Bash?
Felipe Alvarez
Une boucle ajoutant 100 règles iptables fonctionnerait, mais cela la ralentirait. Je préférerais pouvoir lui dire d'incrémenter plusieurs ports successifs dans une seule règle.
Zdenek
@Zdenek Je ne sais pas si c'est possible avec iptables. Avez-vous regardé firewalld?
Felipe Alvarez