Ubuntu

通過路由器上的靜態路由的流量找不到返回的路

  • March 19, 2019

這個問題困擾了我幾天,我找不到解決方案。對不起,奇怪的標題。這不是我的主要工作領域,我目前想不出更好的標題。

一些事實:

  • 我是共享 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 和節點 1:10.10.20.2/24)。

我還在路由器上配置了兩條靜態路由,將所有內容轉發10.10.10.0/24到 node0 並將所有內容轉發10.10.20.0/24到 node1。

+----------------------------------------+
|  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

同時在node1上

# 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

所以,我的結論是:node1 接收到流量,但回复沒有到達 node0。

如果我在 node1 上啟動一個網路伺服器並嘗試通過靜態路由 IP 捲曲它,也會發生同樣的情況。我看到 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_martians為。1沒有任何輸出journalctl -f

編輯:如果我通過靜態 IP ping node1,則 node0 上有輸出:

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

由於我的想法不多了,我需要你的幫助。感謝您花時間研究我的問題!

挑戰:

您只有一個重要的廣播域(考慮物理/第 2 層網路),並且在該廣播域上,您有三個 IP(邏輯)網路:

  • 10.0.30.0/24 - 一個
  • 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的收費。

這是您正在經歷的那種興奮的秘訣。

當路由器從 node0 收到一條發往網路 C 上的 IP 的消息時,它的響應是:“愚蠢的 node0,你走錯了方向;你應該知道你需要去 node1,你也與之共享一個網路來獲取那裡”:

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 添加到 node1,然後
  • 將 10.10.20.3/24 添加到 node0

作為一般規則,對於路由器用來相互通信的任何網路(當你讓 node0 和 node1 負責它們自己的網路(B 和 C)時,你就讓它們成為路由器),你幾乎肯定要確保所有這些路由器中的大部分都完全了解所有相鄰網路的正確路由。路由協議可以解決這個問題,但是這個範例足夠小,可以手動完成。

我希望這對您/其他人有所幫助,儘管有點過時了。

引用自:https://serverfault.com/questions/847961