RoCE多网卡时,报文可以过去,但是回不来

roce,网卡,报文,可以,过去,但是,回不来 · 浏览次数 : 183

小编点评

**8个路由table实现源地址路由再回到问题** **步骤1:添加源地址 ruleip rule add from 192.168.1.2 table 100** **步骤2:设置路由规则ip route add 172.25.2.0/24 via 192.168.1.5 table 100** **步骤3:分散路由规则到各个世界** **步骤4:每个世界设置一个路由规则** **步骤5:每个世界设置一个路由规则** **步骤6:每个世界设置一个路由规则** **步骤7:每个世界设置一个路由规则** **步骤8:每个世界设置一个路由规则** **步骤9:每个世界设置一个路由规则** **步骤10:每个世界设置一个路由规则** **步骤11:每个世界设置一个路由规则** **步骤12:每个世界设置一个路由规则** **步骤13:每个世界设置一个路由规则** **步骤14:每个世界设置一个路由规则** **步骤15:每个世界设置一个路由规则** **步骤16:每个世界设置一个路由规则** **步骤17:每个世界设置一个路由规则** **步骤18:每个世界设置一个路由规则** **步骤19:每个世界设置一个路由规则** **步骤20:每个世界设置一个路由规则** **步骤21:每个世界设置一个路由规则** **步骤22:每个世界设置一个路由规则** **步骤23:每个世界设置一个路由规则** **步骤24:每个世界设置一个路由规则** **步骤25:每个世界设置一个路由规则** **步骤26:每个世界设置一个路由规则** **步骤27:每个世界设置一个路由规则** **步骤28:每个世界设置一个路由规则** **步骤29:每个世界设置一个路由规则** **步骤30:每个世界设置一个路由规则** **步骤31:每个世界设置一个路由规则** **步骤32:每个世界设置一个路由规则** **步骤33:每个世界设置一个路由规则** **步骤34:每个世界设置一个路由规则** **步骤35:每个世界设置一个路由规则** **步骤36:每个世界设置一个路由规则** **步骤37:每个世界设置一个路由规则** **步骤38:每个世界设置一个路由规则** **步骤39:每个世界设置一个路由规则** **步骤40:每个世界设置一个路由规则** **步骤41:每个世界设置一个路由规则** **步骤42:每个世界设置一个路由规则** **步骤43:每个世界设置一个路由规则** **步骤44:每个世界设置一个路由规则** **步骤45:每个世界设置一个路由规则** **步骤46:每个世界设置一个路由规则** **步骤47:每个世界设置一个路由规则** **步骤48:每个世界设置一个路由规则** **步骤49:每个世界设置一个路由规则** **步骤50:每个世界设置一个路由规则** **步骤51:每个世界设置一个路由规则** **步骤52:每个世界设置一个路由规则** **步骤53:每个世界设置一个路由规则** **步骤54:每个世界设置一个路由规则** **步骤55:每个世界设置一个路由规则** **步骤56:每个世界设置一个路由规则** **步骤57:每个世界设置一个路由规则** **步骤58:每个世界设置一个路由规则** **步骤59:每个世界设置一个路由规则** **步骤60:每个世界设置一个路由规则** **步骤61:每个世界设置一个路由规则** **步骤62:每个世界设置一个路由规则** **步骤63:每个世界设置一个路由规则** **步骤64:每个世界设置一个路由规则** **步骤65:每个世界设置一个路由规则** **步骤66:每个世界设置一个路由规则** **步骤67:每个世界设置一个路由规则** **步骤68:每个世界设置一个路由规则** **步骤69:每个世界设置一个路由规则** **步骤70:每个世界设置一个路由规则** **步骤71:每个世界设置一个路由规则** **步骤72:每个世界设置一个路由规则** **步骤73:每个世界设置一个路由规则** **步骤74:每个世界设置一个路由规则** **步骤75:每个世界设置一个路由规则** **步骤76:每个世界设置一个路由规则** **步骤77:每个世界设置一个路由规则** **步骤78:每个世界设置一个路由规则** **步骤79:每个世界设置一个路由规则** **步骤80:每个世界设置一个路由规则** **步骤81:每个世界设置一个路由规则** **步骤82:每个世界设置一个路由规则** **步骤83:每个世界设置一个路由规则** **步骤84:每个世界设置一个路由规则** **步骤85:每个世界设置一个路由规则** **步骤86:每个世界设置一个路由规则** **步骤87:每个世界设置一个路由规则** **步骤88:每个世界设置一个路由规则** **步骤89:每个世界设置一个路由规则** **步骤90:每个世界设置一个路由规则** **步骤91:每个世界设置一个路由规则** **步骤92:每个世界设置一个路由规则** **步骤93:每个世界设置一个路由规则** **步骤94:每个世界设置一个路由规则** **步骤95:每个世界设置一个路由规则** **步骤96:每个世界设置一个路由规则** **步骤97:每个世界设置一个路由规则** **步骤98:每个世界设置一个路由规则** **步骤99:每个世界设置一个路由规则** **步骤100:每个世界设置一个路由规则**

