ashi009 / bestroutetb

Generating the most optimized route table for VPN users.
MIT License
879 stars 99 forks source link

一处修正和一个建议 #7

Closed lordong closed 11 years ago

lordong commented 11 years ago

修正:formatter.js第147行rule.length前的&&应改为||,否则当nodefault为true且prefix为0.0.0.0时还是有部分输出,我的理解是都不输出,当然可能这里我不理解rule.length的用意,我觉得可以不要这个判断。另外用法说明里说的是“--nodefaultgw=1”参数,而这同一行里判断的是flags.nodefault参数,这里不匹配所以该参数无效。

建议:formatter.js第145行改成if (rule.gw && kProfile.gw[rule.gw]),这样我们可以添加不同的profile实现只选择输出net_gateway或vpn_gateway,大多数情况下只选一种即可。比如我增加win_net_up、win_net_down、win_vpn_up、win_vpn_down四种profile: var kNetGateway = { net: opts.netgw || '%netgw%', vpn: null }; var kVpnGateway = { net: null, vpn: opts.vpngw || '%vpngw%' }; win_net_up: { header: '@echo off\nsetlocal\n\ for /F "tokens=3" %%%%i in (\'route print ^| findstr "\<0.0.0.0\>"\') do set netgw=%%%%i\n\ echo Are you sure to use "%netgw%" for NET gateway?\npause\necho Please wait...', format: 'route add %prefix mask %mask %gw', gw: kNetGateway }, win_net_down: { header: '@echo off\necho Please wait...', format: 'route delete %prefix', gw: kNetGateway }, win_vpn_up: { header: '@echo off\nsetlocal\n\ for /F "tokens=3" %%%%i in (\'route print ^| findstr "\<10.0.0.0\>"\') do set vpngw=%%%%i\n\ echo Are you sure to use "%vpngw%" for VPN gateway?\npause\necho Please wait...', format: 'route add %prefix mask %mask %gw', gw: kVpnGateway }, win_vpn_down: { header: '@echo off\necho Please wait...', format: 'route delete %prefix', gw: kVpnGateway },

另外setroutes.js在Windows下用虽然速度很快,但发现如果vpn mask是10.10.10.x时会提示添加出错,有些net的路由也添加不上,所以我想到了添加profile的方法直接生成Windows下的bat文件

ashi009 commented 11 years ago

可否fork一个版本,然后pull request之,这样可以给你credits?

lordong commented 11 years ago

这里放出来的代码可能由于转义的原因不是可以直接使用的了,我放到Dropbox的共享目录上: https://dl.dropboxusercontent.com/u/5222117/bestroutetb-master.zip

ashi009 commented 11 years ago

这怎么就关了。。。多谢贡献,这几天忙的要死,有时间再合并您的代码。

lordong commented 11 years ago

