python3发送Gratuitous ARP更新vip绑定关系
source link: https://www.cnblogs.com/MikeZhang/p/17938964/py3SendGratuitousArp20240101
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
操作系统 :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为例进行配置。
机器: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 }
机器: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
数据包打开效果:
运行效果视频可从如下渠道获取:
二、使用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个包。
抓包效果如下:
运行效果视频可从如下渠道获取:
三、使用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()
抓包结果示例:
运行效果视频可从如下渠道获取:
2) send_arp库
在GitHub上找到的一个库,是用python2写的,地址:
https://github.com/krig/send_arp.py
可以改造成兼容python3的版本,示例如下(py3ArpTest1.py):
完整代码可从如下渠道获取:
测试脚本如下(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可参考如下文章:
抓包效果如下:
四、资源下载
本文涉及资源可从如下渠道获取:
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK