[LINUX] Routage de l'espace de noms réseau

introduction

Voici une suite de l'article précédent sur l'espace de noms. Dernier message: Linux Network Namespace1 Maintenant, quand je me suis demandé ce qu'était «netns», c'était un acronyme pour NETwork Name Space. Je décrirai Qiita en incluant ce que j'ai remarqué à nouveau.

La raison pour laquelle la communication était possible sans le routeur précédent

À l'origine, le réseau configuré en utilisant IP dépend du routeur. Il se compose d'un relais de seau de paquets Cependant, l'adresse IP précédemment configurée était __ "appartenant à un segment du même réseau" __ La communication était possible sans routeur

En d'autres termes, lorsque vous avez besoin d'un routeur Uniquement lorsque vous souhaitez communiquer avec quelqu'un avec un segment différent »

Qu'est-ce qu'un segment?

Une partie d'une chose Il semble qu'il existe plusieurs segments de code et segments de données Je ne pense pas que ce soit pertinent cette fois, alors je vais l'omettre.

L'adresse IP est divisée en deux parties

IPv4 Entier binaire entre 32 bits Exemple) XXXXXXXX00000000 XXXXXXXX00000000

=> Essayez de diviser ceci à intervalles de 8 bits Chaque espace séparé est appelé octet Exemple) XXXXXXXX00000000 XXXXXXXX00000000 => XXXXXXXX.00000000.XXXXXXXX.00000000

Convertissons cela en un nombre décimal Exemple) XXXXXXXX.00000000.XXXXXXXX.00000000 => XXX.X.X.0

Et cette adresse IP ressemble à ceci et est divisée en deux parties Exemple) Adresse IP de XXX.X.X .__ 1__ XXX.X.X dans la première moitié __Partie réseau __ Le dernier 1 est appelé __host partie __

Partie réseau adresse réseau La partie hôte est également appelée «adresse hôte»

Pourquoi ils sont séparés

__ Pour identifier le segment __ => Autrement dit, les adresses IP avec la même adresse réseau appartiennent au même segment.

Si vous le divisez par le 24e bit Ce sera la même adresse réseau XXX.X.X

De plus, la valeur de veth créée la dernière fois est C'était quelque chose comme XXX.X.X.X / 24 Cette chaîne de caractères __ / 24__ indique que le «24e bit est l'adresse réseau».

Par conséquent, les deux ci-dessus appartiennent au même segment dans le même réseau.

Essayez de mettre un routeur

Installez de sorte que la communication puisse être effectuée via un routeur entre les espaces de noms précédents ns1 et ns2

Terminal


$ sudo ip netns add ns1
$ sudo ip netns add router
$ sudo ip netns add ns2

Faites à nouveau à partir de 1. Créez un espace de nom appelé «routeur» qui relie Ensuite, créez une interface veth qui connecte chaque espace de noms. Puisqu'il y a 3 espaces de noms, un total de 2 interfaces est requis.

Terminal


$ sudo ip link add ns1-veth0 type veth peer name gw-veth0
$ sudo ip link add ns2-veth0 type veth peer name gw-veth1

Faites en sorte que chaque espace de noms appartienne à l'interface veth créée et composez-le

Terminal


$ sudo ip link set ns1-veth0 netns ns1
$ sudo ip link set gw-veth0 netns routes
$ sudo ip link set gw-veth0 netns router
$ sudo ip link set ns2-veth0 netns ns2

$ sudo ip netns exec ns1 ip link set ns1-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 up
$ sudo ip netns exec router ip link set gw-veth0 up
$ sudo ip netns exec ns2 ip link set ns2-veth0 up

Définissez l'adresse IP

Définir entre ns1 et routeur Attribuez la même adresse IP de segment à chaque interface réseau Les deux sont définis sur le même segment 192.0.2.0 / 24

Terminal


$ sudo ip netns exec ns1 ip address add 192.0.2.1/24 dev ns1-veth0
$ sudo ip netns exec router ip address add 192.0.2.254/24 dev gw-veth0

