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地址异常的问题

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

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

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

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

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

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

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

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

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

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

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

参考资料

Multiple NICs with IPs from same network at Linux host respond to a single MAC

Ubuntu Linux – multiple NICs, same LAN… ARP responses always go out a single NIC

Two network interfaces and two IP addresses on the same subnet in Linux

Appendix C: Strong End System Model / Weak End System Model

Host model

linux kernel documentation networking ip-sysctl

转载请注明: 转载自elkPi.com

本文链接地址: linux同一子网mac地址与IP一一对应设置

发表评论

电子邮件地址不会被公开。 必填项已用*标注

Scroll to top