loveuall / kcptun-00

add config.json for https://github.com/xtaci/kcptun
MIT License
8 stars 2 forks source link

一些疑问 #1

Open buaazp opened 7 years ago

buaazp commented 7 years ago

一. readme中提到:

原项目转发层次:客户端应用层 -> socks5/ss 代理 -> kcp udp -> 服务器 kcp udp -> socks5/ss 代理 -> 请求的真实服务器

对此我不认同,kcptun源项目客户端使用无需单独配置socks5代理,直接设置kcptun client的监听地址就可以进行代理。我自己开了分之,仅仅在server端里加了几行socks5代理的代码,就可以直接使用了,client无需任何修改:https://github.com/buaazp/kcptun/tree/self-proxy 所以我认为你所谓的优化实际上是负优化:

项目中减少了一层 tcp 转发,路由器中使用当然是把一些不必要的层去掉。

二. https://github.com/loveuall/kcptun/blob/master/cmd/server/main_server.go#L452 循环起多个goroutine的话,用sync.WaitGroup来控制,你这map range里面加i判断长度的方法,我就不评价了。

三. 你声称自己实现了部分socks5的功能(看注释风格完全不像你自己写的,如果是从别处拷过来开源代码请著名作者和license),说是为了不引入3rd包,代码简单,但是你这些代码功能太少,连基本的socks认证,ipv6都不支持,毕竟你不是专门解析socks5的库,为何不直接调用成熟的第三方socks包,连云风菊苣都表示自己实现这个太复杂而放弃了,看这儿

loveuall commented 7 years ago

一. 你引用第三方库解决了 socks5 问题,然后呢?config.json 配置呢?多用户呢?是不是还可以两三行代码解决? 二. 这个是多端口设置密码的时候,让每个端口跑一个 mux,一般用户配置的端口不会超过10个。直接用一个 goroutine 跑一个 mux, 并且不会超过 10个 goroutine,有什么问题?为何需要 sync.WaitGroup来控制?最后的 一个 mux 自然会阻塞主 goroutine,执行了的 goroutine都不需要再等待他们结束. 能不用则不用。 三. 我的 readme 要修改下,socks5 确实不是我自己写的代码,本来就是一个协议,自己写也不至于写不出来。最关键的是,socks5 本来就是一个超简单版本,远远没有标准的 socks5 那么标准。(可参考shadowsocks的 socks5,也没有用户授权的,但局域网里还授权干嘛?) 但是它代码够简单,这个你没有意见吧?并且够用,你也没有意见吧?它的执行效率肯定有标准的一样甚至更快的速度,也没有意见吧? 四. 透明代理就更简单了。如果你要引入别人的包,你得引入两个,一个 socks5 一个 透明代理。 五. ipv6 要支持并不难,透明代理与 socks5 我都可以轻松支持,就是我没有测试环境,所以我也没有加。我代码里也许有注释说 ipv6 待支持。未来可以加上。 六. 说实话你的初忠是好,你可以提出更有意见的修改方案,不引入复杂性,效果好,肯定会采取行动。毕竟我也想轻松解决master合并分支的问题。

buaazp commented 7 years ago

其他的就不说了,现在关键的分歧在你这个客户端是否需要加一层,搞清楚了也可以提高程序的效率。

以我目前的理解,你的客户端其实是加了两个模式,一个是透明代理,一个是socks5。客户端似乎没有必要加一层socks5,我贴出自己的分之只是想表明我没对client做修改就实现了sock5功能,kcptun自己会转发任何格式的请求,实际上服务端收到解析一下proxy就走得通,我自己就是这么做的。

倒是你的透明代理确实可以加到client,我之前因为是在自己电脑上用,不是在路由器上用,不需要这个功能所以没仔细看你的代码,是我疏忽了。

综上,我建议你的client去掉socks5部分,直接用原版kcptun的转发功能就够了,只支持透明代理那一段就行了,如果浏览器啊什么的需要socks5代理,直接写上client的监听地址就行了应该。

loveuall commented 7 years ago

是这样的,在路由器里,要解决 dns 污染问题,需要由服务器中转 dns,免得解析 google 的 dns 都是不成功的。并且路由器里透明代理的时候无法使用 remote dns query。 这个时候有几个方案,一个是在服务器端加一个 udp 中转,相应的客户端也要修改,另一个是通过 socks5 来代理 dns 解析。通过路由器中转 udp 无疑需要增加更多代码,所以就弄了一个 socks5 代理 dns 请求(可参考 dns2socks 这个工具),有的用户不想用透明代理,还可以在浏览器里用插件配置 socks5。

如果去掉的话,可以去掉服务器端的socks5代理,客户端的话不方便,免得客户端还得再增加一个工具来实现 socks5,增加了配置复杂度。

对了,直接用这个 socks5 还有一个小小的好处是,减少一次数据回来交互,一个是: https://github.com/loveuall/kcptun/blob/master/cmd/client/main_client.go#L218 一个是: https://github.com/loveuall/kcptun/blob/master/cmd/client/main_client.go#L116

直接在 客户端就返回了,不需要等待服务器端返回这两个数据,网页显示应该会快一点吧。现在我觉得关键要讨论的是,如何能与master无缝结合,从master fork过来。现在的程序除了 -t 其它 master 的配置都还保留可以使用的。