Linux读ip和mac对应关系,linux同一子网mac地址与IP一一对应设置

起因

在项目中,出现一次设备需要多个网口,并且每个网口都用的是同一个子网下的IP。结果服务器打流的时候,数据流总是走同一个网口。经过定位最后发现,是由于centos 7在默认内核配置下。如果同一个子网下,设备虽然有多个IP但是响应的MAC地址都是同一个,这个MAC地址会从这些同子网的网口中选择一个作为响应。这是由于linux是“weak-end host model”,与其相反的是“strong-end host model”,后者这类BSD系统就是。具体介绍可以看维基百科上的这条百科。

IP没有与MAC地址一一对应的结果是:

如果当数据流非常大的时候,会出现所有数据流都打到响应的MAC地址的网口上,导致该网口的压力非常大。

部分交换机设备会由于多个IP都是同一个MAC地址导致出现MAC异常

由于MAC地址响应可能会变化,导致部分交换机会再次出现一些MAC地址异常的问题

如果对上面的文字看完后,还是不是很理解,那么下面用图例表示下,方便理解:

faba7eb39ffc0e97543d8ab3ff4c1fad.png

上图就是CentOS7默认配置下,我这里虚拟机配置了两个网口,eth0以及eth1,之后用windows的宿主机去ping,apr -a显示的mac地址如下:

PowerShell

Internet 地址 物理地址 类型

192.168.159.166 00-0c-29-85-97-95 动态

192.168.159.167 00-0c-29-85-97-95 动态

1

2

3

Internet地址物理地址类型

192.168.159.16600-0c-29-85-97-95动态

192.168.159.16700-0c-29-85-97-95动态

响应的MAC地址都是167的MAC地址。都可以正常ping通。而如果我需要与虚拟机做交互,则实际都是走eth1这个出口作为交互的。

上文也说过了,BSD是“strong-end host model”,默认应该不用什么配置就可以一一对应。所以我开一个freeBSD的虚拟机,并做了下测试:

f3e58a25bf17777384e9b1464587eea2.png

PowerShell

Internet 地址 物理地址 类型

192.168.159.159 00-0c-29-1d-ee-39 动态

192.168.159.160 00-0c-29-1d-ee-43 动态

1

2

3

Internet地址物理地址类型

192.168.159.15900-0c-29-1d-ee-39动态

192.168.159.16000-0c-29-1d-ee-43动态

也就是默认配置下freeBSD的IP与MAC地址响应都是一一对应的。

让linux的IP与MAC地址一一对应

linux提供了很多的内核参数,我们可以通过内核参数的修改以及策略(高级)路由的形式,来手动将linux实现IP与MAC地址一一对应。

Shell

sysctl -w net.ipv4.conf.all.arp_ignore=1

sysctl -w net.ipv4.conf.all.arp_announce=2

1

2

sysctl-wnet.ipv4.conf.all.arp_ignore=1

sysctl-wnet.ipv4.conf.all.arp_announce=2

当然上面这两条是临时生效的,如果需要后续开机重启生效,我们可以加入以下配置:

Shell

cat < /etc/sysctl.d/99-arp.conf

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

EOF

sysctl -p /etc/sysctl.d/99-arp.conf

1

2

3

4

5

6

cat</etc/sysctl.d/99-arp.conf

net.ipv4.conf.all.arp_ignore=1

net.ipv4.conf.all.arp_announce=2

EOF

sysctl-p/etc/sysctl.d/99-arp.conf

这时候,你用宿主机去ping,会发现只有一个网口能响应。这时候,我们就要加入策略(高级)路由来让ping报文能够正确的到达对应的网口,则网口也能正确响应。

Shell

ip ro add 192.168.159.0/24 dev eth0 proto kernel scope link src 192.168.159.166 table 166

ip route add default via 192.168.159.2 dev eth0 table 166

ip ru add from 192.168.159.166 table 166

ip ro add 192.168.159.0/24 dev eth1 proto kernel scope link src 192.168.159.167 table 167

ip route add default via 192.168.159.2 dev eth1 table 167

ip ru add from 192.168.159.167 table 167

1

2

3

4

5

6

7

iproadd192.168.159.0/24deveth0protokernelscopelinksrc192.168.159.166table166

iprouteadddefaultvia192.168.159.2deveth0table166

ipruaddfrom192.168.159.166table166

iproadd192.168.159.0/24deveth1protokernelscopelinksrc192.168.159.167table167

iprouteadddefaultvia192.168.159.2deveth1table167

ipruaddfrom192.168.159.167table167

我们再次去ping一下166和167.然后看一下arp表:

PowerShell

Internet 地址 物理地址 类型

192.168.159.166 00-0c-29-85-97-b3 动态

192.168.159.167 00-0c-29-85-97-95 动态

1

2

3

Internet地址物理地址类型

192.168.159.16600-0c-29-85-97-b3动态

192.168.159.16700-0c-29-85-97-95动态

由于策略(高级)路由下电后是会丢失的,因此可以自己加一下脚本,比如将上诉的命令加到rc.local,这样才能开机自启。

参考资料

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值