需求
当您的业务有访问国内,国外,以及你有国内和海外两条专线时,您可能需要从不同的运营商线路进行分流(路由或者策略路由)。
该文章介绍如何使用python脚本自动从ispip网站获取国内运营商的CIDR(感谢http://ispip.clang.cn提供国内各运营商的CIDR信息,从网站上描述看,他们每天更新一次数据)。然后将CIRD转换成对应的路由格式,和或者策略路由ACL所需的反掩码路由。然后保存为Excel。利用该数据,您可以通过路由,或者策略路由来实现国内和国外数据分流。
代码
"""
GetCIDR routes of all Chinese ISP's from ispip.clang.cn.
And generate - 1. routes (network + mask), 2. ACL match condition (network + wildcard)
Any comments, please contact fuyou.han@126.com
Thanks ispip.clang.cn for sharing the amazing data and update it day by day.
"""
import requests
from netaddr import IPNetwork, AddrFormatError
import pandas as pd
from datetime import datetime
# Function for getting dict (cidr, network_mask, network_wildcard) of a CIDR
def cidr_converter(cidr):
try:
network = IPNetwork(cidr)
if network.version != 4:
return "仅支持IPv4地址"
# 提取网络地址和子网掩码
net_address = str(network.network)
subnet_mask = str(network.netmask)
# 计算反掩码(通配符掩码)
wildcard_octets = [255 - int(octet) for octet in subnet_mask.split('.')]
wildcard_mask = '.'.join(map(str, wildcard_octets))
return {
"cidr": cidr,
"network_mask": f"{net_address} {subnet_mask}",
"network_wildcard": f"{net_address} {wildcard_mask}"
}
except AddrFormatError:
return "无效的CIDR格式"
except Exception as e:
return f"错误: {str(e)}"
def get_cidr(url):
response = requests.get(url)
if response.status_code == 200:
cidr_txt = response.text
# print(content)
return cidr_txt
else:
print(f"下载失败,状态码: {response.status_code}")
return
if __name__ == "__main__":
# Get all CN CIRDs
url = 'https://ispip.clang.cn/all_cn_cidr.txt'
all_cn_cidr = get_cidr(url)
#print("Get all CN CIDRs as below:\n", all_cn_cidr)
cidr_list = all_cn_cidr.splitlines()
print("\nGet all CN CIDRs. The top 5 as below:\n", cidr_list[:5])
# CIDR to Dict (cidr, network_netmask, network_wildcard)
cidr_dict_list =[]
for cidr in cidr_list:
cidr_result = cidr_converter(cidr)
#print(cidr_result)
cidr_dict_list.append(cidr_result)
print("\nGenerate network_mask, network_wildcard for all CN CIDRs. The top 5 as below:\n", cidr_dict_list[:5])
# Save data to Excel
nowtime = datetime.now().strftime("%Y%m%d%H%M%S")
file_name = f"all_cn_ips_routes_{nowtime}.xlsx"
all_cn_ips_routes = pd.DataFrame(cidr_dict_list)
print(all_cn_ips_routes)
all_cn_ips_routes.to_excel(file_name, index=False)
print(f"The data save to {file_name} ")
运行脚本输出
C:\py\network\.venv\Scripts\python.exe C:\py\getroutersfrominternet.py
Get all CN CIDRs. The top 5 as below:
['1.0.1.0/24', '1.0.2.0/23', '1.0.8.0/21', '1.0.32.0/19', '1.1.0.0/24']
Generate network_mask, network_wildcard for all CN CIDRs. The top 5 as below:
[{'cidr': '1.0.1.0/24', 'network_mask': '1.0.1.0 255.255.255.0', 'network_wildcard': '1.0.1.0 0.0.0.255'}, {'cidr': '1.0.2.0/23', 'network_mask': '1.0.2.0 255.255.254.0', 'network_wildcard': '1.0.2.0 0.0.1.255'}, {'cidr': '1.0.8.0/21', 'network_mask': '1.0.8.0 255.255.248.0', 'network_wildcard': '1.0.8.0 0.0.7.255'}, {'cidr': '1.0.32.0/19', 'network_mask': '1.0.32.0 255.255.224.0', 'network_wildcard': '1.0.32.0 0.0.31.255'}, {'cidr': '1.1.0.0/24', 'network_mask': '1.1.0.0 255.255.255.0', 'network_wildcard': '1.1.0.0 0.0.0.255'}]
cidr network_mask network_wildcard
0 1.0.1.0/24 1.0.1.0 255.255.255.0 1.0.1.0 0.0.0.255
1 1.0.2.0/23 1.0.2.0 255.255.254.0 1.0.2.0 0.0.1.255
2 1.0.8.0/21 1.0.8.0 255.255.248.0 1.0.8.0 0.0.7.255
3 1.0.32.0/19 1.0.32.0 255.255.224.0 1.0.32.0 0.0.31.255
4 1.1.0.0/24 1.1.0.0 255.255.255.0 1.1.0.0 0.0.0.255
... ... ... ...
5477 223.252.128.0/17 223.252.128.0 255.255.128.0 223.252.128.0 0.0.127.255
5478 223.254.0.0/16 223.254.0.0 255.255.0.0 223.254.0.0 0.0.255.255
5479 223.255.0.0/17 223.255.0.0 255.255.128.0 223.255.0.0 0.0.127.255
5480 223.255.236.0/22 223.255.236.0 255.255.252.0 223.255.236.0 0.0.3.255
5481 223.255.252.0/23 223.255.252.0 255.255.254.0 223.255.252.0 0.0.1.255
[5482 rows x 3 columns]
The data save to all_cn_ips_routes_20250316133955.xlsx