• python3发送Gratuitous ARP更新vip绑定关系


    操作系统 :CentOS 7.6_x64

    Python版本:3.9.12

    FreeSWITCH版本 :1.10.9

    高可用场景下,vip切换完成后需要发送arp广播更新ip和mac地址的绑定关系,如果不及时发广播,会导致tcp重连等问题。

    今天记录下python3如何使用arp广播更新ip和mac地址的绑定关系,我将从以下几个方面进行展开:

    • Gratuitous ARP及在keepalived中的使用
    • 使用arping工具发送arp广播
    • 使用python2和python3发arp广播
    • 提供示例代码及运行效果视频

    一、Gratuitous ARP及在keepalived中的使用

    1、 Gratuitous ARP 介绍

    关于Gratuitous ARP的介绍,可以参考这里:

    https://wiki.wireshark.org/Gratuitous_ARP

     

     

    其中,有一个作用正是我们需要的:

    更新其他主机的 ARP 缓存表。

    2、Gratuitous ARP在keepalived中的使用

    2.1 安装keepalived

    keepalived官网:https://keepalived.org/

    CentOS 7.6_x64安装keepalived命令:

    yum install keepalived

    版本:1.3.5

     2.2 配置keepalived

    这里以freeswitch为例进行配置。

    1) 主机

    机器:192.168.137.32  

    vip:192.168.137.201

    路径:/etc/keepalived/keepalived.conf

    内容:

    复制代码
    ! Configuration File for keepalived
    
    global_defs {
       script_user root
       enable_script_security
       notification_email {
       }
       router_id FREESW
    }
    
    vrrp_script chk_fs {
        script "/etc/keepalived/check.sh"
        interval 2
        timeout 3
        weight -100
    }
    
    vrrp_instance VI_FREESW {
        state BACKUP
        interface enp0s3
        virtual_router_id 201
        priority 120
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
        notify_master "/etc/keepalived/notify.sh"
        virtual_ipaddress {
            192.168.137.201/24 dev enp0s3
        }
    
        track_script {
            chk_fs
        }
        smtp_alert
    
    }
    复制代码

    2) 备机

    机器:192.168.137.31

    vip:192.168.137.201

    路径:/etc/keepalived/keepalived.conf

    内容:

    复制代码
    ! Configuration File for keepalived
    
    global_defs {
       script_user root
       enable_script_security
       notification_email {
       }
       router_id FREESW
    }
    
    vrrp_script chk_fs {
        script "/etc/keepalived/check.sh"
        interval 2
        timeout 3
        weight -20
    }
    
    vrrp_instance VI_FREESW {
        state BACKUP
        interface enp0s3
        virtual_router_id 201
        priority 100
        advert_int 1
        authentication {
            auth_type PASS
            auth_pass 1111
        }
    
        virtual_ipaddress {
            192.168.137.201/24 dev enp0s3
        }
    
        track_script {
            chk_fs
        }
        smtp_alert
    
    }
    复制代码

    2.3、进程检测脚本

    路径:/etc/keepalived/check.sh

    内容:

    复制代码
    #!/bin/bash
    
    ProcNumber=`ps aux|grep [f]reeswitch | wc -l`
    
    if [ $ProcNumber -le 0 ];then
        echo "freeswitch is not run"
        echo  $(date +"%Y-%m-%d %H:%M:%S") "freeswitch exception, try restart \n" >> /etc/keepalived/check.log
        freeswitch -nc -nonat
        exit 1;
    else
        echo "freeswitch is running.."
        exit 0;
    fi
    复制代码

    2.4 master状态通知脚本

    路径:/etc/keepalived/notify.sh

    内容:

    #! /bin/bash
    
    echo  $(date +"%Y-%m-%d %H:%M:%S") "current is master" >> /etc/keepalived/notify.log

    2.5 关闭selinux

    需要关闭selinux,否则回调脚本无法被调用。

    临时关闭:

    setenforce 0

    永久关闭:

    vi /etc/sysconfig/selinux
    SELINUX=disabled

    2.6 启动keepalived

    启动keepalived服务及开机启动:

    systemctl start keepalived
    systemctl enable keepalived

     2.7 keepalived发送arp广播

     抓包命令:tcpdump -i enp0s3 arp -w arp.pcap

    数据包打开效果:

    运行效果视频可从如下渠道获取:

    关注微信公众号(聊聊博文,文末可扫码)后回复 2024010101 获取。

    二、使用arping工具发送arp广播

    arping工具可以发送arp广播,该工具需要使用root权限,否则广播无法发出去。

    参考文档:

    https://linux.die.net/man/8/arping

    也可直接在控制台输入如下命令获取帮助文档:

    man arping

     示例如下:

    ip addr add 192.168.137.202/24 dev enp0s3
    arping -U 192.168.137.202 -I enp0s3 -c 5 -b

    其中,第一条命令是添加vip,第二条命令是使用arping工具进行arp广播的发送:-c 5参数是发5个包。

    抓包效果如下:

    运行效果视频可从如下渠道获取:

    关注微信公众号(聊聊博文,文末可扫码)后回复 2024010102 获取。

    三、使用python3发arp广播

    python发送arp广播要使用rawsocket,需要具备root权限。

    目前还没有找到直接使用python3发送arp广播的库,可以自己根据原理写一个,也可以基于前人的基础进行改造(目前选用的是这个)。有两个使用python2发送arping广播的库,这里先介绍下,稍后再描述改造方法。

    1) arprequest库

    只适用于python2,地址:

    https://pypi.org/project/arprequest/

    安装:

    tar zxvf arprequest-0.3.tar.gz
    cd arprequest-0.3
    python setup.py build
    python setup.py install

    使用示例(py2ArpTest1.py):

    复制代码
    import os
    from arprequest import ArpRequest
    
    vip = "192.168.137.202"
    dev = "enp0s3"
    
    os.system("ip addr add %s/24 dev %s" % (vip,dev))
    
    ar = ArpRequest(vip,dev)
    for i in range(5): 
        ar.request()
    复制代码

    抓包结果示例:

    运行效果视频可从如下渠道获取:

    关注微信公众号(聊聊博文,文末可扫码)后回复 2024010103 获取。

    2) send_arp库

    在GitHub上找到的一个库,是用python2写的,地址:

    https://github.com/krig/send_arp.py

    可以改造成兼容python3的版本,示例如下(py3ArpTest1.py):

    完整代码可从如下渠道获取:

    关注微信公众号(聊聊博文,文末可扫码)后回复 20240101 获取。

    测试脚本如下(py3Test1.sh):

    复制代码
    #! /bin/bash
    
    ip addr add 192.168.137.202/24 dev enp0s3
    
    source /root/python39/env.sh
    /root/python39/bin/python3.9 py3ArpTest1.py enp0s3 192.168.137.202 auto 192.168.137.202 255.255.255.255
    复制代码

    关于在CentOS环境下如何使用python3.9可参考如下文章:

    抓包效果如下:

     

    运行效果视频可从如下渠道获取:
    关注微信公众号(聊聊博文,文末可扫码)后回复 2024010104 获取。

    四、资源下载

    本文涉及资源可从如下渠道获取:

    关注微信公众号(聊聊博文,文末可扫码)后回复 20240101 获取。

  • 相关阅读:
    Leetcode—2678.老人的数目【简单】
    【知识总结】金九银十offer拿到手软的前端面试题——Javascript篇(二)
    Maven工程Missing artifact 解决方法
    对不起了,QQ和微信,我选择用它!
    20个最佳实践提升Terraform工作流程|Part 2
    基于数据库(MySQL)与缓存(Redis)实现分布式锁
    电子招标初学者指南
    mysqldump 备份详解
    什么样的台灯适合学生使用?五款暑假必入护眼大路灯分享
    EasyRecovery数据恢复软件中文版免费下载v15.0绿色版
  • 原文地址:https://www.cnblogs.com/MikeZhang/p/17938964/py3SendGratuitousArp20240101