3 votes

Le trafic via une route statique sur le routeur ne trouve pas son chemin de retour

Ce problème me gêne depuis quelques jours et je ne trouve pas de solution. Désolé pour le titre étrange. Ce n'est pas mon domaine de travail principal et je n'ai pas trouvé de meilleur titre pour le moment.

Quelques faits :

  • Je suis un utilisateur sur un environnement openstack partagé
  • Je ne peux pas voir ou modifier la configuration de l'installation openstack sous-jacente.
  • Les machines virtuelles sont configurées via cloud-init, qui installe Python-minimal, crée un utilisateur et effectue une analyse de l'environnement. apt-get dist-upgrade . En outre, ils sont configurés via DHCP avec une IP statique.
  • Je n'ai configuré aucun iptables sur les nœuds.

Permettez-moi donc de vous décrire l'installation :

J'ai créé un réseau+sous-réseau (10.0.30.10/24). Le réseau est attaché à un routeur qui contient deux routes statiques. J'ai également créé deux VM (toutes deux ubuntu 16.04.2 LTS) qui ont reçu leur IP "principale" (node0 : 10.0.30.10/24 et node1 : 10.0.30.11/24) ainsi qu'une seconde IP dans un sous-réseau différent (node0 : 10.10.10.2/24 et node1 : 10.10.20.2/24).

J'ai également configuré deux routes statiques sur le routeur qui transmettent tout pour 10.10.10.0/24 vers node0 et tout pour 10.10.20.0/24 au nœud 1.

+----------------------------------------+
|  test-router                           |
|  IP: 10.0.30.1/24                      |
|                                        |
|  Static routes:                        |
|  - destination_cidr = "10.10.10.0/24"  |
|    next_hop         = "10.0.30.10"     |
|  - destination_cidr = "10.10.20.0/24"  |
|    next_hop         = "10.0.30.11"     |
+----------------------------------------+
        |
        |
  +------------------------+
  |  test-network          |
  |  Subnet: 10.0.30.0/24  |
  |  Router: 10.0.30.1     |
  +------------------------+
        |
        |
        |       +---------------------+
        |       |  node0              |
        +-------+  IP: 10.0.30.10/24  |
        |       |      10.10.10.2/24  |
        |       +---------------------+
        |
        |       +---------------------+
        |       |  node1              |
        +-------+  IP: 10.0.30.11/24  |
                |      10.10.20.2/24  |
                +---------------------+

Une fois les deux VMs démarrées, j'observe ce qui suit :

Node0

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.30.1       0.0.0.0         UG    0      0        0 ens3
10.0.30.0       *               255.255.255.0   U     0      0        0 ens3
169.254.169.254 10.0.30.100     255.255.255.255 UGH   0      0        0 ens3
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:31:67:52 brd ff:ff:ff:ff:ff:ff
    inet 10.0.30.10/24 brd 10.0.30.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet 10.10.10.2/24 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe31:6752/64 scope link
       valid_lft forever preferred_lft forever
$ ping -c10 10.10.20.2
PING 10.10.20.2 (10.10.20.2) 56(84) bytes of data.
From 10.0.30.1: icmp_seq=2 Redirect Host(New nexthop: 10.0.30.11)
From 10.0.30.1: icmp_seq=3 Redirect Host(New nexthop: 10.0.30.11)

--- 10.10.20.2 ping statistics ---
10 packets transmitted, 0 received, 100% packet loss, time 8999ms

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.30.1       0.0.0.0         UG    0      0        0 ens3
10.0.30.0       *               255.255.255.0   U     0      0        0 ens3
10.10.10.0      *               255.255.255.0   U     0      0        0 ens3
169.254.169.254 10.0.30.100     255.255.255.255 UGH   0      0        0 ens3

Pendant ce temps, sur le nœud 1

# tcpdump icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
09:25:55.451876 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 1, length 64
09:25:55.451928 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 1, length 64
09:25:56.451467 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 2, length 64
09:25:56.451503 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 2, length 64
09:25:57.451185 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 3, length 64
09:25:57.451218 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 3, length 64
[..]
09:26:03.450910 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 9, length 64
09:26:03.450943 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 9, length 64
09:26:04.450988 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 10, length 64
09:26:04.451022 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 10, length 64

Ma conclusion est donc la suivante : le nœud 1 reçoit le trafic mais la réponse n'arrive pas jusqu'au nœud 0.

La même chose se produit si je démarre un serveur web sur node1 et que j'essaie de l'ouvrir via l'IP routée statiquement. Je vois le trafic arriver sur node1 mais la réponse n'arrive jamais sur node0.

