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 獲取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章