web-dev-qa-db-fra.com

Multi: adresse de mauvaise source du client - toute solution unique?

Configuration : J'ai la configuration client/serveur OpenVPN (fichiers de configuration en bas), et je reçois le problème infâme MULTI: bad source address from client [192.168.x.x], packet dropped Message sur le serveur. Le serveur a une adresse IP publique, tandis que le client est derrière NAT.

Résolution des solutions précédemment proposées : le client-config-dir défini dans la configuration du serveur est actuellement vide. Les messages précédents (ici et dans OpenVPN Support Forums) suggèrent d'ajouter un fichier nommé DEFAULT avec les règles appropriées en client-config-dir, ou ajout d'un fichier par utilisateur avec ces règles pour résoudre le problème.

Cependant, cela ne semble pas être une solution à long terme, car ces règles sont spécifiques à l'emplacement de la clientèle. Donc, je peux ajouter une règle pour permettre aux clients de 192.168.x.0 se connecter. Mais s'ils se connectent d'un autre réseau qui utilise plutôt 192.168.y.0 Pour NAT, une nouvelle règle sera nécessaire.

Questions :

  • Les règles requises peuvent-elles être écrites de manière générique/ponctuelle?
  • Quelqu'un peut-il expliquer pourquoi ce problème se produit en premier lieu?

Server config :

port 1234
proto tcp
dev tun

ca ca.crt
cert openvpn.crt
key openvpn.key
dh dh2048.pem

server 10.78.96.0 255.255.255.0
keepalive 10 120
comp-lzo
cipher CAMELLIA-128-CBC

user nobody
group nogroup  
persist-key
persist-tun
client-cert-not-required
plugin /usr/lib/openvpn/openvpn-auth-pam.so login

status openvpn-status.log

Push "redirect-gateway def1"
Push "remote-gateway 1.2.3.4"
Push "dhcp-option DNS 8.8.8.8"

client-config-dir ccd
verb 4

Config client :

ca ca.crt
client
dev tun
proto tcp
remote 1.2.3.4 1234

auth-user-pass
script-security 2
keepalive 5 60
topology subnet
resolv-retry infinite
nobind
persist-key
persist-tun
ns-cert-type server
cipher CAMELLIA-128-CBC
comp-lzo
verb 4
10
m000

Vous avez demandé: " peut que quelqu'un puisse expliquer pourquoi ce problème se produit en premier lieu? "

Sur la base de ce qui est rapporté dans la FAQ officiel OpenVPN Je parie qu'il est causé par un problème de routage dans le moteur OpenVPN.

Pour mieux clarifier le scénario, laissez-moi vous référer au diagramme suivant:

Içi vous pouvez voir:

  • un "serveur" openvpn connecté au réseau interne du siège (10.0.1.0/24)
  • un "client" OpenVPN en cours d'exécution sur un site distant et connecté au réseau distant 192.168.1.0/24

