节点0

节点0

这个问题困扰了我好几天,我找不到解决办法。抱歉,标题很奇怪。这不是我的主要工作领域,我目前想不出更好的标题。

一些事实:

  • 我是共享 openstack 环境的用户
  • 我无法查看或更改底层 openstack 设置的配置
  • VM 通过 cloud-init 配置,它会安装 python-minimal、创建用户并执行apt-get dist-upgrade。除此之外,它们还通过 DHCP 和静态 IP 配置。
  • 我没有iptables在节点上配置规则。

那么,让我描述一下这个设置:

我创建了一个网络+子网 (10.0.30.10/24)。该网络连接到一个拥有两个静态路由的路由器。我还创建了两个虚拟机 (均为 ubuntu 16.04.2 LTS),它们分别拥有“主”IP (node0:10.0.30.10/24 和 node1:10.0.30.11/24) 以及另一个子网中的第二个 IP (node0:10.10.10.2/24 和 node1:10.10.20.2/24)。

我还在路由器上配置了两个静态路由,将所有内容转发10.10.10.0/24到 node0 和10.10.20.0/24node1。

+----------------------------------------+
|  test-router                           |
|  IP: 10.0.30.1/24                      |
|                                        |
|  Static routes:                        |
|  - destination_cidr = "10.10.10.0/24"  |
|    next_hop         = "10.0.30.10"     |
|  - destination_cidr = "10.10.20.0/24"  |
|    next_hop         = "10.0.30.11"     |
+----------------------------------------+
        |
        |
  +------------------------+
  |  test-network          |
  |  Subnet: 10.0.30.0/24  |
  |  Router: 10.0.30.1     |
  +------------------------+
        |
        |
        |       +---------------------+
        |       |  node0              |
        +-------+  IP: 10.0.30.10/24  |
        |       |      10.10.10.2/24  |
        |       +---------------------+
        |
        |       +---------------------+
        |       |  node1              |
        +-------+  IP: 10.0.30.11/24  |
                |      10.10.20.2/24  |
                +---------------------+

两个虚拟机启动后,我可以观察到以下情况:

节点0

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.30.1       0.0.0.0         UG    0      0        0 ens3
10.0.30.0       *               255.255.255.0   U     0      0        0 ens3
169.254.169.254 10.0.30.100     255.255.255.255 UGH   0      0        0 ens3
$ ip a
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: ens3: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1400 qdisc pfifo_fast state UP group default qlen 1000
    link/ether fa:16:3e:31:67:52 brd ff:ff:ff:ff:ff:ff
    inet 10.0.30.10/24 brd 10.0.30.255 scope global ens3
       valid_lft forever preferred_lft forever
    inet 10.10.10.2/24 scope global ens3
       valid_lft forever preferred_lft forever
    inet6 fe80::f816:3eff:fe31:6752/64 scope link
       valid_lft forever preferred_lft forever
$ ping -c10 10.10.20.2
PING 10.10.20.2 (10.10.20.2) 56(84) bytes of data.
From 10.0.30.1: icmp_seq=2 Redirect Host(New nexthop: 10.0.30.11)
From 10.0.30.1: icmp_seq=3 Redirect Host(New nexthop: 10.0.30.11)

--- 10.10.20.2 ping statistics ---
10 packets transmitted, 0 received, 100% packet loss, time 8999ms

$ route
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use Iface
default         10.0.30.1       0.0.0.0         UG    0      0        0 ens3
10.0.30.0       *               255.255.255.0   U     0      0        0 ens3
10.10.10.0      *               255.255.255.0   U     0      0        0 ens3
169.254.169.254 10.0.30.100     255.255.255.255 UGH   0      0        0 ens3

同时在节点1上

# tcpdump icmp
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on ens3, link-type EN10MB (Ethernet), capture size 262144 bytes
09:25:55.451876 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 1, length 64
09:25:55.451928 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 1, length 64
09:25:56.451467 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 2, length 64
09:25:56.451503 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 2, length 64
09:25:57.451185 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 3, length 64
09:25:57.451218 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 3, length 64
[..]
09:26:03.450910 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 9, length 64
09:26:03.450943 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 9, length 64
09:26:04.450988 IP 10.0.30.10 > 10.10.20.2: ICMP echo request, id 1271, seq 10, length 64
09:26:04.451022 IP 10.10.20.2 > 10.0.30.10: ICMP echo reply, id 1271, seq 10, length 64

