操作系统 :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 获取。

python3发送Gratuitous ARP更新vip绑定关系的更多相关文章

  1. ARP协议具体解释之Gratuitous ARP(免费ARP)

    ARP协议具体解释之Gratuitous ARP(免费ARP) Gratuitous ARP(免费ARP) Gratuitous ARP也称为免费ARP.无故ARP.Gratuitous ARP不同于 ...

  2. ARP协议详解之Gratuitous ARP(免费ARP)

    ARP协议详解之Gratuitous ARP(免费ARP) Gratuitous ARP(免费ARP) Gratuitous ARP也称为免费ARP,无故ARP.Gratuitous ARP不同于一般 ...

  3. ARP协议抓包之帧长度和Gratuitous ARP的问题

    用Winpcap编程构造ARP包选择网卡并发出,遇到若干问题,学到了许多新知识,但是有的还尚未解决,在这里记录下没解决的和解决的问题. 先来看下ARP协议的格式,ARP字段有28个字节,发到以太网中还 ...

  4. ARP、Proxy ARP、Gratuitous ARP

    Proxy ARP 什么是Proxy ARP? 一个主机A(通常是路由器)有意应答另一个主机B的ARP请求(ARP requests).主机A通过伪装其身份,承担起将分组路由到真实目的地的责任.代理A ...

  5. python3对比python2的更新点

    python3对比python2的更新点: Python2官方基础模块:urllib2 第三方功能包:requests python3中urllib库和urilib2库合并成了urllib库. 其中u ...

  6. Winform将FastReport的report与PreviewControl建立绑定关系

    场景 FastReport安装包下载.安装.去除使用限制以及工具箱中添加控件: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/10 ...

  7. Maven 生命周期的阶段与插件的目标之间的绑定关系

    clean 生命周期 clean 生命周期的阶段 插件的目标 pre-clean clean maven-clean-plugin:clean post-clean default 生命周期的内置插件 ...

  8. Rest-Assured:发送PATCH请求:更新Hello-imook(java.lang.IllegalArgumentException: Invalid number of path parameters. Expected 2, was 0. Undefined path parameters are: owner, repo.)

    代码: /*     * 发送PATCH请求:更新Hello-imook     */    @Test    public void test003_PatchMethod() {        S ...

  9. ANDROID_MARS学习笔记_S02_006_APPWIDGET3_AppWidget发送广播及更新AppWidget

    一.简介 二.代码1.xml(1)example_appwidget.xml <?xml version="1.0" encoding="utf-8"?& ...

  10. Python3发送post请求,自动记住cookie

    转载自:http://www.cnblogs.com/meitian/p/4607737.html 在做登录的post请求时,需要记住cookie,否则不能访问登录后的页面. 下面是登录的代码: #c ...

随机推荐

  1. MySQL 高级(进阶) SQL 语句

    MySQL 高级(进阶) SQL 语句 use gy; create table location (Region char(20),Store_Name char(20)); insert into ...

  2. Installing Gradle

    Chapter 4. Installing Gradle 4.1. Prerequisites Gradle requires a Java JDK or JRE to be installed, v ...

  3. CF1368B

    题目简化和分析: 因为要求长度最小,所以我们每个字符就应该发挥最大的价值,不会有没有作用的字符. 设有 \(x_1\) 个 \(c\) ,\(x_2\) 个 \(o\) ,\(x_3\) 个 \(d\ ...

  4. 老派Sql之必要,逆天,我在ef core中使用ado.net!

    Wlkr.Core.EFCore 逆天,我在ef core中使用ado.net! 老派Sql之必要 当你开发生涯中基本只用一两种数据库 当你觉得用EF的类写报表时很别扭 当你觉自己的Sql( Serv ...

  5. AtCoder Beginner Contest 321(ABC321)

    A. 321-like Checker 直接模拟. Code B. Cutoff 直接暴力枚举 \([0\sim100]\),每次把第 \(n\) 个数当作当前枚举的 \(i\),然后看看条件是否满足 ...

  6. Redis常用命令-实战篇

    目录 写在前面 连接操作命令 持久化 远程服务控制 对value操作的命令 操作字符串String命令 List Set Hash 写在前面 java 操作 redis 太常见了,基本上有需要的系统, ...

  7. tomcat nio2源码分析

    一. 前言 ​ 最近在看tomcat connector组件的相关源码,对Nio2的异步回调过程颇有兴趣,平时读源码不读,自己读的时候很多流程都没搞明白,去查网上相关解析讲的给我感觉也不是特别清晰,于 ...

  8. 使用 Docker Compose 部署 RabbitMQ 的一些经验与踩坑记录

    前言 RabbitMQ 是一个功能强大的开源消息队列系统,它实现了高效的消息通信和异步处理. 本文主要介绍其基于 Docker-Compose 的部署安装和一些使用的经验. 特点 成熟,稳定 消息持久 ...

  9. JVM是如何处理反射的

    反射实现1-调用本地方法 例: 1 // v0版本 2 import java.lang.reflect.Method; 3 4 public class Test { 5 public static ...

  10. 理解maven命令package、install、deploy的联系与区别(转)

    https://blog.csdn.net/zhaojianting/article/details/80324533 我们在用maven构建java项目时,最常用的打包命令有mvn package. ...