2017-01-15 1 views
0

J'ai un scénario où notre boîte de lancement Linux doit recevoir des paquets destinés à des adresses non-locales. par exemple. Je n'ai configuré 1 :: 1 sur aucune des interfaces de ma boîte, mais je veux recevoir les paquets qui lui sont destinés. J'ai les paquets atteignant ip6_rcv_finish().Comment obtenir Linux accepter des paquets destinés à des adresses non-locales?

Ici, ip6_input_route() renvoie une entrée dst_entry pointant sur la fonction de suppression. Si j'ajoute 1 :: 1 à l'une des interfaces, je vois ip6_input_route() retourne dst_entry avec ip6_input() et le paquet est reçu par l'application via le socket. Existe-t-il un moyen d'y parvenir sans avoir à ajouter l'adresse explicitement? J'utilise les options IP_BINDTODEVICE et IP_TRANSPARENT. Ces options me permettent de lier le socket à 1 :: 1 même si l'adresse n'est configurée sur aucune interface.

+0

Mise à jour avec une autre question connexe. IP_TRANSPARENT ne devrait-il pas aider ici? Si vous avez une option pour lier à l'adresse non-locale, devrait-elle également ne pas prévoir de recevoir des paquets pour cette adresse? Sinon, à quoi sert de simplement se lier à une adresse non-locale et de ne pas recevoir de paquets pour la même chose? – user7420724

+0

Pour ceux d'entre vous qui ne sont pas familiers avec le "format IP comprimé" utilisé ici, voir http://www.gestioip.net/docu/ipv6_address_examples.html –

Répondre

0

Si vous configurez votre routeur/hôte voisin avec un itinéraire vers la destination 1: 1 pour sortir de l'interface à laquelle vous êtes connecté ... il vous atteindra.

0

Le paramètre IP_TRANSPARENT utilise TProxy, qui est documenté here. La partie délicate semble être d'envoyer les paquets à l'interface à laquelle le socket est lié. Adapter les instructions de la documentation pour IPv6, vous devez effectuer les opérations suivantes:

# Mark packets whose destination IPs match a local socket 
ip6tables -t mangle -N DIVERT 
ip6tables -t mangle -A PREROUTING -p tcp -m socket -j DIVERT 
ip6tables -t mangle -A DIVERT -j MARK --set-mark 1 
ip6tables -t mangle -A DIVERT -j ACCEPT 

# Configure policy routing to allow marked packets 
ip -6 rule add fwmark 1 lookup 100 
ip -6 route add local default dev eth1 table 100 

Notez que eth1 sur la route était l'interface mon socket a été attachée. Vous devrez peut-être jouer avec ces paramètres pour le faire fonctionner correctement. Voir here pour plus d'informations.

J'ai testé cela dans un environnement Vagrant à deux boîtiers et j'ai réussi à effectuer une prise de contact TCP avec un socket lié à une adresse IPv6 fictive.

+0

Ajouter à lo aiderait. Mais l'exigence est pour plusieurs adresses IP. – user7420724

+0

@ user7420724 J'ai complètement réécrit ma réponse. Faites-moi savoir si cela aide! – augurar