1 votes

Deux périphériques à double tap se connectent l'un à l'autre sur le même ordinateur

Ce que je veux implémenter ressemble à ce qui suit.

                 192.168.1.1                                 192.168.1.2
+--------+      +----------+         +-----------+           +---------+       +---------+
|  APP0  +<---->+   tap0   +<------->+   myapp   +<--------->+   tap1  +<----->+   APP1  |
+--------+      +----------+         +-----------+           +---------+       +---------+
  1. Lancer myapp, qui créera deux périphériques tap, tap0 et tap1. myapp transmettra les paquets entre ces deux périphériques tap.
  2. APP0 et APP1 communiqueront avec l'API de socket tcp standard.
  3. Toutes ces applications et périphériques tap se trouvent dans un seul système Linux (Centos7.5).

Mais après avoir créé deux périphériques tap, ping -I tap0 192.168.1.2 n'a pas réussi.

Je trouve d'abord qu'il y a un problème d'ARP, et je les résous en définissant les fichiers accept_local et rp_filter.

echo 1 > /proc/sys/net/ipv4/conf/tap0/accept_local
echo 1 > /proc/sys/net/ipv4/conf/tap1/accept_local
echo 2 > /proc/sys/net/ipv4/conf/tap0/rp_filter
echo 2 > /proc/sys/net/ipv4/conf/tap1/rp_filter;

Avec l'outil tcpdump, j'ai constaté que la requête ICMP arrivait à tap1, mais la réponse ICMP de tap1 allait au périphérique lo. Linux routera tout le trafic local à travers le périphérique lo.

Comment puis-je faire en sorte que le trafic local évite le périphérique lo et arrive aux périphériques tap ?

J'ai fait des recherches et trouvé quelques solutions qui nécessitent une configuration de la politique NAT. Je pense qu'elles sont compliquées.

0voto

randomeval Points 111

J'ai trouvé une réponse à ce genre de problème.

Le problème central est comment contourner la table de routage locale. J'ai trouvé des informations utiles à partir de ce lien.

Je vais montrer comment le faire en utilisant une interface veth.

  1. créer une paire d'interfaces veth : veth0, veth1. Et définir une adresse IP pour chacune.

    ip link add veth0 type veth peer name veth1 ip link set dev veth0 up ip link set dev veth1 up ip addr add 10.8.1.3 dev veth0 ip addr add 10.8.1.4 dev veth1

  2. Utiliser iptables pour marquer les paquets sortant de veth0 et veth1

    iptables -t mangle -s 10.8.1.3/32 -A OUTPUT -j MARK --set-mark 1 iptables -t mangle -s 10.8.1.4/32 -A OUTPUT -j MARK --set-mark 1

  3. Changer la priorité de la règle locale. Vous feriez mieux d'ajouter ces commandes au démarrage du système. La première commande supprime la règle 'locale', ce qui entraînera la fermeture de votre connexion au serveur Linux.

    ip rule del from all pref 0 lookup local ip rule add from all pref 100 lookup local

  4. Ajouter une route à la table 100. Ces deux règles transmettent simplement les paquets à une autre interface.

    ip route add 10.8.1.4/32 via 10.8.1.3 dev veth0 table 100 ip route add 10.8.1.3/32 via 10.8.1.4 dev veth1 table 100

  5. Ajouter une nouvelle règle, qui a la priorité la plus élevée. Tous les paquets marqués 1 déclencheront d'abord cette règle et chercheront une route dans la table 100.

    ip rule add fwmark 1 pref 10 lookup 100

  6. Vous devez également définir accept_local et rp_filter pour que l'ARP fonctionne correctement.

    echo 1 > /proc/sys/net/ipv4/conf/veth0/accept_local echo 1 > /proc/sys/net/ipv4/conf/veth1/accept_local echo 2 > /proc/sys/net/ipv4/conf/veth0/rp_filter echo 2 > /proc/sys/net/ipv4/conf/veth1/rp_filter;

  7. Maintenant, vous pouvez pinguer chaque adresse IP, les paquets ICMP ne passeront pas par l'interface lo.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X