D'autre part : arping de node0 à node1 fonctionne :

# arping -c3 -i ens3 10.10.20.2
ARPING 10.10.20.2
42 bytes from fa:16:3e:a9:b4:bc (10.10.20.2): index=0 time=7.933 msec
42 bytes from fa:16:3e:a9:b4:bc (10.10.20.2): index=1 time=2.797 msec
42 bytes from fa:16:3e:a9:b4:bc (10.10.20.2): index=2 time=9.703 msec

--- 10.10.20.2 statistics ---
3 packets transmitted, 3 packets received,   0% unanswered (0 extra)
rtt min/avg/max/std-dev = 2.797/6.811/9.703/2.929 ms

Si j'utilise l'IP "principale", tout fonctionne bien.

Ce que j'ai essayé (sur les deux nœuds) :

  • Paramètres /proc/sys/net/ipv4/conf/ens3/rp_filter a 2 y 0 (parce que je suis désespéré). Rien n'a changé.
  • Paramètres /proc/sys/net/ipv4/ip_forward a 1 . Rien n'a changé.
  • Paramètres /proc/sys/net/ipv4/conf/ens3/log_martians a 1 sur les deux nœuds. Aucune sortie via journalctl -f quoi que ce soit.

EDIT : Il y a une sortie sur node0 si j'envoie un ping à node1 via l'IP statique :

May 03 11:16:01 node0 kernel: IPv4: Redirect from 10.0.30.1 on ens3 about 10.0.30.11 ignored
                                Advised path = 10.0.30.10 -> 10.10.20.2

Et comme je suis à court d'idées, j'ai besoin de votre aide. Merci de prendre le temps de vous pencher sur mon problème !

1voto

Slartibartfast Points 3255

Défis :

Il n'y a qu'un seul domaine de diffusion (réseau physique / couche 2) qui compte, et sur ce domaine de diffusion, il y a trois réseaux IP (logiques) :

  • 10.0.30.0/24 - A
  • 10.10.10.0/24 - B
  • 10.10.20.0/24 - C

Maintenant, vous avez également trois appareils, chacun sur un sous-ensemble des réseaux logiques :

  • routeur - A uniquement
  • node0 - A et B
  • node1 - A et C

Pour rendre les choses plus amusantes, vous avez dit au routeur que le nœud 0 est en charge du réseau B et que le nœud 1 est en charge du réseau C, mais vous n'avez pas dit au nœud 0 que le nœud 1 était en charge du réseau C, ni au nœud 1 que le nœud 0 était en charge du réseau B.

C'est une recette pour le genre d'excitation que vous vivez.

Lorsque le routeur reçoit un message du nœud 0 destiné à une adresse IP sur le réseau C, sa réponse est la suivante : "Idiot de noeud 0, tu vas dans la mauvaise direction ; tu devrais savoir que tu dois aller au noeud 1 avec lequel tu partages aussi un réseau pour y arriver" :

node0 kernel: IPv4: Redirect from 10.0.30.1 on ens3 about 10.0.30.11 ignored
                            Advised path = 10.0.30.10 -> 10.10.20.2

Si vous jouez avec les sous-réseaux et le routage pour le plaisir, c'est très bien. Vous avez trouvé une approche moins optimale, mais vous pouvez continuer à jouer.

Si vous essayez d'accomplir quelque chose de spécifique en ayant des réseaux séparés, vous voudrez probablement configurer le routeur pour qu'il soit directement connecté à chaque réseau séparé (A-C), et vous voudrez probablement que chaque réseau soit un domaine de diffusion séparé.

Si vous souhaitez simplement que les ordinateurs puissent communiquer entre eux avec les adresses IP configurées, c'est possible :

  • Ajouter 10.10.10.3/24 à node1, et
  • Ajouter 10.10.20.3/24 à node0

En règle générale, pour tout réseau utilisé par des routeurs pour communiquer entre eux (et lorsque vous avez rendu node0 et node1 responsables de leurs propres réseaux (B et C), vous avez fait d'eux des routeurs), vous voulez presque certainement vous assurer que tous ces routeurs sont pleinement informés de l'itinéraire correct pour tous les réseaux voisins. Les protocoles de routage peuvent être utilisés à cette fin, mais cet échantillon est suffisamment petit pour être traité manuellement.

J'espère que ces informations vous seront utiles, à vous ou à d'autres, bien qu'elles soient un peu dépassées.

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