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 voieslan1
etlan2
et figurant dans les listes des deux lans/etc/hosts
avec l'adresse10.20.80.55 mars
- Est-ce que les deux NICs
em1
yem2
.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 :
-
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
-
De quelles règles iptables ai-je besoin ?
-
Quels sont les itinéraires que je dois mettre en place finalement ?
-
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
- Comment et où dois-je configurer les règles iptables ?
- 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.