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可参考如下文章:
https://www.cnblogs.com/MikeZhang/p/centos7-install-py39-20220704.html

抓包效果如下:

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

四、资源下载

本文涉及资源可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240101 获取。

相关推荐
迅猛龙办公室6 分钟前
python实现简单进度条
java·前端·python
郝学胜_神的一滴9 分钟前
AI 编程智能体 06:用Anaconda搞定Python多环境,彻底告别版本兼容灾难
人工智能·python
清水白石00810 分钟前
Python 对象模型深度解析:从“一切皆对象”到 id、type、isinstance 底层机制与小整数缓存原理
开发语言·python·缓存
for_ever_love__14 分钟前
Python 进阶——迭代器、生成器、装饰器与 asyncio
python·装饰器·生成器·大模型开发
5G微创业18 分钟前
去水印API如何实现技术变现
python·sdk·短视频
for_ever_love__28 分钟前
模块与包——import 机制与 requirements 管理依赖
python·模块·大模型开发·依赖管理
郝学胜-神的一滴29 分钟前
AI 编程智能体 05:拆解智能体分级体系、类型与全行业落地场景
开发语言·人工智能·python·程序人生·pycharm
小小张说故事32 分钟前
Python 装饰器把函数"搞丢"了?5 个必踩的坑与完整避坑对照表
后端·python
for_ever_love__43 分钟前
容器类型全家桶——list、tuple、dict、set 与推导式
python·容器·数据类型·大模型开发
外收内放1 小时前
Python基础语法练习题(43-44)
开发语言·python