所以,我的结论是:节点 1 接收流量,但回复没有到达节点 0。

如果我在 node1 上启动 Web 服务器并尝试通过静态路由 IP 对其进行 curl,也会发生同样的情况。我看到流量进入 node1,但响应从未到达 node0。

另一方面:arping从node0到node1的工作方式:

# arping -c3 -i ens3 10.10.20.2
ARPING 10.10.20.2
42 bytes from fa:16:3e:a9:b4:bc (10.10.20.2): index=0 time=7.933 msec
42 bytes from fa:16:3e:a9:b4:bc (10.10.20.2): index=1 time=2.797 msec
42 bytes from fa:16:3e:a9:b4:bc (10.10.20.2): index=2 time=9.703 msec

--- 10.10.20.2 statistics ---
3 packets transmitted, 3 packets received,   0% unanswered (0 extra)
rtt min/avg/max/std-dev = 2.797/6.811/9.703/2.929 ms

如果我使用“主”IP,一切工作正常。

我尝试过的事情(在两个节点上):

  • 设置/proc/sys/net/ipv4/conf/ens3/rp_filter20(因为我很绝望)。什么都没改变。
  • 设置/proc/sys/net/ipv4/ip_forward1。没有任何变化。
  • 在两个节点上都设置/proc/sys/net/ipv4/conf/ens3/log_martians1。无任何输出journalctl -f

编辑:如果我通过静态 IP ping 节点 1,则节点 0 上有输出:

May 03 11:16:01 node0 kernel: IPv4: Redirect from 10.0.30.1 on ens3 about 10.0.30.11 ignored
                                Advised path = 10.0.30.10 -> 10.10.20.2

由于我的想法已经用尽,所以我需要你的帮助。感谢您花时间研究我的问题!

答案1

挑战:

您只有一个重要的广播域(想想物理/第 2 层网络),并且在该广播域上,您有三个 IP(逻辑)网络:

  • 10.0.30.0/24 - A
  • 10.10.10.0/24 - B
  • 10.10.20.0/24 - C

现在,您还有三台设备,每台设备位于逻辑网络的子集上:

  • 路由器 - 仅限 A
  • node0-A 和 B
  • 节点 1 – A 和 C

有趣的是,您告诉路由器 node0 负责网络 B,node1 负责网络 C,但是您没有告诉 node0 node1 负责 C,也没有告诉 node1 node0 负责 B。

这正是您所体验到的那种兴奋的秘诀。

当路由器从节点 0 收到发往网络 C 上的 IP 的消息时,它的响应是:“愚蠢的节点 0,你走错方向了;你应该知道你需要前往与你共享网络的节点 1 才能到达那里”:

node0 kernel: IPv4: Redirect from 10.0.30.1 on ens3 about 10.0.30.11 ignored
                            Advised path = 10.0.30.10 -> 10.10.20.2

如果您只是为了好玩而玩子网和路由,那太好了。您找到了一种不太理想的方法,但您可以继续玩下去。

如果您尝试通过单独的网络来完成某些特定任务,您可能希望将路由器配置为直接连接到每个单独的网络(AC),并且您可能希望每个网络成为一个单独的广播域。

如果您只希望计算机能够使用配置的 IP 地址相互通信,您可以:

  • 将 10.10.10.3/24 添加到节点 1,然后
  • 将 10.10.20.3/24 添加到 node0

作为一般规则,对于路由器用于相互通信的任何网络(当您让节点 0 和节点 1 负责各自的网络(B 和 C)时,您就使它们成为路由器),您几乎肯定希望确保所有这些路由器都充分了解所有相邻网络的正确路由。路由协议可以实现这一点,但这个示例足够小,可以手动完成。

尽管有点过时,我希望这对你/其他人有帮助。

相关内容