Attribuez la même adresse IP de segment entre ns2 et le routeur Les deux sont définis sur le même segment de 198.51.100.0/24

Terminal


$ sudo ip netns exec router ip address add 198.51.100.254/24 dev gw-veth1
$ sudo ip netns exec ns2 ip address add 198.51.100.1/24 dev ns2-veth0

Vous pouvez effectuer les réglages comme indiqué sur la figure. netns3.png

Communiquez sur un routeur

Assurez-vous que vous pouvez communiquer entre les segments via le routeur Essayez d'envoyer un ping de l'adresse IP ns1 à ns2 dans l'état actuel

Terminal


$ sudo ip netns exec ns1 ping -c 3 198.51.100.1. -I 192.0.2.1

PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) bytes of data.
ping : sendmsg : Network is unreachable
ping : sendmsg : Network is unreachable
ping : sendmsg : Network is unreachable

—- 198.51.100.1 ping statisics —
3 packets transmitted, 0 received, 100% packet loss , time 2000ms

"Network is unreachable" Je me fâche quand on me dit que je ne peux pas accéder au réseau. La cause de l'échec de la communication est qu'il n'y a pas de paramètre de routage dans l'espace de noms réseau Étant donné que les informations requises pour le relais pour la communication ont été décrites dans la table de routage Vérifiez la table de routage actuelle

Terminal


$ sudo ip netns exec ns1 ip route show
192.0.2.0/24 dev ns1-veth0 proto karnel scope link src 192.0.2.1

Il y a une entrée de routage dans la table de routage de ns1 192.0.2.0/24宛はns1-veth0というネットワークインターフェースで通信するという内容しかない En d'autres termes, la source de la destination du paquet, 198.51.100.1, ne correspond à aucune entrée de routage. Parce que ns1 ne savait pas à qui transmettre le paquet

Vous devez ajouter une entrée de routage à la table de routage pour résoudre

Terminal


$ sudo ip netns exec ns1 ip route add default via 192.0.2.254

Vous pouvez ajouter une entrée de routage pour $ ip route add Ensuite, j'ai le même problème avec ns2, alors réglez-le de la même manière.

Terminal


$ sudo ip netns exec ns2 ip route add default via 198.51.100.254

Essayez à nouveau d'appuyer sur Ping de ns1 à ns2

Terminal


$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1
PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) butes of data.

— 198.51.100.1 ping statistics—
3 packets transmitted , 0 received , 100% packet loss, time 2000ms

L'erreur a disparu, mais aucune réponse n'est renvoyée pour le ping que j'ai envoyé Il semble que vous deviez taper une commande pour définir le paramètre du noyau appelé sysctl` Cette commande a défini le net.ipv4.ip_forward du noyau sur 1 et l'a activé avec un paramètre de 1. Linux ne semble pas démarrer en tant que routeur à moins que ce paramètre ne soit activé

Terminal


$ sudo ip netns exec router sysctl net.ipv4.ip_forward=1 net.ipv4.ip_forward=1

$ sudo ip netns exec ns1 ping -c 3 198.51.100.1 -I 192.0.2.1
PING 198.51.100.1 (198.51.100.1) from 192.0.2.1 : 56(84) butes of data.
64 bytes from 198.51.100.1 : icmp_seq=1 ttl=63 time=0022ms
64 bytes from 198.51.100.1 : icmp_seq=2 ttl=63 time=0044ms
64 bytes from 198.51.100.1 : icmp_seq=3 ttl=63 time=0066ms

—198.51.100.1 ping statistics —

À la fin

Communication passée entre ns1 et ns2 via un routeur. La plupart d'entre eux ont été cités dans des livres et ils manquent encore de létalité, Je voudrais apprendre en recherchant les mots petit à petit.

Recommended Posts

Routage de l'espace de noms réseau
Espace de noms réseau Linux
réseau
Exploitez l'espace de noms réseau Linux avec Go
Réseau relationnel