目录

一、概述

二、分析


一、概述

一般情况下是不这么配置的,但是实际项目中总有些奇葩的甲方。在虚拟机中模拟一下这个情形。

二、分析

虚拟机中添加三个网卡,ip地址配置成同一个网段,桥接。主机的IP地址是192.168.0.109

ens33: inet 192.168.0.112  netmask 255.255.255.0  broadcast 192.168.0.255
            ether 00:0c:29:ae:cd:e2  txqueuelen 1000  (Ethernet)

ens37: inet 192.168.0.111  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:0c:29:ae:cd:ec  txqueuelen 1000  (Ethernet)

ens38: inet 192.168.0.107  netmask 255.255.255.0  broadcast 192.168.0.255
        ether 00:0c:29:ae:cd:f6  txqueuelen 1000  (Ethernet)

试着在主机上分别ping三个接口,都是通的,但是此时看mac表:

三个IP的mac都是一样的,这是为什么呢,在解释原因之前,我们先看下虚拟机上的路由,可以发现,三个接口添加了三条直连路由:

[root@localhost ~]# route -n
Kernel IP routing table
Destination     Gateway         Genmask         Flags Metric Ref    Use   Iface
192.168.0.0     0.0.0.0         255.255.255.0       U       0      0        0       ens38
192.168.0.0     0.0.0.0         255.255.255.0       U     100    0        0       ens33
192.168.0.0     0.0.0.0         255.255.255.0       U     101    0        0       ens37

这种情况下只有一条路由生效,可以使用ping 192.168.0.109发现是通的(通过抓包,发现源IP是192.168.0.108,即是从ens38口发出的;对应的ens38 metric最小,优先级最高)。

回到开始的问题,在主机上分别ping虚拟机上三个网口时,会发送arp request,对于我们目前的组网来说,每个网口都会收到arp广播,但是抓包可以发现,所有的arp都是回复的ens38口的MAC,这就是主机上对应三个虚拟机网口地址一样的直接原因。

虚拟机在arp reply的时候要查找路由,由于三个地址都是本机地址,所以从代码看arp对于这三个地址应该有三个回复,

