xjasonlyu / tun2socks

tun2socks - powered by gVisor TCP/IP stack
https://github.com/xjasonlyu/tun2socks/wiki
GNU General Public License v3.0
3.14k stars 434 forks source link

提供一种电脑做网关的思路 #4

Closed fbion closed 4 years ago

fbion commented 4 years ago

可以的 https://github.com/FlowerWrong/tun2socks https://github.com/xjasonlyu/tun2socks 这两个已经实现fake dns surge增强模式也是这样 有两种方式 google.com -> 192.18.0.1 google.com.hk -> 192.18.0.2

google.com -> 192.18.0.1:1111 google.com.hk -> 192.18.0.2:1112

通过这种关联即可

个人系统192.168.1.2开启 net.inet.ip.forwarding=1 开启tun2socks sudo route add 198.18.0.2/24 240.0.0.1(tun网关)

手机设置网关192.168.1.2 所有流量走192.168.1.2了吧 192.168.1.2开启fake dns 手机dns服务器也设置为1.2 手机访问google.com 得到ip 192.18.0.1 手机连接192.18.0.1经过192.168.1.2 192.18.0.1走tun接口 tun2socks检测到访问192.18.0.1->google.com

此时tun2socks->v2ray inbounds 由v2ray来识别国外国内 google facebook twitter等域名

假如手机访问baidu,v2ray直接识别为geosite:cn ip 流量直接国内走

tun2socks只需要提供fake dns和代理功能 分流交给v2ray来做 这样

xjasonlyu commented 4 years ago

我上游的分流是交给clash客户端的,这样通过GUI来控制clash然后间接控制网关分流规则这样。因为目前除mac平台我没有找到很好的像Surge这样完整的代理工具,就把这个方案作为备用了。

fbion commented 4 years ago

https://github.com/Dreamacro/clash/releases/tag/TUN clash也出tun了 试了下 不好用

还是你这个好用,手机设置网关为电脑ip,dns为tun2socks fake dns 域名识别交给v2ray 这样就解决了很多

不过还有连接ip的情况,需要 pass out log on en0 route-to utun1 inet proto {udp,tcp} from 192.168.0.55 to any port {53, 80, 44 3} 这样就把手机访问ip的流量转给utun1 然后tun2socks转给v2ray 还是v2ray检测ip来分流

clash一会看看,不过我现在完整用v2ray也没啥问题?

xjasonlyu commented 4 years ago

我自建用了半年多挺稳的没啥问题。

不过还有连接ip的情况,需要 pass out log on en0 route-to utun1 inet proto {udp,tcp} from 192.168.0.55 to any port {53, 80, 44 3} 这样就把手机访问ip的流量转给utun1 然后tun2socks转给v2ray 还是v2ray检测ip来分流

这个你是指SRC-IP规则?确实SRC-IP之类的规则会不对,毕竟tun2socks和upstream proxy是分离的,从路由这一层解决应该比较复杂,如果是一体的就可以带一个metadata来表明source-addr。

clash一会看看,不过我现在完整用v2ray也没啥问题?

v2ray没问题,我以前也用,后来换成clash是因为规则管理更简单强大,而且还有ProxyGroup方便选择自动切换节点。

叫道理感觉tun的全局代理实现还是不太好,不如netfilter之类的模块,tun必须要安装不能即开即用,而且不能直接得到具体是哪个process的流量,只能通过别的工具来判断,容易影响效率。像Surge这样的实现其实是最完美的。。但是需要特定的平台。。

fbion commented 4 years ago

surge总是连接e.crashlytics.com挺烦的 获取是哪个process的流量 好像有软件是通过lsof查询端口获取相应的进程名字 比如127.0.0.1:789 -> 127.0.0.1:1080(socks5 server) 通过789端口可以lsof到进程名字

fbion commented 4 years ago

/Users/apple/Library/Caches/com.crashlytics.data/com.nssurge.surge-dashboard /Users/apple/Library/Caches/com.crashlytics.data/com.nssurge.surge-mac 感觉surge收集的信息太多了

xjasonlyu commented 4 years ago

surge总是连接e.crashlytics.com挺烦的 获取是哪个process的流量 好像有软件是通过lsof查询端口获取相应的进程名字 比如127.0.0.1:789 -> 127.0.0.1:1080(socks5 server) 通过789端口可以lsof到进程名字

  1. 请求e.crashlytics.com是app都会有的,可以通过replica选项隐藏
  2. tun2socks就是通过lsof来获取进程名的,但是lsof会有额外的耗时(本地测试大约有10-30ms,毕竟每一次connection都要运行一次lsof,开销其实挺大的),对于及时性要求高的需求情况这几乎是不可忍受的,而且如果是建立到关闭很快的socket(e.g. 某些UDP请求)就会有查询不到的情况,因为连接已经关了。
xjasonlyu commented 4 years ago

/Users/apple/Library/Caches/com.crashlytics.data/com.nssurge.surge-dashboard /Users/apple/Library/Caches/com.crashlytics.data/com.nssurge.surge-mac 感觉surge收集的信息太多了

app收集crashlytics data无可厚非吧,对app的bug fixes一些改进都有用的,而且这个开销几乎可以忽略不计了。

fbion commented 4 years ago

surge作为收费软件很不错了 不过我用proxifier.com

xjasonlyu commented 4 years ago

proxifier我也用,但他似乎不能做网关。。

fbion commented 4 years ago

tun2socks还是有用的, 可以让udp走socks5