操作系統 :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
數據包打開效果:
運行效果視頻可從如下渠道獲取:
二、使用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可參考如下文章:
抓包效果如下:
四、資源下載
本文涉及資源可從如下渠道獲取: