4 votes

Comment transférer le trafic d'une machine à une autre avec `pfctl` ?

J'essaie d'acheminer le trafic de la manière suivante :

Internal Network Computer (192.168.1.*)  Server (192.168.186:1234)  Internal Network Computer (192.168.1.198:80)
  • Le serveur est branché sur le routeur via ethernet sur l'interface en0

  • L'ordinateur interne est connecté au routeur par wifi.

  • Le serveur peut accéder à 192.168.1.198:80 sans problème.

Selon plusieurs autre question connexe j'ai obtenu les règles suivantes

nat on en0 from any to en0 -> (en0)
rdr pass inet proto tcp from any to any port 1234 -> 192.168.1.198 port 80

Cependant, j'obtiens le résultat suivant lorsque telnet de l'eau :

$ telnet 192.168.1.186 1234
Trying 192.168.1.186...
telnet: connect to address 192.168.1.186: Operation timed out
telnet: Unable to connect to remote host

En utilisant Wireshark sur le 192.168.1.198, j'ai confirmé que la connexion télénet est reçue, mais elle ne semble pas se connecter.


Plus d'informations :

  • rdr à partir de 127.0.0.1 a 127.0.0.1 fonctionnent bien, par exemple :

    rdr pass inet proto tcp from any to any port 1234 -> 127.0.0.1 port 80

  • J'ai confirmé que le port 80 est ouvert sur 192.168.1.198, et qu'il est accessible depuis le serveur.

  • Le pare-feu (dans les préférences système) est désactivé sur les deux ordinateurs.

  • J'ai activé le transfert de trafic entre interfaces avec

    sudo sysctl -w net.inet.ip.forwarding=1

  • Je pense qu'il s'agit d'un problème de NAT (voir les messages ci-dessous), mais je n'en suis pas sûr.

La même question est abordée sur le site GitHub . @ctgreybeard, @dandriana, @snimavat et @sergeyzwezdin ont tous signalé le même problème. Quelqu'un a-t-il une solution ?


A noter : J'aimerais utiliser pfctl et non SSH ou un autre service.


Voici d'autres articles sur le sujet :

https://serverfault.com/questions/791181/redirecting-traffic-to-a-specific-address-and-port-using-pf-on-MacOS

Comment puis-je configurer mon Mac (OS X Yosemite) comme passerelle internet ?

9voto

H-man Points 1158

Voici comment j'ai réussi à le faire fonctionner.

Mon exemple utilise trois hôtes sur mon réseau (10.10.0.0/16) :

10.10.10.10 = client Linux
10.10.6.237 = Mac "serveur réel" fournissant un service sur le port 3000
10.10.1.200 = Mac "serveur" effectuant une redirection pf, écoutant sur le port 2004, interface vlan0

natrdr.pf

rdr on vlan0 inet proto tcp from 10.10.0.0/16 to 10.10.1.200 port 2004 -> 10.10.6.237 port 3000
nat on vlan0 inet proto tcp from 10.10.0.0/16 to 10.10.6.237 port 3000 -> 10.10.1.200

La spécificité permet de s'assurer que votre serveur n'effectue pas de NAT sur du trafic qui ne devrait pas l'être.

Pour ceux qui partent de zéro, après avoir créé leur natrdr.pf ci-dessus, exécutez les commandes suivantes à partir de la ligne de commande ou d'un shell script, sudo ou en tant que Root. Intégration de l'outil pf avec les règles d'Apple pf.conf est un exercice laissé au lecteur.

# Enable packet forwarding

sysctl -w net.inet.ip.forwarding=1

# Unless you have any rules you want to keep, let's flush existing NAT rules
pfctl -F nat

# Enable packet filtering
pfctl -e

# Load rules from our file
pfctl -f natrdr.pf

# Confirm rules are loaded
pfctl -s nat

# Check to see connections 
pfctl -s states

J'ai ensuite utilisé telnet 10.10.1.200 2004 et a été immédiatement transmis au serveur Node/express fonctionnant sur le port 3000 sur 10.10.6.237.

Exemple de sortie de pfctl -s states pour vérifier qu'il fonctionne :

ALL tcp 10.10.6.237:3000 <- 10.10.1.200:2004 <- 10.10.10.10:40744       ESTABLISHED:ESTABLISHED
ALL tcp 10.10.10.10:40744 -> 10.10.1.200:35947 -> 10.10.6.237:3000       ESTABLISHED:ESTABLISHED

Ainsi, pour qu'il corresponde à votre configuration :

rdr on en0 inet proto tcp from 192.168.1.0/24 to 192.168.1.186 port 1234 -> 192.168.1.198 port 80
nat on en0 inet proto tcp from 192.168.1.0/24 to 192.168.1.198 port 80 -> 192.168.1.186

L'ordre des règles est important.

La règle de redirection fait ce que l'on attend d'elle : elle transfère tout le trafic entrant dans le serveur vers le vrai serveur.

La règle NAT modifie les paquets (désormais redirigés) pour qu'ils aient une adresse IP source du serveur de redirection au lieu du client d'origine.

La combinaison de ces règles garantit la création automatique d'un chemin inverse pour les paquets de retour.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X