正文

摘要:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了

本文分享自华为云社区《<跟唐老师学习云网络> - RoCE多网卡时,报文可以过去,但是回不来》,作者: tsjsdbd 。

一、网络概要

一台机子,接入2个子网,一个普通通信的,一个高速通信的。并且接入高速通信子网,有8张网卡。如下图:

本文描述的问题,只关注高速子网这一部分。为帮助理解问题,网络可以简化为:

每个网卡,都有分配该子网的一个IP。如下:

二、问题现象

A只能通B里面的一个IP,其余7个IP都不通。下图为A--->B 的结果:

图示:只有1个IP能通

反过来也一样,后面只讲一个方向的(A-->B)。

三、问题定位

1.先看报文有没有到达B。

如果都不能到B,说明网络接的有问题。如果到了B,但是不回来,说明路由配置可能有问题。

Ping不通的ip(228)时,在主机B上面进行抓包分析(228对应的网卡名是enp80s0f0,所以这里监听这个网卡):

tcpdump -i enp80s0f0 -n arp
listening on enp80s0f0, link-type EN10MB (Ethernet), capture size 262144 bytes
17:02:23.720556 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46
17:02:24.758954 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46
17:02:25.782954 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46
17:02:26.807063 ARP, Request who-has 29.28.195.228 tell 29.28.204.80, length 46
^C

可以看到,报文能到B。

2.但是为什么B不给A回消息呢?

于是我们来看看,当B要给A回消息时,路由怎么走的?

查看路由表:

ip route
default via 192.168.0.1 dev enp218s0 proto dhcp metric 104
29.28.192.0/20 dev enp137s0f1 proto kernel scope link src 29.28.201.211 metric 105
29.28.192.0/20 dev enp137s0f0 proto kernel scope link src 29.28.193.28 metric 106
29.28.192.0/20 dev enp80s0f1 proto kernel scope link src 29.28.204.230 metric 107
29.28.192.0/20 dev enp106s0f0 proto kernel scope link src 29.28.194.199 metric 108
29.28.192.0/20 dev enp106s0f1 proto kernel scope link src 29.28.195.31 metric 109
29.28.192.0/20 dev enp80s0f0 proto kernel scope link src 29.28.195.228 metric 110
29.28.192.0/20 dev enp234s0f1 proto kernel scope link src 29.28.197.165 metric 111
29.28.192.0/20 dev enp234s0f0 proto kernel scope link src 29.28.195.75 metric 112

根据以前学的router知识,可以看到,(排除default路由外)应该是会匹配到 第1条(标红)规则。

注:metric表示路由代价,目的子网都匹配的情况下,会选代价最低的那一条。

即 B-->A给A回消息时,报文要从 网卡enp137s0f1 发出去,并且发出去的报文源地址要设为29.28.201.211。

难怪不通,因为答非所问了嘛(回arp报文,内容对不上)。

再看为什么211这个ip能通?

因为 211 是该子网路由选择,所对应的IP,所以刚好能通。

这就解释了为什么刚好1个IP能通,另外7个不通。

3.如何让报文从哪个口收到,就从哪个口回去?

往外发报文,根据源地址来选择网卡(注意这里的源是指 主机B,因为回报文是往外发),这种场景可以称之为「源地址路由」,而要实现源地址路由,就需要用到「ip rule 路由策略」这种高级路由配置。

四、ip rule 路由策略

