1 votes

Comment connecter deux réseaux ayant la même adresse réseau en utilisant un hôte linux qui fait partie des deux réseaux avec la même adresse IP ?

J'ai deux réseaux clonés ( lan1 y lan2 ) utilisés à des fins de test, chacun ayant le même espace d'adressage. 10.20.80.0/22 :

# 10.20.80.0/22
10.20.80.0    # first address
...
10.20.83.254  # last address

Ils ne sont pas connectés et ne sont pas destinés à l'être en termes d'interrupteurs.
Mais je veux avoir un moyen de se déplacer entre lan1 et lan2 par SSH . (Depuis lan1 sur l'hôte alpha, faites un ssh mars et à partir de là, faites un ssh alpha.lan2 .) J'utilise donc un hôte linux (CentOS 7) nommé mars comme un saut SSH :

  • mars est attaché aux deux voies lan1 et lan2 et figurant dans les listes des deux lans /etc/hosts avec l'adresse 10.20.80.55 mars
  • Est-ce que les deux NICs em1 y em2 .
    em1 appartient à lan1.
    em2 appartient à lan2.

/etc/hosts de tous les ordinateurs sur lan1 et sur lan2 :

10.20.80.1  alpha
10.20.80.2  beta
...
10.20.80.55 mars  # ssh gateway connected to lan1 and lan2

Approche 1 : ip netns (fonctionne)

( Lecteurs rapides passez à l'approche 3)

J'ai utilisé les espaces de nom de réseau ip pour séparer les interfaces réseau.

C'est comme ça :

Host 'mars' with 3 network namespaces
|------------------------------------------------------------------------|
|[default/root netns]                                                    |
|                                                                        |
|                                                               lo       |
|                                                               127.0.0.1|
|------------------------------------------------------------------------|
|---------------------------------|    |---------------------------------|
|[netns lan1]                     |    |[netns lan2]                     |
|                          lo     |    |                          lo     |
|                        127.0.0.1|    |                        127.0.0.1|
|      sshd1                      |    |     sshd2                       |
|                                 |    |                                 |
|10.20.80.55/22 em1 (physical)    |    |10.20.80.55/22 em2 (physical)    |
|----------|----------------------|----|----------|----------------------|
           |                                      |
  Network 10.20.80.0/22 (lan1)           Network 10.20.80.0/22 (lan2)

Cela fonctionne et maintenant je peux faire ce qui suit à partir de l'hôte alpha dans lan1 :

ssh mars
ip netns exec lan2 bash    # Opens a bash in the network namespace 'lan2'
ssh alpha

Voilà, je suis arrivé à l'hôte alpha en lan2 !

Inconvénients :

  • Les services sur l'hôte Mars (comme ntpd) fonctionnent dans l'espace de noms réseau par défaut, qui ne comporte que l'interface de bouclage. lo et ne peut donc pas contacter un autre pair ntp.
  • sshd doit être démarré pour chaque espace de nom.
  • Pas de saut de proxy avec ssh de lan1 à lan2

Code :

Retirez tous les filets (en cas de tentatives répétées) :

#!/bin/bash
for netns in $(ip netns | awk '{print $1}'); do
  for pid in $(ip netns pids $netns); do
    kill $pid
  done
  ip netns del $netns
done

Configuration netns lan1 :

ip netns add lan1
ip link set em1 netns lan1
ip netns exec lan1 ip addr add 10.20.80.55/22 dev em1
ip netns exec lan1 ip link set em1 up
ip netns exec lan1 link set lo up
ip netns exec lan1 /usr/sbin/sshd -o PidFile=/var/run/sshd.lan1.pid

Configuration netns lan2 :

ip netns add lan2
ip link set em1 netns lan2
ip netns exec lan2 ip addr add 10.20.80.55/22 dev em1
ip netns exec lan2 ip link set em1 up
ip netns exec lan2 link set lo up
ip netns exec lan2 /usr/sbin/sshd -o PidFile=/var/run/sshd.lan2.pid

Cela a permis de créer deux espaces de noms de réseau (netns lan1 et netns lan2), d'ajouter une interface de bouclage à chaque netns et de déplacer les interfaces matérielles em1 et em2 vers chaque netns (espace de noms de réseau) respectif. De plus, il a démarré un démon SSH afin que chaque NIC soit joignable.

Approche 2 : utiliser le NAT sur l'hôte au milieu.

Au lieu d'utiliser les espaces de noms du réseau, je veux ssh mars de lan1 et de mars continuent avec un autre ssh alpha.lan2 dans lan2 (et vice versa). Je peux donc utiliser l'hôte 'mars' comme proxy pour ssh et effectuer des sauts ssh avec ssh -J mars alpha.lan2 également pour scp ou X-forwarding.

Host 'mars'
|------------------------------------------------------------------------|
|[default/root netns]                                                    |
|                                                               lo       |
|                                                               127.0.0.1|
|                                                                        |
|192.168.4.55 em1 (physical)            192.168.8.55 em2                 |
|iptables NAT to 10.20.80.55/22?        iptables NAT to 10.20.80.55/22?  |
|----------|--------------------------------------|----------------------|
           |                                      |
  Network 10.20.80.0/22 (lan1)           Network 10.20.80.0/22 (lan2)

Je veux utiliser le NAT pour ça sur Mars. /etc/hosts sur Mars (pas sur les hôtes de lan1 et lan2) :

192.168.4.1  alpha.lan1
192.168.4.2  beta.lan1
192.168.4.55 mars.lan1  # ssh gateway connected to lan1 and lan2
192.168.8.1  alpha.lan2
192.168.8.2  beta.lan2
192.168.8.55 mars.lan2  # ssh gateway connected to lan1 and lan2

Mon idée est d'affecter lan1 et lan2 à deux réseaux distincts :

# 10.20.80.0/22 (lan1) -> 192.168.4.0/22  via NIC em1
# 10.20.80.0/22 (lan2) -> 192.168.8.0/22  via NIC em2
iptables -A PREROUTING  -i em1 -j NETMAP --to 192.168.4.0/24
iptables -A POSTROUTING -o em1 -j NETMAP --to 10.20.80.0/24

C'est raté. Des questions :

  1. Cela pourrait-il fonctionner ainsi ? Quelles adresses IP dois-je attribuer à em1 et em2 ? Je suppose que je ne peux pas attribuer les adresses 10.20.80.55 à la fois à em1 et em2 sans utiliser les espaces de noms de réseau, j'ai donc essayé d'attribuer les adresses "mappées" 192.168.4.55 (à em1) et 192.168.8.55 (à em2). Mais cela signifie que les cartes réseau ne peuvent être atteintes ni par lan1 ni par lan2 (10.20.80.0/22).
    Ou bien est-il plus judicieux de procéder comme suit ?

    ip address add 192.168.4.55/22 dev em1 ip address add 192.168.8.55/22 dev em2 ip address add 10.20.80.55/22 dev em1 ip address add 10.20.80.55/22 dev em2

  2. De quelles règles iptables ai-je besoin ?

  3. Quels sont les itinéraires que je dois mettre en place finalement ?

  4. Ou dois-je suivre l'approche 3 (ci-dessous) ?

Approche 3 : utiliser le NAT avec des espaces de noms de réseau

Je pense que j'ai probablement besoin de l'approche suivante : J'ai besoin de 3 espaces de noms de réseau (un pour chacun des deux lans et un espace de noms racine) de la manière suivante :

3 network namespaces on host 'mars':

    |------------------------------------------------------------------------------------------------------|
    |127.0.0.1 lo                                                                      [default/root netns]|
    |                                                                                                      |
    |192.168.4.0/22                                       192.168.8.0/22                                   |
    |       (NAT with iptables NETMAP)                           (NAT with iptables NETMAP)              |
    |10.20.80.0/22                                        10.20.80.0/22                                    |
    |                                                                                                      |
    |192.168.0.1/24 v-root-em1 (virual)                  192.168.0.2/24 v-root-em2 (virtual)              |
    |-------|----------------------------------------------------|-----------------------------------------|
            |                                                    |
    |-------|-----------------------------------------|  |-------|-----------------------------------------|
    |192.168.1.1/24 v-peer-em1 (virtual)  [netns lan1]|  |192.168.1.1/24 v-peer-em2 (virtual)  [netns lan2]|
    |                                                 |  |                                                 |
    |                                     127.0.0.1 lo|  |                                     127.0.0.1 lo|
    |                                                 |  |                                                 |
    |192.168.1.2/24                                   |  |192.168.1.2/24                                   |
    |       (NAT)                                   |  |       (NAT)                                   |
    |10.20.80.55/22 em1 (physical)                    |  |10.20.80.55/22 em2 (physical)                    |
    |----------|--------------------------------------|  |----------|--------------------------------------|
               |                                                    |
     Network 10.20.80.0/22 (lan1)                         Network 10.20.80.0/22 (lan2)

Code utilisé pour mettre en place cette approche :

# Setup netns lan1:
ip netns add lan1
ip link set em1 netns lan1
ip netns exec lan1 ip addr add 10.20.80.55/22 dev em1
ip netns exec lan1 ip link set em1 up
ip netns exec lan1 link set lo up

# Create virtual interfaces and bridges to connect the namespace lan2 to the default (root) namespace:
ip link add v-root-em1 type veth peer name v-peer-em1
ip link set v-peer-em1 netns lan1
ip                 addr add 192.168.0.1/24 dev v-root-em1
ip netns exec lan1 addr add 192.168.1.1/24 dev v-peer-em1
ip                 link set v-root-em1 up
ip netns exec lan1 link set v-peer-em1 up

# Setup netns lan2:
ip netns add lan2
ip link set em2 netns lan2
ip netns exec lan2 ip addr add 10.20.80.55/22 dev em2
ip netns exec lan2 ip link set em2 up
ip netns exec lan2 link set lo up

# Create virtual interfaces and bridges to connect the namespace lan2 to the default (root) namespace:
ip link add v-root-em2 type veth peer name v-peer-em2
ip link set v-peer-em2 netns lan2
ip                 addr add 192.168.0.2/24 dev v-root-em2
ip netns exec lan2 addr add 192.168.1.1/24 dev v-peer-em2
ip                 link set v-root-em2 up
ip netns exec lan2 link set v-peer-em2 up

# Configure lan1:
ip route add 192.168.4.0/22 via 192.168.0.1 dev v-root-em1
ip netns exec lan1 ip route add 192.168.4.0/22 dev em1                         # Outgoing to lan1 (10.20.80.0/22)
ip netns exec lan1 ip route add 192.168.0.0/24 via 192.168.1.1 dev v-peer-em1  # Route into default/root namespace

# Configure lan2:
ip route add 192.168.8.0/22 via 192.168.0.2 dev v-root-em2
ip netns exec lan2 ip route add 192.168.8.0/22 dev em1                         # Outgoing to lan1 (10.20.80.0/22)
ip netns exec lan2 ip route add 192.168.0.0/24 via 192.168.1.1 dev v-peer-em2  # Route into default/root namespace

### Code missing to set up NAT
  1. Comment et où dois-je configurer les règles iptables ?
  2. Aurais-je besoin d'un réseau /22 pour les deux espaces de noms 'lan1' et 'lan2' au lieu d'un réseau /24 ?

Merci pour vos contributions.

Remarques :
Je recommande de désactiver l'enregistrement des clés d'hôte ssh sur 'mars' lorsque vous utilisez des espaces de noms réseau, car les clés d'hôte de lan1 entreront en conflit avec les clés d'hôte de lan2.

1voto

John Mahowald Points 28597

Vous pourriez avoir des hôtes bastion séparés, l'un connecté à lan1 et l'autre à lan2. Cependant, cela n'aide pas si vous voulez router directement de lan1 à lan2.

Ou renuméroter. C'est beaucoup plus facile si chaque hôte a une adresse IP unique. Autant le faire avec le routage et éviter le NAT.

Automatiser la renumérotation des IP est une compétence utile de toute façon. Les déménagements de centres de données ou les fusions et acquisitions entreront probablement en conflit avec votre plan d'adressage IPv4.

Si vous ne disposez pas d'un grand espace d'adressage contigu, envisagez l'IPv6. Chaque réseau local obtient son propre sous-réseau, peut-être 2001:db8:20:80::/64 et 2001:db8:20:90::/64 . Certaines configurations d'hôtes permettent un préfixe de SLAAC, plus une adresse d'hôte statique. À savoir, Linux jeton ip .

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