Python小工具iptools在windows本地添加静态路由表

一、制作build.py文件

先制作build.py文件如下:

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import sys
import re
import os
import math
import copy

def usage():
    # 根据实际修改网关地址,就是你本地用的路由器网关地址
    print('./build [route_file] [add_file] [del_file] [gateway]')
    print('./build route.text add_route.bat del_route.bat 192.168.0.1')

#合并子网
def marge_subnet(ip_tables):
    count = 2
    start_i, end_i, prev_i = 0, -1, 0
    new_ip_tables = []
    serials = [ip_tables[0]]
    for i in range(1, len(ip_tables)):
        if ip_tables[i-1].is_serial(ip_tables[i]):
            serials.append(ip_tables[i])
            continue
    
        flag = False
        while len(serials) > 0:
            count = 2
            while len(serials) >= count and serials[0].get_last_net_no() % count == 0:
                serials[0] = serials[0] << 1
                count = count * 2
            count = 1 if count == 2 else int(count / 2)
            new_ip_tables.append(serials[0])
            serials = serials[count:]
        if len(serials) > count:
            new_ip_tables = new_ip_tables + serials[count:]            
        serials = [ip_tables[i]]

    new_ip_tables = new_ip_tables + serials   
    return new_ip_tables

#IP和MASK
class ip_mask:
    def __init__(self, ip):
        self.start = {}
        self.ip = copy.deepcopy(ip)
        self.mask = []
        self.last_mask_index = 0

    def __lt__(self, other):
        return self.ip < other.ip

    def __eq__(self, other):
        return self.ip == other.ip

    def __lshift__(self, value):
        while value >= 8 and self.last_mask_index >= 0:
            self.mask[self.last_mask_index] = (self.mask[self.last_mask_index] << 8 & 255)
            value = value - 8
            self.last_mask_index = self.last_mask_index - 1
        if self.last_mask_index >= 0 and value > 0:
            self.mask[self.last_mask_index] = (self.mask[self.last_mask_index] << value & 255)
        return self
        
    def set_mask(self, mask):
        self.mask = copy.deepcopy(mask)
        for i in range(len(self.mask) - 1, -1, -1):
            if mask[i] != 0:
                self.last_mask_index = i
                break

    def is_serial(self, other):
        flag = False
        for i in range(len(self.ip)):
            if self.ip[i] + 1 == other.ip[i] or self.ip[i] - 1 == other.ip[i]:
                flag = True
            elif self.ip[i] != other.ip[i]:
                return False
            elif self.ip[i] != 0:
                if flag:
                    return False
        return flag

    def get_last_net_no(self):
        return self.ip[self.last_mask_index]

#解析IP地址
def parse_ip_table(content):
    lines = content.split('\n')
    ip_tables = []
    for line in lines:
        line = line.split('/')
        if len(line) != 2:
            continue
        ip = list(map(int, line[0].split('.')))
        im = ip_mask(ip)
        im.set_mask([255,255,255,255])
        im = im << (32 - int(line[1]))
        ip_tables.append(im)
        
    return ip_tables

#添加路由
def add_route(file, ip_tables, gateway):
    f = open(file, 'w')
    for ip_mask in ip_tables:
        f.write('route add %d.%d.%d.%d mask %d.%d.%d.%d %s\n' % 
            (ip_mask.ip[0], ip_mask.ip[1], ip_mask.ip[2], ip_mask.ip[3], ip_mask.mask[0], ip_mask.mask[1], ip_mask.mask[2], ip_mask.mask[3], gateway))
    f.write('ipconfig /flushdns\n')
    f.write('pause\n')

#删除路由
def del_route(file, ip_tables):
    f = open(file, 'w')
    for ip_mask in ip_tables:
        f.write('route delete %d.%d.%d.%d\n' % (ip_mask.ip[0], ip_mask.ip[1], ip_mask.ip[2], ip_mask.ip[3]))
    f.write('ipconfig /flushdns\n')
    f.write('pause\n')

def main():

    if len(sys.argv) != 5:
        usage()
        return
    #####
    route_file = sys.argv[1]
    add_file = sys.argv[2]
    del_file = sys.argv[3]
    gateway = sys.argv[4]
    #####
    route_content = open(route_file, 'r+').read()
    ip_tables = parse_ip_table(route_content);
    ip_tables.sort()
    sub_net = len(ip_tables)
    ip_tables = marge_subnet(ip_tables)
    #####
    add_route(add_file, ip_tables, gateway)
    del_route(del_file, ip_tables)
    #####
    
main()

二、下载IP地址池

用到的IP地址池:
浏览器请求,保存为all_cn_cidr.txt就可以了。

https://ispip.clang.cn/all_cn_cidr.txt

三、如何使用

  • 首先确保机器可以运行python代码,不能的先装一下python
  • build.pyall_cn_cidr.txt放在同一个目录如ip_route_tools
  • 进入目录ip_route_tools目录,右键使用管理员运行终端:
    以上完成以后,就执行命令:
python .\build.py .\all_cn_cidr.txt add_route.bat del_route.bat 192.168.0.1
  • 提示:根据实际修改网关地址,就是你本地实际使用的路由器网关地址,比如192.168.0.1这样就可以路由分流,提高访问效率。
    执行完成后,会生成两个文件:add_route.batdel_route.bat,然后同样用管理员权限右键选择运行。add_route.bat就是添加路由,del_route.bat就是删除路由。

以上,完成后,就可以做到不同低于的IP进行分流请求。效率马上提高了很多,再也不用来回切换代理了。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容