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地址如下:

  Internet 地址         物理地址              类型
  192.168.159.166       00-0c-29-85-97-95     动态
  192.168.159.167       00-0c-29-85-97-95     动态

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

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

  Internet 地址         物理地址              类型
  192.168.159.159       00-0c-29-1d-ee-39     动态
  192.168.159.160       00-0c-29-1d-ee-43     动态

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

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

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

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

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

cat <<EOF > /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报文能够正确的到达对应的网口,则网口也能正确响应。

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

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

  Internet 地址         物理地址              类型
  192.168.159.166       00-0c-29-85-97-b3     动态
  192.168.159.167       00-0c-29-85-97-95     动态

由于策略(高级)路由下电后是会丢失的,因此可以自己加一下脚本,比如将上诉的命令加到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