У меня две клонированные сети (lan1 и lan2), используемые для тестирования, каждый с одним и тем же адресным пространством 10.20.80.0/22
:
# 10.20.80.0/22
10.20.80.0 # first address
...
10.20.83.254 # last address
Они не подключены и не предназначены для подключения в виде переключателей.
Но я хочу иметь возможность перемещаться между lan1 и lan2 через SSH. (С lan1 на хост-альфа выполните ssh mars
и оттуда сделайте ssh alpha.lan2
.) Итак, я использую (CentOS 7) хост Linux с именем mars
как SSH-переход:
mars
прикреплен к обоим ланам lan1
и lan2
и перечислен в обоих ланах /etc/hosts
с адресом 10.20.80.55 mars
em1
и em2
.em1
принадлежит lan1.em2
принадлежит lan2. /etc/hosts
всех компьютеров на lan1
и дальше lan2
:
10.20.80.1 alpha
10.20.80.2 beta
...
10.20.80.55 mars # ssh gateway connected to lan1 and lan2
Подход 1: ip netns (рабочий)
(Быстрые читатели перейти к подходу 3)
Я использовал пространства имен IP-сети для разделения сетевых интерфейсов
Это выглядит так:
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)
Это в основном работает, и теперь я могу сделать следующее с хоста alpha на lan1:
ssh mars
ip netns exec lan2 bash # Opens a bash in the network namespace 'lan2'
ssh alpha
Вуаля, я прибыл на хост-альфу в lan2!
Недостатки:
lo
и поэтому не может связаться ни с одним другим узлом ntp.Код:
Удалите все netns (для повторных попыток):
#!/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
Настроить 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
Настроить 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
Это создало два сетевых пространства имен (netns lan1 и netns lan2), добавило петлевой интерфейс к каждой netns и переместило аппаратные интерфейсы em1 и em2 в каждую соответствующую netns (сетевое пространство имен). Более того, он запустил SSH Daemon, чтобы каждый сетевой адаптер был доступен.
Подход 2: используйте NAT на промежуточном узле
Вместо использования сетевых пространств имен я хочу ssh mars
с lan1 и с марса продолжить с другого ssh alpha.lan2
в lan2 (и наоборот). Так что я могу использовать хост 'mars' в качестве прокси для ssh и выполнять прыжки по ssh с ssh -J mars alpha.lan2
, также для scp или 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)
Я хочу использовать для этого NAT на марсе. /etc/hosts
на марсе (не на хостах на lan1 и 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
Моя идея состоит в том, чтобы сопоставить lan1 и lan2 с двумя разными сетями:
# 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
Это не удается. Вопросы:
10.20.80.55
к обоим em1 и em2 без использования сетевых пространств имен, поэтому я попытался назначить «сопоставленные» адреса 192.168.4.55 (для em1) и 192.168.8.55 (для em2). Но это означает, что к сетевым адаптерам нельзя подключиться ни с lan1, ни с lan2 (10.20.80.0/22).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
Подход 3: используйте NAT с сетевыми пространствами имен
Я думаю, что мне, вероятно, понадобится следующий подход: мне нужно 3 сетевых пространства имен (по одному для каждого из двух каналов и одно корневое пространство имен) следующим образом:
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 (virtual) 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)
Используемый код для настройки этого подхода:
# 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
Спасибо за ваш вклад.
Примечания:
Я рекомендую отключить сохранение ключей хоста ssh на 'mars' при использовании сетевых пространств имен, потому что ключи хоста от lan1 будут конфликтовать с ключами хоста от lan2.
Могут быть отдельные хосты-бастионы, один из которых подключен к lan1, а другой - к lan2. Однако это не помогает, если вы хотите проложить маршрут напрямую с lan1 на lan2.
Или изменить нумерацию. Намного проще, если у каждого хоста будет уникальный IP-адрес. Можно также сделать это с помощью маршрутизации и пропустить NAT.
В любом случае автоматизация перенумерации IP-адресов - полезный навык. Перенос центров обработки данных или слияния и поглощения, вероятно, будут противоречить вашему плану адресов IPv4.
Если у вас не так много непрерывного адресного пространства, рассмотрите IPv6. У каждой LAN есть своя подсеть, возможно 2001:db8:20:80::/64
и 2001:db8:20:90::/64
. Некоторые конфигурации хоста позволяют использовать префикс из SLAAC плюс статический адрес хоста. А именно Linux токен IP.