Назад | Перейти на главную страницу

Как соединить две сети с одним и тем же сетевым адресом, используя хост Linux, который является частью обеих сетей с одним и тем же IP-адресом?

У меня две клонированные сети (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-переход:

/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!

Недостатки:

Код:

Удалите все 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

Это не удается. Вопросы:

  1. Могло ли так работать? Какие IP-адреса назначить em1 и em2? Полагаю, я не могу назначить фактический 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
  1. Какие правила iptables мне нужны?
  2. Какие маршруты я настраиваю окончательно?
  3. Или я должен следовать подходу 3 (ниже)?

Подход 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
  1. Как и где мне тогда нужно настроить правила iptables?
  2. Нужна ли мне также сеть / 22 для двух пространств имен «lan1» и «lan2» вместо / 24?

Спасибо за ваш вклад.

Примечания:
Я рекомендую отключить сохранение ключей хоста 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.