我觉得信息传递到就可以了结所以就顺手把它关了,呵 还是想提升Win下添加路由表的速度,最近试了cmroute.dll的SetRoutes方法批量添加路由表(参见 http://is.gd/z1kHPJ),在XP下死活加不上,有空我也研究一下你那个js的方法,看错误能不能解决掉

lordong commented 11 years ago

很奇怪的事,我今天再在Windows XP/7下试cscript.exe setroutes.js up routes方式添加路由表又好了(用我更新的setroutes.js文件在不给vpngw参数时只添加netgw记录),可能我之前把路由表搞乱过重启就好了。

lordong commented 11 years ago

这两天在Win7下通过setroutes.js添加路由表时发现好多国内的域名tracert结果都是走VPN通道,然后用我增加win_net_up所生成的批处理来添加路由表,对比两种情况下的路由表,发现setroutes.js会丢掉一个大范围的条目,比如14.0.0.0/255.0.0.0和14.0.0.0/255.255.148.0这两条,使用setroutes.js只保留第2条,使用route add则两条都有。

另外仔细分析就知道你加14.0.0.0/255.240.0.0这条走VPN的用意了,看来我区分net和vpn两种profile不合适,我该改一改

ashi009 commented 11 years ago

--nodefaultgw 的问题已修复,代码和文档不一致,flags.nodefault已经修改为 flags.nodefaultgw。判断中的&&没有错,因为是匹配0.0.0.0/0,所以也要确定length === 0.

ashi009 commented 11 years ago

你后半部分的逻辑是错误的,netgw和vpngw都是需要的,请参考介绍的工作原理。至于setroutes.js 需要在已经完成vpn连接后使用,如果有异常请再开一个issue。

lordong commented 11 years ago

至少现在发现用setroutes.js在Windows下是有缺陷的,上一条comment我提到过,而且经常提到参数错误,比如我现在在Win7 64bit下拨VPN后执行下面一行(文档里并没有提醒setroutes.js必须在vpn拨号后执行): cscript setroutes.js up routes /netgw:192.168.11.1 /vpngw:10.10.10.1 会报参数错误(前3条): FAILED to add 0.0.0.0: 254.0.0.0, net_gateway 参数错误。 FAILED to add 1.0.16.0: 255.255.240.0, vpn_gateway 参数错误。 FAILED to add 1.0.64.0: 255.255.192.0, vpn_gateway 参数错误。

route print结果(前3条,另查到VPN的网关是10.10.10.1):

IPv4 路由表

活动路由: 网络目标 网络掩码 网关 接口 跃点数 0.0.0.0 0.0.0.0 192.168.11.1 192.168.11.107 4245 0.0.0.0 0.0.0.0 在链路上 10.10.10.19 11 10.10.10.19 255.255.255.255 在链路上 10.10.10.19 266

此时因为你判断中用 && 匹配 0.0.0.0/0 ,然后如果在Windows下执行cscript setroutes.js down routes,上面route print的前两条记录全被删除了,然后就无法上网了(这让不懂恢复的人抓狂,我一般是禁用网卡再开启)。win_down profile也存在这个问题,这也是我觉得该用 || 代替的原因,就是输出routes中0.0.0.0/254.0.0.0也一起删除。

那现在Windows下应该使用win_up和win_down两个profile更合适,问题的加 --nodefaultgw=1 参数后存在我上面提到的down后不能上网的问题,另外win_up输出的格式并不适合Windows下使用,所以需要把#netgw和#vpngw替换成%netgw%和%vpngw%,然后加set设固定IP或输入参数,总之需要补充完善才能使用。

ashi009 commented 11 years ago

setroutes.js是基于WMI写的,但是WMI没有文档,然后错误提示也跟没有一样,所以实际工作很不稳定。至于那两个bat文件的问题呢。。。要不你改好发个pull request我来合并。因为我连windows的系统都没有。。

2013/5/18 lordong notifications@github.com

至少现在发现用setroutes.js在Windows下是有缺陷的,上一条comment我提到过,而且经常提到参数错误,比如我现在在Win7 64bit下拨VPN后执行下面一行(文档里并没有提醒setroutes.js必须在vpn拨号后执行): cscript setroutes.js up routes /netgw:192.168.11.1 /vpngw:10.10.10.1 会报参数错误(前3条): FAILED to add 0.0.0.0: 254.0.0.0, net_gateway 参数错误。 FAILED to add 1.0.16.0: 255.255.240.0, vpn_gateway 参数错误。 FAILED to add 1.0.64.0: 255.255.192.0, vpn_gateway 参数错误。

route print结果(前3条,另查到VPN的网关是10.10.10.1): IPv4 路由表

活动路由: 网络目标 网络掩码 网关 接口 跃点数 0.0.0.0 0.0.0.0 192.168.11.1 192.168.11.107 4245 0.0.0.0 0.0.0.0 在链路上 10.10.10.19 11 10.10.10.19 255.255.255.255 在链路上 10.10.10.19 266

此时因为你判断中用 && 匹配 0.0.0.0/0 ,然后如果在Windows下执行cscript setroutes.js down routes,上面route print的前两条记录全被删除了,然后就无法上网了(这让不懂恢复的人抓狂,我一般是禁用网卡再开启)。win_down profile也存在这个问题,这也是我觉得该用 || 代替的原因,就是输出routes中0.0.0.0/254.0.0.0也一起删除。

那现在Windows下应该使用win_up和win_down两个profile更合适,问题的加 --nodefaultgw=1 参数后存在我上面提到的down后不能上网的问题,另外win_up输出的格式并不适合Windows下使用,所以需要把#netgw和#vpngw替换成%netgw%和%vpngw%,然后加set设固定IP或输入参数,总之需要补充完善才能使用。

— Reply to this email directly or view it on GitHubhttps://github.com/ashi009/bestroutetb/issues/7#issuecomment-18092418 .