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

分享自用代理工具 - glider

  •  4
     
  •   nadoo · 2017-07-13 22:31:47 +08:00 · 9848 次点击
    这是一个创建于 2694 天前的主题,其中的信息可能已经有所发展或是发生改变。

    一直是在 linux 软路由上做透明代理使用,最近整理了一下,放在 github 上,分享给大家,或许有人用得着.

    之前看到 v2 有人找以下几类工具,用 glider 可以轻松实现:

    socks5 转 http
    glider -l http://:8080 -f socks5://127.0.0.1:1080 -v
    
    dns: udp 转 tcp
    glider -l dnstun://:53=114.114.114.114:53 -v
    

    这样可以在本地生成一个 dns 服务,可以 nslookup www.baidu.com 127.0.0.1 测试

    glider -l dnstun://:53=8.8.8.8:53 -f ss://method:pass@server1:port1 -v
    

    当然,一般是为了在国外解析,只要加上-f 参数,指定转发代理,就会通过转发代理去请求 8.8.8.8,作用你懂的...我一般用来配合 dnsmasq

    同一个端口提供 http 和 socks5 代理服务
    glider -l :8443 -f ss://method:pass@server1:port1 -v
    

    如果需要就可以加上-f 参数转发到远端服务器

    多个远端服务器,代理链(一个-f,逗号,分隔)
    glider  -l redir://:1081 -l dnstun://:53=8.8.8.8:53 -f ss://method:pass@server1:port1,ss://method:pass@server2:port2
    

    这样可以先通过 server1 做跳板,再连接 server2 进行转发

    多个远端服务器,轮叫或高可用模式
    glider  -l :8443 -f ss://method:pass@server1:port1 -f ss://method:pass@server2:port2 -s rr
    
    glider  -l :8443 -f ss://method:pass@server1:port1 -f ss://method:pass@server2:port2 -s ha
    

    项目地址

    能力有限,代码水平也不高,期待大家指正...

    57 条回复    2021-03-12 08:41:07 +08:00
    Showfom
        1
    Showfom  
       2017-07-13 23:44:46 +08:00 via iPhone
    支持一下
    coolcfan
        2
    coolcfan  
       2017-07-14 00:54:11 +08:00
    点进来就猜是用 go 写的,打开 github 果然是用 go 写的……
    我都不知道怎么猜的……
    nadoo
        3
    nadoo  
    OP
       2017-07-14 01:07:27 +08:00 via iPhone
    @coolcfan go 比较适合做这方面
    xx998
        4
    xx998  
       2017-07-14 01:08:29 +08:00 via Android
    mark ~
    支持一下,或许以后会用到。
    ashfinal
        5
    ashfinal  
       2017-07-14 01:56:08 +08:00
    支持一下
    ericFork
        6
    ericFork  
       2017-07-14 02:53:38 +08:00
    https://github.com/ginuerzh/gost

    ...是致敬,还是重复造轮?
    nadoo
        7
    nadoo  
    OP
       2017-07-14 03:11:30 +08:00 via iPhone   ❤️ 1
    @ericFork 目的有所不同,我找了不少程序,包括 ghost,但都不满足需求。我只是为了自己上网,所以有 dns 之类的功能,多个远程代理支持轮叫或备用方式(因为买的 ss 服务有十几个服务器可选),另外代码也简单了不少,顺便是学习程序和协议了。
    nadoo
        8
    nadoo  
    OP
       2017-07-14 03:14:40 +08:00 via iPhone
    中间参考了 gost、go-shadowsocks2 部分代码,明天我把它们加入 readme
    v1024
        9
    v1024  
       2017-07-14 08:14:20 +08:00 via iPhone
    你不说自己写的我还以为是 gost 改名了
    kmahyyg
        10
    kmahyyg  
       2017-07-14 09:10:10 +08:00 via Android
    有 ssr 支持吗?
    wwqgtxx
        11
    wwqgtxx  
       2017-07-14 10:09:18 +08:00
    其实我倒是希望有个纯 UDP 的 haproxy,这样就可以方便的在路由上配置多服务器了
    顺便问一下,你的 glider 支持 socks5 udp 模式么
    evlos
        12
    evlos  
       2017-07-14 10:24:39 +08:00 via iPhone
    赞,以后应该开发时会用到
    SoulGem
        13
    SoulGem  
       2017-07-14 10:33:44 +08:00
    支持
    nieyujiang
        14
    nieyujiang  
       2017-07-14 10:43:26 +08:00
    随手就是一个 Star
    nadoo
        15
    nadoo  
    OP
       2017-07-14 10:57:29 +08:00 via iPhone
    @v1024 其实就只参考了 gost 的命令行参数方式,它代码有点复杂,懒得看.... -l 监听,-f 转发,感觉比给每种协议一个参数简单不少
    nadoo
        16
    nadoo  
    OP
       2017-07-14 11:06:29 +08:00 via iPhone
    @wwqgtxx 我正好相反,我是尽量只用 tcp,因为之前买的 ss 服务感觉 udp 经常断流,所以我专门加了个 dnstun,把 udp 的 dns 请求转到 tcp 里面发出去,好走 ss 的 tcp 通道在远程解析。

    我也是找了一些 dns udp 转 tcp 的代码,发现都对 dns 协议做了解析,或者利用了第三方完整的 dns 库,加上后程序要大好几兆。看了下 dns 的 rfc,发现 udp 和 tcp 的 dns 只是有几个字节不同,所以干脆自己写转换,见 dnstun.go

    类似的还有 http 代理,http 协议看起来简单,要做一个完善的代理真是有些复杂,我开始试过直接使用 net/http,或者第三方的 goproxy,但加进来后程序起码大了 3M,所以还是自己实现了简单的 http 代理,绕过了一些问题,但估计还是有 bug,对我来说,应急够了,也顺便学习了下代理的工作方式...

    我先看看大家需要 udp 模式的多不多...
    nadoo
        17
    nadoo  
    OP
       2017-07-14 11:32:47 +08:00
    @kmahyyg 采用的 go 的那个包,似乎不支持.
    nadoo
        18
    nadoo  
    OP
       2017-07-14 11:33:23 +08:00
    @nieyujiang 谢谢!
    wwqgtxx
        19
    wwqgtxx  
       2017-07-14 11:42:18 +08:00
    @nadoo 其实我也是不理解为什么原版的 SS 协议中的 UDP 转发部分一定要单独走 UDP 通道,这样很容易被干扰,直接放在 TCP 中封装一下,然后在服务器端解封不是很好么?
    我这里用多服务 SS 倒是有另一个需求就是如下图:
    ........................................................|-->虚拟机 2 的 ss-server->校园网->|
    主机 ss-tap->虚拟机 2 的 haproxy--|....................................................... |->校园网出口网关->互联网
    ........................................................|->虚拟机 1 的 ss-server->校园网-> |
    这样实现校园网的网速叠加,由于校园网需要登录验证,所以这个地方没办法用 openwrt/lede 的多 WAN 口叠加功能
    我上网找了一圈也没找到几个好用的支持 UDP 转发的 socks5 服务器程序(就算支持,经过 haproxy 反代之后基本上就瘫掉了),所以只好用 SS 协议了。这里 SS 协议中的 udp 代理部分又成了一个麻烦事,haproxy 不支持 UDP 反代,找遍了 github 也没找到能支持均衡代理 udp 的好用的程序,所以最后只能单独开了一个 ss-server 专门跑 udp,这样虽然 udp 无法实现网速叠加,起码能用了。而直接用 haproxy 往后端 SS-SERVER 好处是可以充分叠加网速,缺点是用 round-banlace 模式会导致 ss-server 反复报 replace IV 的错误,所以不管怎么实现都是个蛋疼的事,找不到什么好用的办法
    latelan
        20
    latelan  
       2017-07-14 14:53:03 +08:00
    学习了
    ckzx
        21
    ckzx  
       2017-07-14 14:59:04 +08:00
    这个 https 是同理加吗?
    nadoo
        22
    nadoo  
    OP
       2017-07-14 16:02:49 +08:00
    @ckzx glider 支持的是 http 代理,支持普通 http 和 http connect 方式,connect 方式就可以支持在上面跑 https.
    nadoo
        23
    nadoo  
    OP
       2017-07-14 16:06:43 +08:00
    @wwqgtxx 我有空研究下 udp over tcp 的支持
    designer
        24
    designer  
       2017-07-14 16:09:57 +08:00 via iPhone
    资持!
    nadoo
        25
    nadoo  
    OP
       2017-07-14 16:15:50 +08:00
    @wwqgtxx 可以问下你主要是什么应用要用到 udp 协议呢?我感觉我的场景里面,tcp 能够解决一切问题。。。
    wwqgtxx
        26
    wwqgtxx  
       2017-07-14 16:40:47 +08:00 via iPhone
    @nadoo 其实作为我自己写的程序,也是 tcp 就够了,但是实际上还是有很多程序需要用 udp 比如 dns/ntp/quic/skype 之类的,以及各种网络游戏,在这个情况下如果不支持 udp 代理就很蛋疼了
    nadoo
        27
    nadoo  
    OP
       2017-07-14 16:43:28 +08:00
    @wwqgtxx dns 我会用到,因为 dnsmasq 配合 gfwlist,上级代理只支持 udp 的,所以我简单加了个 dnstun 的解决方案。
    其它的我暂时没用到,我考虑一下,这是学习的好机会。-_-!
    nadoo
        28
    nadoo  
    OP
       2017-07-15 11:31:27 +08:00
    0.1.1 版本,修复了几个重要 bug:
    - 代理周期性检查造成打开文件过多(defer 放在 for 循环里面的低级错误)
    - 多代理高可用模式不生效

    https://github.com/nadoo/glider/releases
    nadoo
        29
    nadoo  
    OP
       2017-07-18 19:54:10 +08:00
    v0.2.0,添加了简单配置文件的支持:
    https://github.com/nadoo/glider/releases

    基础的可以了,后面可以安心增加功能了
    niuoh
        30
    niuoh  
       2017-07-19 19:12:05 +08:00
    分享一个好用的 http 代理 ip-chi.net
    felixonmars
        31
    felixonmars  
       2017-07-21 17:46:38 +08:00
    nadoo
        32
    nadoo  
    OP
       2017-07-21 18:12:45 +08:00
    @felixonmars 感谢!你在用 glider 吗? 因为 github issue 里有人提出需要配置文件的功能,就在 v0.2.0 加上了,很简单地利用了 go 标准的 flag 包,把配置文件的内容当成命令行参数来解析,这样基本不增加额外依赖,可执行文件大小基本不受影响。可惜 go 的标准包不支持参数的简写,所以顶楼里面的-l、-f 之类的参数,都改成全称-listen, -forward 了,用的时候要注意。
    felixonmars
        33
    felixonmars  
       2017-07-21 18:18:22 +08:00
    @nadoo 嗯,我在用,已经都在用全称了 :P
    nadoo
        34
    nadoo  
    OP
       2017-07-21 18:19:36 +08:00
    @felixonmars 因为没试过给发行版打包,如果需要标准化一些东西,例如默认配置文件放在 /etc/glider.conf 之类的,可以指出,我配合修改;
    felixonmars
        35
    felixonmars  
       2017-07-21 23:45:42 +08:00
    @nadoo 可以给一个标准的 glider.conf.example 我来装 :P 不过我现在是用了 /etc/glider 这个目录来做多配置……
    nadoo
        36
    nadoo  
    OP
       2017-07-22 11:32:25 +08:00
    @felixonmars 嗯,我看到你打包的文件了,比我的专业多了. :P
    nadoo
        37
    nadoo  
    OP
       2017-07-22 11:38:52 +08:00
    原本想要把 glider 做成特定针对国内上网环境的工具,集成 gfwlist 更新、策略 dns 转发、策略代理转发、ipset 自动维护、iptables 自动维护等功能,这样在 linux 网关上就可以不依赖 dnsmasq 了.

    现在这种形势,可能还是保持 glider 简单、通用更好一些,后面的功能计划还需要慎重考虑;
    nadoo
        38
    nadoo  
    OP
       2017-07-30 12:24:28 +08:00
    更新 0.3 版本,支持根据目的地设置代理策略(rulefile):
    https://github.com/nadoo/glider/releases

    配置文件样例:
    https://github.com/nadoo/glider/tree/master/examples
    nadoo
        39
    nadoo  
    OP
       2017-07-30 13:43:35 +08:00
    @felixonmars 我之前发布的 0.3 binary 有点问题,透明代理(redir)无法正常工作,另外 examples 文件夹下的部分配置文件有小 bug,想着没有什么人看到,重新上传了二进制文件。 刚点了一下,没想到 archlinux 的仓库已经更新了,可能需要再次替换更新一下,给你添麻烦了。 谢谢!
    nadoo
        40
    nadoo  
    OP
       2017-07-30 13:45:11 +08:00
    @felixonmars 不对,还是看错了,你是昨天更新的 0.2.1,嗯,那个版本没有什么明显 bug.
    felixonmars
        41
    felixonmars  
       2017-07-31 00:05:32 +08:00
    我是用代码直接编译的,没有用直接提供的 binary 哈,0.3 版本是重新 tag 了还是只是重新编译了?
    nadoo
        42
    nadoo  
    OP
       2017-07-31 00:17:01 +08:00
    @felixonmars 重发 binary 的时候重新 tag 过,目前 github 上那个 tag 和 binary 都是对的.
    felixonmars
        43
    felixonmars  
       2017-07-31 23:49:07 +08:00
    好的,那我打的应该是修正后的 :)
    nadoo
        44
    nadoo  
    OP
       2017-08-23 22:56:38 +08:00
    发一个编译好的开发中的版本,添加了一个"list"。

    打开 rule 文件,在 forward 行加入你的代理服务器信息并取消行首注释(删除#),然后可以在浏览器中把 ip:8443 作为全局代理, 实现默认直连,list 中的网站使用上级代理;(类似浏览器 pac 的能力,在 glider 中实现了)
    https://github.com/nadoo/glider/files/1245821/glider-0.4alpha.zip

    有兴趣的同学可以先试一下
    Tink
        46
    Tink  
       2018-04-19 10:21:37 +08:00
    我想问下楼主这个和 gost 在性能上优势大否?
    defunct9
        48
    defunct9  
       2018-05-08 10:29:28 +08:00
    @nadoo 请教楼主
    我有两个 dns server , 一个带 AD 过滤,一个不带。
    所以想架一个服务器,根据 client 来源 ip 不同来分发到后端不同的 DNS server
    仔细看了半天文档,理论应该可以实现。

    但是怎么配置呢?
    yuchenr
        50
    yuchenr  
       2018-07-11 12:01:35 +08:00
    我来挖个坟。
    简单食用了下,负载均衡对比 gost 多了 ha,并且支持 AEAD 算法。
    另外是否支持 simple-obfs ?
    johnkiller
        53
    johnkiller  
       2019-01-08 22:11:37 +08:00
    太良心了,正好找到这里,比 gost 好用,感谢作者,也感谢 gost 作者!
    johnkiller
        54
    johnkiller  
       2019-03-14 17:02:29 +08:00
    作者你好,我用 glider 有好几个月了 ,发现一个现象,就是随着流量请求的增大,glider 占用内存几乎是 200-400m 的样子了,而且似乎不会被释放掉。。。但是 github 同类开源软件 goproxy 内存占用几乎稳定在 30m 一下(流量很大也是),但是功能不如 glider 强大,现在已经离不开 glider 了,如果可以希望作者能优化一下(感激

    题外话:
    我发现用 sstap 连接 glider 的代理 udp 端口一直都是我设置的端口。
    类似:
    >> 服务器绑定在 172.16.*.*:1080.
    johnkiller
        55
    johnkiller  
       2019-03-14 17:04:45 +08:00
    @johnkiller 一下点了回复了,继续上一楼
    用 goproxy 代理的时候每次连接 udp 端口都是随机的,而不是固定我给的 1080,会不会是这个原因
    >> 服务器绑定在 172.16.*.*:62961.
    foxconndmd
        57
    foxconndmd  
       2021-03-12 08:41:07 +08:00
    支持远程转发吗?即可通过代理链将本地端口映射到远程服务器上。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4466 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 04:07 · PVG 12:07 · LAX 20:07 · JFK 23:07
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.