V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
DuanPengfei
V2EX  ›  程序员

在 macOS 取消了 PPTP 后使用 chnroutes 手动分流

  •  
  •   DuanPengfei · 2016-09-28 17:39:45 +08:00 · 3161 次点击
    这是一个创建于 3011 天前的主题,其中的信息可能已经有所发展或是发生改变。

    原文链接

    还是老方法,依旧使用 chnroutes 生成路由表。并且非常不优雅,但是在找不到解决方案的时候可以暂时解决问题。

    在使用 PPTP 方式连接 VPN 的时代,只要将生成的 ip-upip-down 拷贝到 /etc/ppp 目录下并且 sudo chmod +x ip-up ip-down 赋予执行权限,在连接 VPN 时会自动调用 ip-up 添加静态路由,在断开 VPN 时会自动调用 ip-down 删除静态路由。

    现在 macOS 取消了 PPTP 方式的 VPN ,那要怎么样来做分流呢,根据 PPTP 时代的经验,原理无非就是写静态路由,所以还是使用 chnroutes 生成 ip-upip-down 放在你喜欢的目录下,现在就到了最脏的时候,没有找到合适的自动运行的方式,所以我们手动运行。在每次进入到一个新的网络环境时 sudo ./ip-up 添加静态路由,在使用过后 sudo ./ip-down 删除静态路由。

    那么问题来了,既然是静态路由,可不可以添加一次就好了?如果你这辈子都不会变更网络环境,理论上是的。为什么这么说,我们来看代码。

    # ip-up 文件
    #!/bin/sh
    export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
    
    OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\([0-9\.]*\) .*/\1/' | awk '{if($1){print $1}}'`
    
    if [ ! -e /tmp/pptp_oldgw ]; then
        echo "${OLDGW}" > /tmp/pptp_oldgw
    fi
    
    dscacheutil -flushcache
    
    route add 10.0.0.0/8 "${OLDGW}"
    route add 172.16.0.0/12 "${OLDGW}"
    route add 192.168.0.0/16 "${OLDGW}"
    

    ip-up 的工作是获取当前网络的网关,添加静态路由,在静态路由里面将白名单 IP 转发到当前网络的网关上,这样流量就不会通过 VPN 了。所以说如果你确定这辈子都不会变更网络环境可以只执行一次 ip-up 就可以愉快的上网了。如果不是,老老实实在每次使用前执行 ip-up 添加静态路由,使用后执行 ip-down 删除静态路由,否则上不了网可别怨天尤人。

    知道了原理后,我们还可以定制静态路由,将 chnroutes 生成的静态路由里缺少的部分自己手动添加进去。

    # ip-up 文件
    #!/bin/sh
    export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
    
    OLDGW=`netstat -nr | grep '^default' | grep -v 'ppp' | sed 's/default *\([0-9\.]*\) .*/\1/' | awk '{if($1){print $1}}'`
    
    if [ ! -e /tmp/pptp_oldgw ]; then
        echo "${OLDGW}" > /tmp/pptp_oldgw
    fi
    
    dscacheutil -flushcache
    
    route add 10.0.0.0/8 "${OLDGW}"
    route add 172.16.0.0/12 "${OLDGW}"
    route add 192.168.0.0/16 "${OLDGW}"
    
    # 自定义
    route add 103.235.46.0/22 "${OLDGW}"  # 百度
    
    # ip-down 文件
    #!/bin/sh
    export PATH="/bin:/sbin:/usr/sbin:/usr/bin"
    
    if [ ! -e /tmp/pptp_oldgw ]; then
            exit 0
    fi
    
    ODLGW=`cat /tmp/pptp_oldgw`
    
    route delete 10.0.0.0/8 "${OLDGW}"
    route delete 172.16.0.0/12 "${OLDGW}"
    route delete 192.168.0.0/16 "${OLDGW}"
    
    # 自定义
    route delete 103.235.46.0/22 "${OLDGW}"  # 百度
    

    注意:一定要在 ip-upip-down 中成对添加自定义 IP 。

    以上就是以非常脏的方式实现手动分流的全过程,下一步就是要像 PPTP 时代一样在使用 VPN 能自动执行上述过程。由于我对 macOS 仅限于使用,也不是 *nix 大神,暂时没有想到什么特别好的解决方案,准备试试使用 AppleScript 能不能监听到 VPN 连接与断开事件来实现自动化。

    4 条回复    2016-09-28 21:48:23 +08:00
    br00k
        1
    br00k  
       2016-09-28 19:54:20 +08:00
    PPTP 被砍了。没升级想法了。。
    Showfom
        2
    Showfom  
       2016-09-28 19:56:05 +08:00 via iPhone
    你看 iOS 都没 pptp 了
    alexzhang
        3
    alexzhang  
       2016-09-28 21:08:28 +08:00
    可以用 shimo
    bao3
        4
    bao3  
       2016-09-28 21:48:23 +08:00 via Android
    难道不是早应该换成 ipsec 了? PPTP 。。。也敢用
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1037 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 22:31 · PVG 06:31 · LAX 14:31 · JFK 17:31
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.