翼度科技»论坛 编程开发 python 查看内容

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

7

主题

7

帖子

21

积分

新手上路

Rank: 1

积分
21
操作系统 :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
内容:
  1. ! Configuration File for keepalived
  2. global_defs {
  3.    script_user root
  4.    enable_script_security
  5.    notification_email {
  6.    }
  7.    router_id FREESW
  8. }
  9. vrrp_script chk_fs {
  10.     script "/etc/keepalived/check.sh"
  11.     interval 2
  12.     timeout 3
  13.     weight -100
  14. }
  15. vrrp_instance VI_FREESW {
  16.     state BACKUP
  17.     interface enp0s3
  18.     virtual_router_id 201
  19.     priority 120
  20.     advert_int 1
  21.     authentication {
  22.         auth_type PASS
  23.         auth_pass 1111
  24.     }
  25.     notify_master "/etc/keepalived/notify.sh"
  26.     virtual_ipaddress {
  27.         192.168.137.201/24 dev enp0s3
  28.     }
  29.     track_script {
  30.         chk_fs
  31.     }
  32.     smtp_alert
  33. }
复制代码
2) 备机
机器:192.168.137.31
vip:192.168.137.201
路径:/etc/keepalived/keepalived.conf
内容:
  1. ! Configuration File for keepalived
  2. global_defs {
  3.    script_user root
  4.    enable_script_security
  5.    notification_email {
  6.    }
  7.    router_id FREESW
  8. }
  9. vrrp_script chk_fs {
  10.     script "/etc/keepalived/check.sh"
  11.     interval 2
  12.     timeout 3
  13.     weight -20
  14. }
  15. vrrp_instance VI_FREESW {
  16.     state BACKUP
  17.     interface enp0s3
  18.     virtual_router_id 201
  19.     priority 100
  20.     advert_int 1
  21.     authentication {
  22.         auth_type PASS
  23.         auth_pass 1111
  24.     }
  25.     virtual_ipaddress {
  26.         192.168.137.201/24 dev enp0s3
  27.     }
  28.     track_script {
  29.         chk_fs
  30.     }
  31.     smtp_alert
  32. }
复制代码
2.3、进程检测脚本
路径:/etc/keepalived/check.sh
内容:
  1. #!/bin/bash
  2. ProcNumber=`ps aux|grep [f]reeswitch | wc -l`
  3. if [ $ProcNumber -le 0 ];then
  4.     echo "freeswitch is not run"
  5.     echo  $(date +"%Y-%m-%d %H:%M:%S") "freeswitch exception, try restart \n" >> /etc/keepalived/check.log
  6.     freeswitch -nc -nonat
  7.     exit 1;
  8. else
  9.     echo "freeswitch is running.."
  10.     exit 0;
  11. fi
复制代码
2.4 master状态通知脚本
路径:/etc/keepalived/notify.sh
内容:
  1. #! /bin/bash
  2. echo  $(date +"%Y-%m-%d %H:%M:%S") "current is master" >> /etc/keepalived/notify.log
复制代码
2.5 关闭selinux
需要关闭selinux,否则回调脚本无法被调用。
临时关闭:
  1. setenforce 0
复制代码
永久关闭:
  1. vi /etc/sysconfig/selinux
  2. SELINUX=disabled
复制代码
2.6 启动keepalived
启动keepalived服务及开机启动:
  1. systemctl start keepalived
  2. 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

 示例如下:
  1. ip addr add 192.168.137.202/24 dev enp0s3
  2. 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/
安装:
  1. tar zxvf arprequest-0.3.tar.gz
  2. cd arprequest-0.3
  3. python setup.py build
  4. python setup.py install
复制代码
使用示例(py2ArpTest1.py):
  1. import os
  2. from arprequest import ArpRequest
  3. vip = "192.168.137.202"
  4. dev = "enp0s3"
  5. os.system("ip addr add %s/24 dev %s" % (vip,dev))
  6. ar = ArpRequest(vip,dev)
  7. for i in range(5):
  8.     ar.request()
复制代码
抓包结果示例:

运行效果视频可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 2024010103 获取。2) send_arp库
在GitHub上找到的一个库,是用python2写的,地址:
https://github.com/krig/send_arp.py
可以改造成兼容python3的版本,示例如下(py3ArpTest1.py):

完整代码可从如下渠道获取:
关注微信公众号(聊聊博文,文末可扫码)后回复 20240101 获取。测试脚本如下(py3Test1.sh):
  1. #! /bin/bash
  2. ip addr add 192.168.137.202/24 dev enp0s3
  3. source /root/python39/env.sh
  4. /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 获取。


来源:https://www.cnblogs.com/MikeZhang/p/17938964/py3SendGratuitousArp20240101
免责声明:由于采集信息均来自互联网,如果侵犯了您的权益,请联系我们【E-Mail:cb@itdo.tech】 我们会及时删除侵权内容,谢谢合作!

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x

举报 回复 使用道具