if (arp->ar_op == htons(ARPOP_REQUEST) &&
        ip_route_input_noref(skb, tip, sip, 0, dev) == 0) {

rt = skb_rtable(skb);
        addr_type = rt->rt_type;

if (addr_type == RTN_LOCAL) {
            int dont_send;

dont_send = arp_ignore(in_dev, sip, tip);
            if (!dont_send && IN_DEV_ARPFILTER(in_dev))
                dont_send = arp_filter(sip, tip, dev);
            if (!dont_send) {
                n = neigh_event_ns(&arp_tbl, sha, &sip, dev);
                if (n) {
                    arp_send_dst(ARPOP_REPLY, ETH_P_ARP,
                             sip, dev, tip, sha,
                             dev->dev_addr, sha,
                             reply_dst);
                    neigh_release(n);
                }
            }

但实际过程中只有一个arp reply,可以用systemtap跟踪一下每个口报文的情况,这里我发现除了ens38能成功发送arp reply,其他的口对应的arp request处理在查路由时失败了,关键就在于fib_validate_source函数,fib_validate_source的逻辑是这样,如果查路由时发现目的IP是local的,要进一步进行校验,主要的方法是将sip,dip对调,再去查一遍路由,这时候要保证二者查到的接口是一致的,这就是所谓反向过滤(rp_filter)配置,你可以试着关闭,可以看到三个arp reply,虽然这也不是好事情。

if (res.type == RTN_LOCAL) {
        err = fib_validate_source(skb, saddr, daddr, tos,
                      0, dev, in_dev, &itag);
        if (err < 0)
            goto martian_source;
        goto local_input;
    }

通过上面的分析,在arp reply进行反向路由查找校验时,由于源地址是192.168.0.109,查找时一定会命中第一条直连路由,于是将ens38对应的mac回复给host。而在其他端口发送相应的arp request时就会产生冲突。

那么如果想要通过ens37访问192.168.0.109如何实现呢,我们使用ping 192.168.0.109 -I ens37,这时候没有通,再抓包,发现这次报文确实是从ens37发出的,当使用ens37 ping host时,报文发送的源mac确实是ens37的,从主机上抓包可以确认:

按照上面的分析 host回复报文目的mac是ens38的:

这个报文由于目的mac是ens38的从而导致监听ens37端口的ping无法返回。

由上我们知道,处于相同网段的几个IP之间,在进行arp reply的时候,总会使用优先级高的那条直连路由对应的mac,导致后续回包的目的MAC和目的IP不匹配,导致接收失败。如果主机上学到三个接口正确的MAC地址,就不会产生这种情况。

一种解决的方法是使用策略路由,配置如下:

  • ip rule add from 192.168.0.111 table 20
  • ip route add default via 192.168.0.1 dev ens37 table 20
  • ip route add 192.168.0.0/24 dev ens37 src 192.168.0.111 table 20

目的是配置在同一网段ip时产生的直连路由不产生冲突。如主机请求ens37的mac时,在arp reply时查反向路由,由于src ip匹配了,会去table 20中查找路由,命中table 20中的直连路由,从而以ens37的mac进行回应(在未配置策略路由的情况下,到ens38的广播报文总是匹配优先级高的路由),ens37的目的mac正确时就能正常转发到网卡ens37了。

多网卡配置同一网段IP情况解析相关推荐

  1. linux网卡配置文件中2个ip,Linux Centos 7系统中如何一个网卡配置多个IP

    因最近笔者在工作遇到这样一种情况,对多台服务器做组网规划的时候,客户方给出的IP数量有限, 不够每一台主机都分配到IP,但笔者又想了一下,不一定每台服务都得使用DCN网地址, 因此笔者想到可以对必须使 ...

  2. Linux下 单网卡配置多个ip方法

    Linux下配置网卡ip别名何谓ip别名? 用windows的话说,就是为一个网卡配置多个ip. 什么场合增加ip别名能派上用场? 布网需要.多ip访问测试.特定软件对多ip的需要-and so on ...

  3. Centos7 网卡配置及静态IP配置

    最近过年闲着没事干,打算补充一波k8s的文章,但本地只有ubuntu18.04而没有centos7(因为一般来说服务器部署都是在Centos7上进行),所以我就在我的VMware上安装了一个最小化的C ...

  4. linux网卡配置多个IP详解

    目录 1.使用nmtui命令给网卡配置多个IP地址 2.重新启动网卡服务 3.检查配置的IP地址是否连通 4.在/home/wwwroot目录中创建用于保存不同网站数据的3个目录,并向数据中写入数据 ...

  5. ubuntu配置多网段IP

    ubuntu配置多网段IP 我window本地已经配置好多个网段ip了,本地 ping 24 网段能够ping 通.但在虚拟机上却没办法ping通. ping不通的话,mount也没办法mount. ...

  6. 固定linux虚拟机ip地址,虚拟机下linux 系统网卡配置、固定IP地址

    1.进入该目录下修改内容 vi       /etc/sysconfig/network-scripts/  ifcfg-eth0 TYPE=Ethernet BOOTPROTO=static DEF ...

  7. linux环境下单网卡配置多个IP地址(详细)

    1.使用命令进行配置 这就很简单了,首先查看一下当前机器的IP地址,命令如下: [html]  view plain copy #ifconfig eth0       Link encap:Ethe ...

  8. linux 网卡配置不一致,linux环境下,双网卡配置不同网段后,路由问题

    最近,新上线了10几台服务器,系统是centos 6.0 按照以前的惯例,配置服务器生产网络和维护网络.每台服务器的eth0 配置ip为生产网络,eth3配置为维护网络,生产网络和维护网络,物理上隔离 ...

  9. Linux多网卡不通网段,[转载]linux环境下,双网卡配置不同网段后,路由问题

    最近,新上线了10几台服务器,系统是centos 6.0 按照以前的惯例,配置服务器生产网络和维护网络.每台服务器的eth0 配置ip为生产网络,eth3配置为维护网络,生产网络和维护网络,物理上隔离 ...

  10. linux多网卡配置ip地址(linux一个网卡配置多个ip)

    Linux如何配置ip地址 1.打开Linux终端系统,然后在系统中输入如下代码. 2.然后开始填写ip地址.子网掩码.网关等命令代码,如图所示. 3.在终端填写完之后,进行保存然后退出. 4.接着把 ...

最新文章

  1. 【笔记】2010-11-25记录
  2. 配置CentOS的网络环境
  3. Objective-C 文件夹操作
  4. 浅谈Python中的编码规则
  5. 开发转测试没人要_前端开发,测试,后端,该如何选择?
  6. C++基础知识(四)—— 操作符/运算符
  7. 移动端适配方案(上)
  8. 28和lba48命令格式区别_常用命令使用
  9. codeigniter mysql 存储过程_Codeigniter框架使用Mysql存储过程的例子
  10. tftp拷贝linux文件夹,CentOS下使用TFTP向目标板传送文件
  11. [CISCN2019 总决赛 Day2 Web1]Easyweb
  12. 百度地图开放平台web api 获取某项目方圆一公里的poi信息
  13. 解决xshell中数字小键盘不能使用的问题
  14. “2022绿色智能制造创赢计划”全新集结:加入这个朋友圈,成为未来主角
  15. win10桌面右键一直转圈是什么原因
  16. gofpdf 学习笔记
  17. 微信企业号开发-如何建立连接
  18. DELL R730xd 安装PCIE SSD 后风扇转速增高的解决方案
  19. 大一计算机基础excel文档,大一计算机应用基础办公自动化软件深入Excel复习用PPT课件.ppt...
  20. 失眠睡不着觉怎么办?这些助眠好物帮助你走出失眠

热门文章

  1. SQL查询1-12月的数据
  2. VirtualBox中增强工具的安装
  3. Activity中的setDefaultKeyMode() (转载)
  4. sql 保留整数_Spark 3.0发布啦,改进SQL,弃Python 2,更好的兼容ANSI SQL,性能大幅提升...
  5. BZOJ3457 : Ring
  6. FireEye实验室在一次水坑式攻击中发现IE 0DAY
  7. 个人信息保护须形成更大合力
  8. Spring Batch完整入门实践
  9. Java 数组的 12 个常用操作
  10. 小猿圈之测试用例的八大要素