V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
cattyhouse
V2EX  ›  macOS

Mac 上全自动的 chnroute

  •  
  •   cattyhouse · 2015-09-01 17:51:53 +08:00 via iPhone · 3223 次点击
    这是一个创建于 3175 天前的主题,其中的信息可能已经有所发展或是发生改变。
    第 1 条附言  ·  2015-09-02 21:23:45 +08:00

    @Daniel65536

    use cidrmerge to compress chnroute.txt

    cat chnroute.txt | cidrmerge > chnroute.merge.by.cidrmerge.txt

    use python to expand cidr to ip list (两个同时 expand ,双核 4 线程的 cpu 占用 50%,耗时近 50 分钟)

    python2.7 cidr-ip.py chnroute.txt > ip_chnroute.txt
    python2.7 cidr-ip.py ~/chnroute.merge.by.cidrmerge.txt > ip_chnroute-cidrmerge.txt

    size of both ip list files (生成的纯 ip 文件有 4.7G )

    ls -sk ip_chnroute*
    4736968 ip_chnroute-cidrmerge.txt 4736968 ip_chnroute.txt
    they are the same size (4.7G)

    wc -l to count lines of both ip list files

    335792128 ip_chnroute-cidrmerge.txt
    335792128 ip_chnroute.txt
    they have the same number of lines.

    结论: cidrmerge 对 chnroute 的压缩的确有效,多谢。

    第 2 条附言  ·  2015-09-02 23:33:59 +08:00
    #!/bin/sh
    export PATH="/usr/local/sbin:/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin:$HOME/bin"
    
    
    # 生成 chnroute --------
    curl 'http://ftp.apnic.net/apnic/stats/apnic/delegated-apnic-latest' | grep ipv4 | grep CN | awk -F\| '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' > chnroute.txt && echo "chnroute.txt generated" || exit 0
    
    
    # 用 cidrmerge 压缩 chnroute ,生成压缩版 ----------
    cat chnroute.txt | cidrmerge > chnroute.lite.txt && echo "chnroute.lite.txt generated" || exit 0
    
    
    # 生成 Mac 版本的 路由添加删除修改命令,其中${_action} 可以用 if then fi 定义为 add change delete ,${current_gw}可以用 `netstat -nr -qq -f inet | grep UHLWIi | awk '{print $1}'` 生成 -------------
    rm -f chnroute-action
    while read cnip ; do echo "route -nq \${_action} ${cnip} \${current_gw}" >> chnroute-action ; done < chnroute.lite.txt && echo "chnroute-action generated, copy them to the script"
    
    第 3 条附言  ·  2015-09-02 23:36:40 +08:00

    sorry, 打错,生成${current_gw} :

    netstat -nrf inet | grep UHLWIi | awk '{print $1}'

    15 条回复    2015-09-02 18:17:15 +08:00
    haogefeifei
        1
    haogefeifei  
       2015-09-01 18:13:23 +08:00
    用网有那么麻烦?
    Daniel65536
        2
    Daniel65536  
       2015-09-01 18:44:26 +08:00
    居然改 sudo 设置,你难道不知道 /Library/LaunchDaemons/下的 plist 都是 root 权限运行的么,非要 sudo visudo ,另外 route 不先跑 cidrmerge 也是槽点,明明 3765 条路由可完成的事情要用 5837 条去做。
    cattyhouse
        3
    cattyhouse  
    OP
       2015-09-01 20:18:26 +08:00 via iPhone
    @Daniel65536 要是能 merge , chnroute 项目为什么不 merge ?他们不 merge 自有原因。

    用系统的 launchd 不是很建议,即使用了,还是要用 sudo 来 load 和 unload 。

    对于常用终端的来说,改 sudo 设置基本上避免不了的,否则就要一直输入密码,程序无法后台自启动。
    yushiro
        4
    yushiro  
       2015-09-01 20:34:33 +08:00 via iPhone
    好像很不错的样子,回去试试。
    Daniel65536
        5
    Daniel65536  
       2015-09-01 22:40:49 +08:00
    > 要是能 merge , chnroute 项目为什么不 merge ?他们不 merge 自有原因。

    笑哭,因为不 merge 好写代码,因为水平不够没法用 python 写个 merge 函数出来。不然你以为为什么还会冒出个用上动态规划,效果比过一个 cidrmerge 还好的 bestroutetb 项目出来?还不是 chnroute 作者水平不够。

    > 用系统的 launchd 不是很建议,即使用了,还是要用 sudo 来 load 和 unload 。

    homebrew 装的程序如果 plist_option 开了:startup 就会放 /Library/LaunchDaemons/,这才是 root 权限 plist 的最佳实践代表。

    > 对于常用终端的来说,改 sudo 设置基本上避免不了的

    呵呵。
    geeti
        6
    geeti  
       2015-09-02 02:49:53 +08:00
    > 对于常用终端的来说,改 sudo 设置基本上避免不了的

    呵呵。
    cattyhouse
        7
    cattyhouse  
    OP
       2015-09-02 11:13:37 +08:00
    @Daniel65536 请问你用 cidrmerge 生成的 ip 地址在哪里, show me the code 。

    bestroutetb ,要搞两个网关,自动化实现起来不是很方便,尤其是如果 vpn 还没连上之前,加载 bestroutetb 会出现找不到 vpn 网关。
    cattyhouse
        8
    cattyhouse  
    OP
       2015-09-02 11:20:34 +08:00
    @Daniel65536
    @geeti

    mac 上用 shadowvpn , openconnect 都要用 sudo 啊,用 networksetup 也要 sudo 的啊,我说的是“终端操作” 而且是趋向于自动化。。。 不需要过多的人工干预。
    Daniel65536
        9
    Daniel65536  
       2015-09-02 15:36:30 +08:00 via iPhone
    cat ip.txt | cidrmerge > newip.txt
    至于 cidrmerge 可以 brew install cidrmerge

    哪怕 setuid 和 chmod 755 都比改 sudo 好。
    cattyhouse
        10
    cattyhouse  
    OP
       2015-09-02 17:55:13 +08:00
    @Daniel65536 谢谢,刚才用 cidrmerge 重新生成了一份 ip 列表,数量从 chnroute 的 5824 变成 3757 ,只是不知道是否会有”误伤“ 或 “遗漏”?
    cattyhouse
        11
    cattyhouse  
    OP
       2015-09-02 17:56:07 +08:00
    @Daniel65536 如果什么地方可以对这两个 cidr 展开然后做比较,就知道是否会有不同了。
    cattyhouse
        12
    cattyhouse  
    OP
       2015-09-02 17:57:46 +08:00
    @Daniel65536 虽然你吐槽不是很中听,但是我对于这些有用的建议还是很快去实现的,等我测试 cidrmerge 生成的 ip 的确包含全部中国的 ip 而且不包含任何中国以外的 ip 之后,我再把 chnroute 替换掉。
    cattyhouse
        13
    cattyhouse  
    OP
       2015-09-02 17:59:12 +08:00
    @cattyhouse 你说的 3765 条是不是包含 Private Network 的 ip 段啊,我用 cidrmerge 操作 chnroute 之后得到的数量是 3757 条,奇怪了。
    cattyhouse
        14
    cattyhouse  
    OP
       2015-09-02 18:00:30 +08:00
    # wc -l chnroute.txt
    5824
    # cat chnroute.txt | cidrmerge | wc -l
    3757

    @cattyhouse
    @Daniel65536
    cattyhouse
        15
    cattyhouse  
    OP
       2015-09-02 18:17:15 +08:00
    @Daniel65536 有现成的 script 来 expand cidr 地址,然后就可以做比较,晚上测试下

    http://stackoverflow.com/questions/16986879/bash-script-to-list-all-ips-in-prefix
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   2562 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 28ms · UTC 15:51 · PVG 23:51 · LAX 08:51 · JFK 11:51
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.