注意:笔者使用的是python3,Windows10系统,华为USG6300防火墙
背景:当职网络有国内出口跟海外出口(访问google)时,偶尔会遇到部分网站打不开或加载速度慢,大概率是访问国内资源从海外出口走,访问海外资源亦是如此,由于路由不准确导致,笔者之前通过IANA获取的地址合集路由命中率不高(云厂商真会玩),经过多番查找,在github上找到了相对准确的国内地址合集,大概每月更新一次,为什么是获取国内的地址合集,国内地址合集目前大约6千多条,海外合集几万条。
此教程为两篇(上篇基础使用,下篇相对代码偏多)
上篇为如何获取IP地址合集,如何将地址下发给设备
本篇为自动同步地址合集(自动对地址合集做增删操作)
代码如下:
import requests
from netmiko import ConnectHandler
import time
time1 = time.time()
new_time = time.strftime("%Y-%m-%d", time.localtime())
new_ip_list = []
dev_ip_list_01 = []
dev_ip_list_02 = []
dev_ip_list_all = []
add_address = []
delete_address = []
add_address_comm_01 = ['ip address-set IP-CN01 type object']
add_address_comm_02 = ['ip address-set IP-CN02 type object']
delete_address_comm_01 = ['ip address-set IP-CN01 type object']
delete_address_comm_02 = ['ip address-set IP-CN02 type object']
def get_new_ip_list():
url = 'https://raw.githubusercontent.com/17mon/china_ip_list/master/china_ip_list.txt'
try:
header = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,'
'*/*;q=0.8,application/signed-exchange;v=b3;q=0.9',
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) '
'Chrome/96.0.4664.110 Safari/537.36',
'Accept-Encoding': 'gzip, deflate, br',
'Accept-Language': 'en-US,en;q=0.8,zh-CN;q=0.6,zh;q=0.4,zh-TW;q=0.2',
'Connection': 'keep-alive',
'path': '/17mon/china_ip_list/master/china_ip_list.tx'
}
r = requests.get(url, headers=header, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
new_ip_list_01 = r.text
with open(f'D:\\Python\\network\\update_ip_china\\new_ip\\new_ip_{
new_time}.txt', 'w') as new_ip:
new_ip.write(new_ip_list_01)
new_ip_list_02 = new_ip_list_01.strip().split('\n')
for new_ip_list_03 in new_ip_list_02:
new_ip_list.append(new_ip_list_03)
print(f'最新国内IP地址条目为: {
len(new_ip_list)}\n')
except Exception as e:
print(e)
def get_dev_ip_list():
try:
device = {
'device_type': 'huawei', 'host': '10.100.0.200', 'username': 'python', 'password': '123456.com'}
ssh_client = ConnectHandler(**device)
print('开始获取防火墙现有国内IP地址集合')
ger_dev_ip_list_01 = ssh_client.send_command('display ip address-set verbose IP-CN01 item')
with open('ip_01.txt', 'w+') as ip01:
ip01.write(ger_dev_ip_list_01)
ger_dev_ip_list_02 = ssh_client.send_command('display ip address-set verbose IP-CN02 item')
with open('ip_02.txt', 'w+') as ip02:
ip02.write(ger_dev_ip_list_02)
except Exception as e:
print(e)
def format_add():
with open('ip_01.txt') as ip01:
ip01_2 = ip01.read().strip().replace(' mask ', '/').replace(' address ', '')
ip01_3 = ip01_2.split('\n')
for ip01_4 in ip01_3[7:]:
ip01_5 = ip01_4.split(' ')[1]
dev_ip_list_01.append(ip01_5)
dev_ip_list_all.append(ip01_5)
with open('ip_02.txt') as ip02:
ip02_2 = ip02.read().strip().replace(' mask '