在配置「源地址路由」规则前,我们需要先补充一点基础知识。

1. 路由表“副本”

以前我们学的 route -n 路由表,其实属于“新手村”,即系统默认使用这张路由规则表。但就像《剑来》里面说的那样,在新手村外还有很多其他“境界”。Linux新版本(2.x之后)为实现更复杂的路由能力,将原来的“新手村”,复制了很多的“副本”。

Ps:这种增加“副本”的思路,在咱们IT领域非常常见,比如我们之前学到的各种namespace。

当前系统总的“副本”数量,在 /etc/iproute2/rt_tables 这个文件中。

255 local
254 main
253 default
0   unspec

我们之前学的 route -n 新手村表,就是其中的 254 这个副本号,名字叫做 main。

要增加副本,可以如下这么操作:

echo "$id $table" >> /etc/iproute2/rt_tables

就行了。

2. 如何决定使用哪个“副本”

为了确认使用哪个“副本”,在前面补了一个 rule 规则。

条件基本就是:源IP,目的地址,收到网口这些。

具体见:https://www.computerhope.com/unix/ip.htm

所以现在流程变成了:

  1. 新增一个副本
  2. 设置rule规则,指向这个新增的副本
  3. 往副本里面增加以前学会的route记录

比如,我们希望某个源IP为 29.28.201.211 的报文,走独立的“路由副本”策略:

  • 新建“路由副本”
echo "200 table0" >> /etc/iproute2/rt_tables
  • 增加规则,使这种报文,走该独立副本。(from表示源ip)
ip rule add from 29.28.201.211 table table0
  • 然后我们往这个“路由表副本”里面,放入以前学到的普通的路由规则:
ip route add 29.28.192.0/20 dev eth0 table table0
  • 可以确认下副本中路由是否正确
ip route show table table0
29.28.192.0/20 dev eth0 scope link

这样,我们就可以控制更复杂的路由规则了。

3. 再看“新手村”路由表

在知道路由表可以有很多“副本”之后,我们再回头看看原来那个“新手村”。

从 /etc/iproute2/rt_tables 文件内容可以知道,咱们“新手村”对应的那个路标表名字叫做main。

所以查询这个表的内容:

root@tsjsdbd:/# ip route show table main
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2

这个和我们平时看到的路由,是一样的:

root@tsjsdbd:/# ip route
default via 172.17.0.1 dev eth0
172.17.0.0/16 dev eth0 proto kernel scope link src 172.17.0.2

也就是,我们平时敲的 route -n 看到的列表,其实就是 main 这张表里面的内容。

其余表(0-local,253-default,255-local)的内容,一般不用关注。

4. rule规则匹配优先级

在rule规则表里面,很多记录的时候,匹配优先级是怎么定的?答案是每一条记录,它有个优先级的字段。如下:

[root@tsjsdbd]# ip rule
0:      from all lookup local
32766:     from all lookup main
32767:     from all lookup default

最前面的数字,就是优先级。数字越小,优先级越高,也就是会先进行匹配,同时也代表这条规则可以排的更靠前。

在 rule add 添加规则的时候,是可以指定“优先级的”。如:

ip rule add from 192.168.1.0/24 table table0 pri 333

就可以指定

在不指定优先级的情况下,会默认加到当前最小值前面(即,不指定优先值时,会加一条优先级较高的rule)。

如下:

[root@tsjsdbd]# ip rule add from 192.168.1.0/24 table table0 pri 333

上面这条会加一条333优先级的rule

[root@tsjsdbd]# ip rule add from 192.168.2.0/24 table table0

这条没指定优先级,就会加一条优先级332的(因为当前rule里面最小的是333)。

可以查询确认:

[root@tsjsdbd]# ip rule
0:  from all lookup local
332:       from 192.168.2.0/24 lookup table0
333:       from 192.168.1.0/24 lookup table0
32766:     from all lookup main
32767:     from all lookup default

删除rule的话,有几种便捷的指定方式:(优先级、条件、table)

ip rule del pri 333
ip rule del from 192.168.2.0/24
ip rule del table table0

最后注意,添加或修改了rule规则后,不会立即生效,需要 ip route flush cache 后才生效(官方文档是这么说的,自己验证的时候注意下就行)。

五、源地址路由

