如何使用属于两个网络且具有相同 IP 地址的 Linux 主机连接两个具有相同网络地址的网络?

如何使用属于两个网络且具有相同 IP 地址的 Linux 主机连接两个具有相同网络地址的网络?

我有两个克隆网络(局域网1局域网2) 用于测试目的,每个具有相同的地址空间10.20.80.0/22

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

它们没有连接,也不打算以开关的方式连接。
但我希望有办法通过 SSH 在 lan1 和 lan2 之间移动。(从主机 alpha 上的 lan1 执行 ,ssh mars然后从那里执行ssh alpha.lan2。)因此,我使用一个名为 (CentOS 7) 的 Linux 主机mars作为 SSH 跳转:

  • mars连接到两个局域网lan1lan2并在两个局域网中列出,/etc/hosts地址为10.20.80.55 mars
  • 拥有两个网卡 em1em2.
    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)

这基本上是可行的,现在我可以从 lan1 中的主机 alpha 执行以下操作:

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

瞧!我到达了 lan2 的主机 alpha!

缺点:

  • 主机 mars 上的服务(例如 ntpd)在默认网络命名空间中运行,该命名空间仅具有环回接口lo,因此无法联系任何其他 ntp 对等体。
  • 必须为每个命名空间启动 sshd
  • 使用 ssh 从 lan1 到 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 守护进程,以便每个 NIC 都可以访问。

方法 2:在中间主机上使用 NAT

我不想使用网络命名空间,而是想ssh mars从 lan1 和 mars 继续从另一个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. 可以这样吗?我应该为 em1 和 em2 分配哪些 IP 地址?我认为我不能10.20.80.55同时为em1 和 em2 分配实际 IP 地址em2 不使用网络命名空间,因此我尝试分配“映射”地址 192.168.4.55(给 em1)和 192.168.8.55(给 em2)。但这意味着 NIC 无法从 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. 我是否也需要为两个命名空间“lan1”和“lan2”使用 /22 网络而不是 /24 网络?

感谢您的贡献。

备注:
我建议在使用网络命名空间时禁用在“mars”上保存 ssh 主机密钥,因为来自 lan1 的主机密钥将与来自 lan2 的主机密钥冲突。

答案1

可以有单独的堡垒主机,一个连接到 lan1,另一个连接到 lan2。但是,如果您想直接从 lan1 路由到 lan2,这无济于事。

或者重新编号。如果每个主机都有唯一的 IP 地址,那就容易多了。不妨使用路由并跳过 NAT。

无论如何,自动 IP 重新编号是一项有用的技能。数据中心迁移或合并和收购可能会与您的 IPv4 地址计划发生冲突。

如果您没有太多连续的地址空间,请考虑 IPv6。每个 LAN 都有自己的子网,也许2001:db8:20:80::/642001:db8:20:90::/64。一些主机配置允许来自 SLAAC 的前缀,加上静态主机地址。即 Linuxip 令牌

相关内容