zoukankan      html  css  js  c++  java
  • LVS负载均衡中arp_ignore和arp_annonuce举例解释

    一。模拟场景

        window机器 ip  192.168.88.20  (本机局域网配置) 192.168.58.1(vmware虚拟网卡ip 作为NAT虚拟机网关)

        linux虚拟机ip 192.168.58.134(NAT模式下生成ip 网卡 eno16777736)  192.168.88.21(桥接的局域网ip 网卡eno33554984 具体过程参                     考http://blog.csdn.net/liaomin416100569/article/details/73300692   1.1.3》安装桥接虚拟网卡)

    二。解释arp_ignore和arp_announce

       机器A 需要访问机器B 首先必须知道机器B的物理地址  程序可能只知道B的ip的地址 此时A需要发送一个arp请求给B

     机器B对于该arp的请求回应方式 可以通过参数arp_ignore进行处理

     图示:

      

    模拟场景

       window机器 ip  192.168.88.20  (本机局域网配置) 192.168.58.1(vmware虚拟网卡ip 作为NAT虚拟机网关)

        linux虚拟机ip 192.168.58.134(NAT模式下生成ip 网卡 eno16777736)  192.168.88.21(桥接的局域网ip 网卡eno33554984 具体过程参                     考http://blog.csdn.net/liaomin416100569/article/details/73300692   1.1.3》安装桥接虚拟网卡)

     需要用到的命令

           ping  确定目标ip是否能通 数据链路层找到目标机器 必须通过物理地址 所以 一定会发送一个arp请求

           arp  查看目标机器的路由表 -a ip     删除  -d ip

     通过编程模拟发送arp请求
    #include "stdafx.h"
    #include <stdio.h>
    #include <winsock2.h>
    #include <iphlpapi.h>
    #pragma comment(lib,"ws2_32")
    #pragma comment(lib,"Iphlpapi")
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	//设置发起arp的源ip
    	char* srcIpChar=new char[15];
    	srcIpChar="192.168.58.1";
    	//设置需要获取物理地址的目标ip
    	char* targetIpChar=new char[15];
    	targetIpChar="192.168.58.134";
        ULONG targetIP = inet_addr(targetIpChar);
        if(targetIP==INADDR_NONE){
            fprintf(stderr,"Invalid IP: %s/n",targetIpChar);
            return -1;
        }
        ULONG macBuf[2];
        ULONG macLen = 6;
        ULONG localIP = inet_addr(srcIpChar);
        DWORD retValue = SendARP(targetIP,localIP,macBuf,&macLen);
        if(retValue!=NO_ERROR){
            fprintf(stderr,"SendARP error/n");
            return -1;
        }
        unsigned char *mac = (unsigned char*)macBuf;
        printf("%s --> ",argv[1]);
        for(int i=0; i<macLen; i++){
            printf("%.2X",mac[i]);
            if(i!=macLen-1){
                printf("-");
            }
        }
        printf("/n");
    	getchar();
    	return 0;
    }
    

    修改arp_ignore的值

      echo 状态值 默认0>/proc/sys/net/ipv4/conf/网卡名/arp_ignore
    这里存在两个网卡eno16777736和eno33554984 
      echo "1" >/proc/sys/net/ipv4/conf/eno16777736/arp_ignore
      echo "1" >/proc/sys/net/ipv4/conf/eno33554984/arp_ignore

    window的网络接口(也就是网卡)查看

        arp -a

       接口: 192.168.88.20 --- 0xb

       接口: 192.168.58.1 --- 0x11

      查看window本地路由表是否存在 linux机器 88.21和58.134的路由 (如果存在 通过 arp -d192.168.58.134 两项都删除

     C:Usersjiaozi>arp -a 192.168.58.134
          未找到 ARP 项。
      C:Usersjiaozi>arp -a 192.168.88.21
          未找到 ARP 项。

     测试通过ping是否能获取linux机器的路由 发现ping哪个ip才能获取哪个ip的路由 58.134 走的是58.1网卡 因为同一网段

    C:Usersjiaozi>ping 192.168.58.134
    
    正在 Ping 192.168.58.134 具有 32 字节的数据:
    来自 192.168.58.134 的回复: 字节=32 时间<1ms TTL=64
    
    192.168.58.134 的 Ping 统计信息:
        数据包: 已发送 = 1,已接收 = 1,丢失 = 0 (0% 丢失),
    往返行程的估计时间(以毫秒为单位):
        最短 = 0ms,最长 = 0ms,平均 = 0ms
    Control-C
    ^C
    C:Usersjiaozi>arp -a 192.168.88.21
    未找到 ARP 项。
    
    C:Usersjiaozi>arp -a 192.168.58.134
    
    接口: 192.168.58.1 --- 0x11
      Internet 地址         物理地址              类型
      192.168.58.134        00-0c-29-49-29-6c     动态


    arp_ignore的值

    0 - (默认值): 回应任何网络接口上对任何本地IP地址的arp查询请求 

       通过代码方式发起arp 使用window上不同的网络接口的ip访问linux目标地址 58.134

           srcIpChar="192.168.58.1";targetIpChar="192.168.58.134"; 获取到了 58.134的物理地址( 00-0C-29-49-29-6C/n)

           srcIpChar="192.168.88.20";targetIpChar="192.168.58.134";   获取到了linux机器 88.21的物理地址( 00-0C-29-49-29-76/n)

           arp_ignore=0时 58.1发起的arp直接可以响应到 58.134的物理地址

                                       88.20发起的arp直接响应到了 88.21的物理地址 

          所以0 是来者不拒 所有接口访问直接返回对应网络接口的物理地址

    1 - 只回答目标IP地址是来访网络接口本地地址的ARP查询请求 

          srcIpChar="192.168.58.1";argetIpChar="192.168.58.134"; 获取到了 58.134的物理地址( 00-0C-29-49-29-6C/n)

          srcIpChar="192.168.88.20";argetIpChar="192.168.58.134";  无法获取到物理地址  因为 88.20访问的明显是虚拟机88.21的网络接口(只能访问相同网络                                                                                                                    断)但是目标ip却不是88.21  是58.134 所以linux拒绝回应


    2 -只回答目标IP地址是来访网络接口本地地址的ARP查询请求,且来访IP必须在该网络接口的子网段内 (可能相同的网络接口 ip被划分为不同子网)


    arp_announce (主动发送本机ip和物理地址给目标ip)

    0 - (默认在任意网络接口(eth0,eth1lo)上的任何本地地址 

    1 -尽量避免不在该网络接口子网段的本地地址做出arp回应当发起ARP请求的源IP地址是被设置应该经由路由达到此网络接口的时候很有用.此时会检查来访IP是否为所有接口上的子网段内ip之一.如果改来访IP不属于各个网络接口上的子网段内,那么将采用级别2的方式来进行处理

    2 - 对查询目标使用最适当的本地地址.在此模式下将忽略这个IP数据包的源地址并尝试选择与能与该地址通信的本地地址.首要是选择所有的网络接口的子网中外出访问子网中包含该目标IP地址的本地地址如果没有合适的地址被发现,将选择当前的发送网络接口或其他的有可能接受到该ARP回应的网络接口来进行发送.

    其他解释

    arp_announce: (选择ARP宣告时候使用的Sender IP)

    0:使用发送(或转发)的数据包的源IP作为发送ARP请求的Sender IP(默认) ;(可使用ping -I 验证)

    1:IP数据包的目的IP属于本地某个接口的网段时,Sender IP则使用IP数据包源IP,不属于则按2处理; 

    2:忽略数据包的源IP,使用能与目标主机会话的最佳地址来作为发送ARP的Sender IP,优先选择对外接口的主IP;(loopback不是对外接口)





  • 相关阅读:
    实现死锁
    mutex互斥锁
    共享内存实现进程间通信
    无名管道进程间通信
    文件拷贝
    linux 面试
    /etc/profile、/etc/bashrc、~/.bash_profile、~/.bashrc(转载)
    统计文件中制定词汇出现的次数
    指针之间的加减法
    CSS3权威指南-浮动3
  • 原文地址:https://www.cnblogs.com/liaomin416100569/p/9331211.html
Copyright © 2011-2022 走看看