Aussi

  • nous supposons que le tunnel OpenVPN est établi et:
    • OpenVPN "Server" est accessible via son propre interface TUN , avec adresse 10.10.0.1. Aussi l'adresse P2P, utilisée par l'interface TUN est 10.10.0.2 ( Ceci est important pour une discussion ultérieure, mettons l'accent sur IT )
    • OpenVPN "Client" a une interface TUN avec IP 10.10.0.2

Maintenant, supposons que:

  • le "client" OpenVPN a redéfini sa passerelle par défaut, afin de rediriger dans le tunnel tout le trafic IP sortant;
  • Le "client" OpenVPN a activé IP_Forwarding activé et, en tant que tel, peut acheminer des paquets provenant de son réseau local interne (192.168.1.0/24) ( j'en mettant l'accent sur cette Point, comme il est critique pour notre discussion ).

Avec un tel scénario en place, vérifions en détail ce qui se passe lorsque R_PC1 (192.168.1.2) envoie un paquet, comme une demande d'écho, à L_PC1 (10.0.1.2):

  1. après avoir quitté R_PC1 NIC, le paquet Reach OpenVPN Client;
  2. OpenVPN Client (qui est configuré pour agir en tant que routeur commun), acheminez-le en fonction de sa table de routage. Comme il est par défaut, la passerelle est le tunnel, il envoie le paquet au tunnel;
  3. Paquet Atteignez l'interface TUN du serveur OpenVPN. OpenVPN "voir" et, comme il (OpenVPN Server) sait que le 10.0.1.2 est une adresse appartenant à son sous-réseau LAN, il "transmet" le paquet, de TUN à LAN;
  4. Paquet atteint l_pc1.

Alors tout va bien...

Vérifions maintenant ce qui se passe avec la réponse d'écho que l_pc1 répond à R_PC1.

  1. echo-Répondre laisse l_pc1 NIC et rejoindre l'interface LAN de serveur OpenVPN (10.0.1.1);

Maintenant, si nous voulons que OpenVPN Server soit capable d'atteindre le site distant, nous devons définir le routage avec une "route statique". Quelque chose comme:

route add -net 192.168.1.0 netmask 255.255.255.0 gw 10.10.0.2

Veuillez noter l'adresse P2P utilisée comme passerelle .

Ces itinéraires statiques fonctionneront au niveau du système d'exploitation. En d'autres termes, il est nécessaire que le système d'exploitation ait correctement acheminer le paquet. Cela signifie quelque chose comme: "S'il vous plaît, tout le trafic adressé au sous-réseau 192.168.1.0/24 doit être envoyé au moteur OpenVPN, avec lequel le système d'exploitation est capable de parler via l'adresse P2P". Merci à une telle route statique, maintenant ...

  1. le paquet quitte le contexte de routage du système d'exploitation et atteint OpenVPN. L'instance OpenVPN en cours d'exécution sur le serveur OpenVPN. Ainsi, à ce stade, le système d'exploitation n'a rien de plus à faire et que tout le routage (dans le VPN) est laissé au logiciel OpenVPN Server.

Donc, maintenant, le problème est: Comment, le logiciel de serveur OpenVPN, pourra décider de la route d'un paquet, avec SRC_IP 10.0.1.2 et DST_IP 192.168.1.2 ?

Veuillez noter que, sur la base de la configuration du serveur OpenVPN, il connaît Rien sur le réseau 192.168.1.0/24, ni l'hôte de 192.168.1.2. C'est non un client connecté. C'est non un client local. Et donc? OpenVPN, aussi, sait que c'est non le "os-routeur", donc cela ne veut pas vraiment (et peut ...) envoyer le paquet à la passerelle locale. Donc, la seule option, ici, c'est d'élever une erreur. Exactement l'erreur que vous rencontrez

Pour le dire avec la langue de la FAQ: " ... il ne sait pas comment acheminer le paquet sur cette machine, il est donc de goutte le paquet ... ".

Comment pouvons-nous résoudre le problème?

Comme vous pouvez le constater à partir de la documentation officielle , l'option IROUTE sert exactement à notre portée:

--iroute network [netmask]
Generate an internal route to a specific client. The netmask 
parameter, if omitted, defaults to 255.255.255.255.
This directive can be used to route a fixed subnet from the server 
to a particular client, regardless of where the client is 
connecting from. Remember that you must also add the route to the 
system routing table as well (such as by using the --route 
directive). The reason why two routes are needed is that the 
--route directive routes the packet from the kernel to OpenVPN. 
Once in OpenVPN, the --iroute directive routes to the specific 
client.

Donc, vous avez besoin d'un:

--iroute 192.168.1.0 255.255.255.0

pour être appliqué (sur le serveur) lorsque votre client OpenVPN Connectez-vous, par exemple via un fichier de configuration ad-hoc défini sur le serveur (client-config-dir, etc.).

Si vous vous demandez pourquoi ce problème n'est-il pas sur l'étape 2) ci-dessus, ma compréhension est que le client OpenVPN connaît comment l'acheminer, car Sait que le tunnel VPN est une passerelle par défaut.

La même chose ne peut être faite sur OpenVPN Server, car il y a la passerelle par défaut non remplacée . En outre, considérez que vous pourriez avoir un seul serveur OpenVPN avec beaucoup de client OpenVPN: chaque client sait accéder au serveur, mais ... Comment pouvez-vous, le serveur, décide quel est le client agissant comme une passerelle pour un sous-réseau inconnu?


Quant à votre première question (, les règles requises peuvent être écrites de manière générique/ponctuelle? ), je suis désolé mais je n'ai pas votre problème même. Pouvez-vous reformuler fournir plus de détails?


12
Damiano Verzulli

J'ai eu un problème qui semble semblable, mais je ne suis pas sûr que si c'est la même chose que votre problème. J'essayais de ping d'un client OpenVPN à un ordinateur dans le réseau local du serveur OpenVPN (acheminé dans la configuration du serveur), à ne pas répondre et je pouvais voir le message "Adresse de mauvaise source" du journal OpenVPN du serveur.

Pour le résoudre, je devais faire 2 choses:

  1. Activer la transmission IP sur le serveur.
  2. Ajoutez un itinéraire pour le sous-réseau VPN sur la passerelle du serveur, car la passerelle du réseau local du serveur dans mon cas n'est pas le serveur lui-même, mais un routeur. L'ordinateur pingé essayait de répondre à travers la passerelle, ce qui ne savait aucune idée de quoi faire pour le sous-réseau VPN. J'ai donc ajouté une route statique dans le routeur à l'aide du sous-réseau VPN pour la destination, et OpenVPN Server's IP comme passerelle pour cela.

Cela a résolu pour moi.

1
aditsu