Python网络自动化【国内外路由分流】自动获取国内运营商路由

需求

当您的业务有访问国内,国外,以及你有国内和海外两条专线时,您可能需要从不同的运营商线路进行分流(路由或者策略路由)。

该文章介绍如何使用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 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值