再回到问题上来,8个网卡,哪个口收到,要求使用该口的ip回去。可以通过8个路由table实现(因为大家的目标网段是一样的,所以在同一个table表里面话,不好写规则)。

于是,可以把8个路由规则,分散到8个“世界”中,然后通过 rule 分散后,各自进行匹配。

事实上,「源地址路由」的实现,一般都是这种套路:

  • 添加一条“源地址”的rule
ip rule add from 192.168.1.2 table 100
  • 在目标table里面,设置路由规则
ip route add 172.25.2.0/24 via 192.168.1.5 table 100

最终解决8个RoCE网卡可以互通的路由设置如下:

  • table表(8个)
/root # cat /etc/iproute2/rt_tables
200 table0
201 table1
202 table2
203 table3
204 table4
205 table5
206 table6
207 table7
  • rule表(8个)
/root # ip rule
0:     from all lookup local
32758: from 29.28.197.165 lookup table7
32759: from 29.28.195.75 lookup table6
32760: from 29.28.201.211 lookup table5
32761: from 29.28.193.28 lookup table4
32762: from 29.28.195.31 lookup table3
32763: from 29.28.194.199 lookup table2
32764: from 29.28.204.230 lookup table1
32765: from 29.28.195.228 lookup table0
32766: from all lookup main
32767: from all lookup default
  • 每个table表里面,1条路由规则
/root # ip route show table table5
29.28.192.0/20 dev enp137s0f1 scope link src 29.28.201.211

以上3步行为,通过一个脚本来完成。

六、最后

最后我们来看看,网络有问题的时候,与设置完「源地址路由」后的区别:

查询“以xx为源ip,以yy为目的ip,路由选择结果是什么”方式,

可以使用ip route get 命令。

设置前:

# ip route get 29.28.204.80 from 29.28.201.211
29.28.204.80 from 29.28.201.211 dev enp137s0f0 uid 0

设置后:

# ip route get 29.28.204.80 from 29.28.201.211
29.28.204.80 from 29.28.201.211 dev enp137s0f1 table table5 uid 0

可以看到,是按照我们的目标“哪个口来,哪个口回去”的方式运行的。

注:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了。

 

点击关注,第一时间了解华为云新鲜技术~

与RoCE多网卡时,报文可以过去,但是回不来相似的内容:

RoCE多网卡时,报文可以过去,但是回不来

摘要:虽然网卡是接入RoCE网络,但其实问题本身是单纯路由相关的,所以看的时候,不用关注RoCE,只当做一个独立子网就行了 本文分享自华为云社区《<跟唐老师学习云网络> - RoCE多网卡时,报文可以过去,但是回不来》,作者: tsjsdbd 。 一、网络概要 一台机子,接入2个子网,一个普通通信的

[转帖]RoCE、IB和TCP等网络的基本知识及差异对比

https://support.huawei.com/enterprise/zh/doc/EDOC1100203347/ 在分布式存储网络中,我们使用的协议有RoCE、Infiniband(IB)和TCP/IP。其中RoCE和IB属于RDMA(RemoteDirect Memory Access)技

带宽优化新思路:RoCE网卡聚合实现X2增长

本文分享自华为云社区《2个RoCE网卡Bond聚合,实现带宽X2》,作者: tsjsdbd 。 我们知道操作系统里面,可以将2个实际的物理网卡,合体形成一个“逻辑网卡”,从而达到如主备/提升带宽等目的。但是RoCE网卡,是否也跟普通网卡一样,支持Bond能力呢?答案是的,RoCE也可以组Bond,只

[转帖]读懂什么是RDMA

https://blog.csdn.net/tony_vip?type=blog 一.什么是RDMA 1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别? 3.使用RDMA的好处包括: 二.什么是RoCE? 1. RDMA协议包含: Infiniband(IB) 2. 为什么RoCE是目前

【转帖】读懂什么是RDMA

一.什么是RDMA 1.RDMA主要体现 2.如何理解RDMA和TCP技术的区别? 3.使用RDMA的好处包括: 二.什么是RoCE? 1. RDMA协议包含: Infiniband(IB) 2. 为什么RoCE是目前主流的RDMA协议? RoCEv1 RoCEv2 RoCE,无损先行 一.什么是R