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

Specht--开源的基于 Network Extension 的 Mac 版代理

  nbndco · 2016-08-12 13:41:55 +08:00 · 19559 次点击
这是一个创建于 3024 天前的主题,其中的信息可能已经有所发展或是发生改变。

splash.png

之前写了一个 iOS/macOS 的库,NEKit,还在更新。功能可以自己看,简单点说就是封装了 Surge iOS 的核心功能,包括 tun2socks 。

有一些人想要一个 demo ,所以就把一个我自己写的之前用了很久的代理软件的界面基于 NEKit 写了一个。 功能可以比照 Surge 的核心功能,我就不列了。

Specht 有两个版本。

Specht是基于 Network Extension 的。可以自动设置代理,可以转发所有的 TCP 流,包括所有不支持代理的软件。但是苹果的限制是 Developer ID 是不能签名需要 Network Extension 的应用的,想要用 Specht ,必须要自己用有 Network Extension 权限(需要单独申请,免费)的开发者账户( 99 刀),或者我发布到 Mac App Store 。所以想要用的话,至少你要有开发者账户,然后自行编译签名。你应该可以注意到,不同于 iOS , Surge 的 Mac 版也是不基于 Network Extension 的。所以在这个意义上, Specht 的功能比 Surge 的 Mac 版要强,当然我是希望 Surge 直接基于 Network Extension 上架 App Store 的(这样我估计我也没动力更新 Specht 了),当然别卖 648 就好。 iOS 上的 Surge 很棒(虽然曾经很不稳定),所以我对于写一个 Specht 的 iOS 版完全没有任何动力。

但考虑到这样就几乎没人能用,所以又有了SpechtLite。这个版本可以直接下载,人人可用。不基于 Network Extension 的问题是不能自动设置代理,只有支持代理的应用才能使用,但是如果 Surge 的 Mac 版够用的话,那么 SpechtLite 也是够用的。

如何选择:

  1. 有开发者账户并且有 Network Extension 的权限 -> Specht
  2. 只是想有个基于规则的代理,并且有 Surge 的 iOS 版 -> Mac 版的 Surge
  3. 只是想有个基于规则的代理,没有 Surge 想要 Mac 版的 Surge 的功能但是不在意没有华丽的 GUI -> SpechtLite
  4. 什么都想要而且还不想花钱的,你可以看着 Specht 基于 NEKit 自己写一个。有了 NEKit 其实也就是界面写起来比较烦心

有问题的话可以去 Gitter 问 Join the chat at https://gitter.im/zhuhaow/NEKit

第 1 条附言  ·  2016-08-13 09:44:40 +08:00
谢谢 @ProfFan 的指出。
License 这边之前想的有点问题。

NEKit 是 BSD 3-Clause 的,所以大家随意用。

Specht 和 SpechtLite 我的设想是:大家随意用,只要保持开源就好,如果你想要不改就发上 App Store 也随意(不过这样太……)。所以用的是 GPLv3 。但是 @ProfFan 提醒了我 GPL 和 App Store 是不兼容的(参加 VLC ),也就意味着还是无法发布。

我研究了一下,想要保持开源就要 Copyleft ,而 Copyleft 里面似乎只有 MPL 可以上 App Store 。但是 MPL 并不要求项目开源,只要求原来的文件和修改的文件开源,基本上可以随意绕过(如果一个人遵循许可证的话),所以没啥意义。

这样的话目前除了我没人能发布 Specht 。

如果有人有什么方案的话可以告诉我,虽然我不太乐观,因为几乎只要是 Copyleft 就很难和苹果的政策兼容。
92 条回复    2017-10-31 17:58:12 +08:00
youthcould
    1
youthcould  
   2016-08-12 13:45:26 +08:00
手动点赞
kappa
    2
kappa  
   2016-08-12 13:47:29 +08:00
题外话,有没有好的 HTTPS proxy server 项目推荐?
nbndco
    3
nbndco  
OP
   2016-08-12 13:48:54 +08:00
@kappa 用 polipo 这样的然后 nginx 转发?证书可以用 Let's encrypt.
kappa
    4
kappa  
   2016-08-12 13:55:18 +08:00
@nbndco 我倒是想试试 phuslu 的新项目 https://github.com/phuslu/goproxy 方便扩展点
WildCat
    5
WildCat  
   2016-08-12 13:59:07 +08:00 via iPhone
赞!虽然我还没申请到 Network Extension 🌚
shadowrocket 那样的 App 可以不需要 Network Extension 吧?
tyhunter
    6
tyhunter  
   2016-08-12 14:13:18 +08:00
希望更多类似 Surge 的竞品能够出现
nbndco
    7
nbndco  
OP
   2016-08-12 14:14:29 +08:00   ❤️ 1
@WildCat 没用过,我只能猜猜,它用的是什么我不知道,但是想要常驻后台的话唯一的办法就是用 Network Extension ,其他办法苹果一定会拒。他应该是利用 Network Extension 运行代理服务器,在系统设置里设好代理,但是不处理 IP 包的。处理 IP 包这点确实很麻烦,其实也没啥用。
nbndco
    8
nbndco  
OP
   2016-08-12 14:15:19 +08:00
@kappa goagent ? Google IP 都死光了,每天光剩找 IP 了,而且还都很慢。
kappa
    9
kappa  
   2016-08-12 14:25:39 +08:00
@nbndco goproxy 。。
nbndco
    10
nbndco  
OP
   2016-08-12 14:31:42 +08:00
@kappa 看起来就是一个 Go 版的 goagent 啊
Pyromaniac
    12
Pyromaniac  
   2016-08-12 14:51:04 +08:00
这个图标好棒
nbndco
    13
nbndco  
OP
   2016-08-12 15:46:39 +08:00
@kappa 如果是自己的服务器看不出这样做的意义。
n6DD1A640
    14
n6DD1A640  
   2016-08-12 17:03:17 +08:00
@nbndco 跑个题, NEKit 的 repo 貌似接近 1G ?
xjbeta
    15
xjbeta  
   2016-08-12 17:03:51 +08:00
梯子架路由器上了 一身轻松。。。
nbndco
    16
nbndco  
OP
   2016-08-12 17:06:24 +08:00
@n6DD1A640 你之前 clone 过?之前自动生成文档推送到 gh-pages 的分支的逻辑有点问题,现在已经修正了。你删了重新 clone 应该没问题。
Phant0m
    17
Phant0m  
   2016-08-12 17:07:24 +08:00
希望作者发布到 Mac App Store 上
n6DD1A640
    18
n6DD1A640  
   2016-08-12 17:10:07 +08:00
@nbndco 对,上月 clone 过想折腾下,但是一看 1g 的大小。。。好吧我晚上再试试
jakes
    19
jakes  
   2016-08-12 18:17:29 +08:00 via Android
发布到 app store 吧,花点钱没事,不要 600+ 就好。
ProfFan
    20
ProfFan  
   2016-08-13 00:06:08 +08:00
GPLv3 发不了 App Store 吧。。。
nbndco
    21
nbndco  
OP
   2016-08-13 06:50:48 +08:00
@ProfFan 发现这个问题了……但是我想的是强制开源……查了一下似乎没有这样的许可证
nbndco
    22
nbndco  
OP
   2016-08-13 06:59:38 +08:00
@ProfFan 所以目前似乎 Specht 只有我本人能发布……这我怎么改好
NEKit 是 BSD 的,大家还是可以用 NEKit 写一个发布 App Store 的……
Vanson
    23
Vanson  
   2016-08-13 08:15:15 +08:00
@nbndco 快上商店吧,非常感谢
Lattez
    24
Lattez  
   2016-08-13 10:21:13 +08:00 via Android
看着非常赞……本来已经准备买快要单独卖授权的 surge for mac 了……
VmuTargh
    25
VmuTargh  
   2016-08-13 11:57:23 +08:00
原来 NEKit 就是尼写的啊。赞一个!
不过窝好像记得开源上 App Store 可以采用源代码一份授权( GPL ),然后二进制一份授权。具体的可以问问有类似经验的开发者 w
nbndco
    26
nbndco  
OP
   2016-08-13 12:20:08 +08:00   ❤️ 1
@VmuTargh 主要问题是这样的,版权在我,我发布的时候想怎样授权苹果自然都没问题。但我仅给了 GPL 授权之后所有其他人分发的时候必须要提供所有的代码能够重新构建二进制版本。问题是苹果会对用户发布的二进制包进行改动,而这个改动的过程是没有代码的,由于其他人不能进行 GPL 以外的授权,分发其他人上传的软件苹果会违反 GPL ,因此苹果是不上架仅有 GPL 协议的软件的。
VmuTargh
    27
VmuTargh  
   2016-08-13 12:40:00 +08:00
@nbndco soga THX
g67261831
    28
g67261831  
   2016-08-13 14:06:56 +08:00
点赞,已 star
Sequencer
    29
Sequencer  
   2016-08-13 19:04:30 +08:00
@nbndco 补充协议了?
nbndco
    30
nbndco  
OP
   2016-08-13 20:40:35 +08:00
@Sequencer 并没有, NEKit 是 BSD 3 , Specht 是 GPLv3 ,没有改过
alang
    31
alang  
   2016-08-14 07:25:48 +08:00
要手工写配置文件,时间宝贵,没时间研究。
tengyoou
    32
tengyoou  
   2016-08-15 12:15:02 +08:00
懒得折腾,已经花了 648 买了 surge ,为这个开源点赞。。。。
paradoxs
    33
paradoxs  
   2016-08-16 18:51:22 +08:00
收藏了, 请务必发到 mac app store
majinjing3
    34
majinjing3  
   2016-08-16 19:48:23 +08:00 via Android
点赞!支持下啦!
blankwonder
    35
blankwonder  
   2016-08-16 20:33:01 +08:00
支持一下,另外说下 Surge Mac 不使用 NE 的原因是: Mac 环境下通过 tun 转发所有流量代价太大, UDP , ICMP 等等协议都要单独再做一次 NAT 支持,广播包也会有一定影响,且 Mac 中文系统下 NE 有 Bug ,大部分用户会用不了。
ddqp
    36
ddqp  
   2016-08-16 20:42:47 +08:00
@blankwonder 现身说法
dongoo
    37
dongoo  
   2016-08-16 20:49:59 +08:00 via Android
点赞收藏了 👍
nbndco
    38
nbndco  
OP
   2016-08-16 20:58:33 +08:00
@blankwonder 我想过这个问题,除了 UDP 和 TCP 所有的包都要丢, ipv6 的话可能有更多问题,但是就个人角度完全没有影响。
tony1016
    39
tony1016  
   2016-08-17 09:29:52 +08:00
有意思
WildCat
    40
WildCat  
   2016-08-18 05:19:40 +08:00
楼主您好,想问下你 NEKit 是什么 License ?
看了下没太明白是啥
nbndco
    41
nbndco  
OP
   2016-08-18 06:50:51 +08:00 via iPhone   ❤️ 1
@WildCat BSD
tys
    42
tys  
   2016-08-23 09:16:18 +08:00
@ nbndco 感谢,已经用上了,挺不错的
ProfFan
    43
ProfFan  
   2016-08-24 11:21:42 +08:00
@nbndco 这方面的先例就是 VLC 了,可以参考。 VLC 采取的是整体迁移到 LGPL 的办法。
http://blog.tai2.net/lgpl_and_appstore.html#id10
chztv
    44
chztv  
   2016-09-08 13:24:33 +08:00
@nbndco 楼主你好,配置中的 directlist directiprange 两个 List 文件能提供吗?
nbndco
    45
nbndco  
OP
   2016-09-08 13:32:04 +08:00 via iPhone
@chztv ……你自己写啊,不需要可以直接把 rule 删掉,说明里也有写这两个文件应该怎么写的,就是一行一个 ip 或者正则
iWill
    46
iWill  
   2016-09-09 10:42:58 +08:00
谢谢 lz 分享这么好的 app 。

有个问题请教,就是 SpechtLite 可以像 surge for mac 那样屏蔽广告么?
还有就是规则和 surge 是不通用的么?

thanks
nbndco
    47
nbndco  
OP
   2016-09-09 10:52:51 +08:00 via iPhone
@iWill 规则不通用,想屏蔽广告的话建个广告域名的 list 转发到 reject 这个类型的 adapter 去。
iWill
    48
iWill  
   2016-09-09 11:08:50 +08:00
谢谢告知, NSRegularExpression 这些正则对于我这些 it 盲来说真心看不懂。
顺便问问能否作者出个 sample 出来,例如类似:

DOMAIN-KEYWORD,cnzz,REJECT
DOMAIN-SUFFIX,3600.com,REJECT
DOMAIN-KEYWORD,youtube,Proxy,force-remote-dns

的怎么表达, 因为一直用的 surge ,所以目前转到 SpechtLite 规则有一些不懂怎么转, thanks
nbndco
    49
nbndco  
OP
   2016-09-09 16:48:06 +08:00
@iWill 我随便写一下,你自己理解下:
大致上你需要先定义两个 adapter :
- id: proxy
type: http/ss 你自己看
- id: reject
type: reject

然后定义两个 rule
- type: list
file: reject_list
adapter: reject
- type: list
file: whitelist
adapter: proxy

然后在 reject_list 里:
cnzz
3600\.com$

在 whitelist 里:
youtube

要是有人愿意写教程就好了,我真的没这个心情和时间
nbndco
    50
nbndco  
OP
   2016-09-09 16:48:51 +08:00
@iWill 格式有点乱了,你理解一下就好
chztv
    51
chztv  
   2016-09-09 17:05:43 +08:00
@iWill 这个的规则和 Surge 还是差的比较大,原来以为可以搞个 gfwlist 直接用,一看作者整的格式和 gfwlist 还不一样,唉……
只能下载用最简单的规则试用了下,用肯定是能用,参照了作者 Github 上的配置文件,没有单独配置 list 文件。
最好是有像 Scomper 老师这样的牛人,能整个直接用的配置文件。
nbndco
    52
nbndco  
OP
   2016-09-09 18:07:35 +08:00 via iPhone   ❤️ 1
@chztv 其实 SpechtLite 都不是我的本意,而是 NEKit 的副产品,我本身只是把它作为一个 demo 而已。
NEKit 的文档明确指出不建议使用自带的配置文件, NEKit 提供的是功能,配置方式应该由 App 自行处理。 SpechtLite 当前使用的配置文件其实只是 NEKit 提供来快速构建原型用的。
当然我可以直接去支持 gfwlist ,第一我本人不用这种体验不好的方式,毕竟被封的很多网站并不再列表中,还有很多基本无法正常访问的未被封网站,第二支持 gfwlist 本身不符合 NEKit 的设计理念,一个构建原型的组件为何要支持如此复杂的功能?如果 App 想要支持 gfwlist ,那么应当由它自行完成,如果处理过程中需要 NEKit 提供一些通用的基本功能,那么 NEKit 可以实现。
但支持 gfwlist 就意味着 SpechtLite 开始提供超越了 demo 的功能了,这样的话 SpechtLite 需要的改进就太多了, NEKit 本身就有很多的事情还要做,外加我还有很多其他的事情,所以……
iWill
    53
iWill  
   2016-09-09 18:21:16 +08:00
@nbndco @chztv

非常感谢 两位 的解说,我的已经弄好了, so far so good.

再次感谢。
iWill
    54
iWill  
   2016-09-11 22:58:55 +08:00
@nbndco 今天发现个问题,就是 .SpechtLite 目录如果有多个 .yaml 设置文件。选单里排序很有问题,不是按字母/数字排序,而是乱排序。

希望这个小 bug 能够 fix ,谢谢。
nbndco
    55
nbndco  
OP
   2016-09-12 15:25:50 +08:00 via iPhone
@iWill 嗯。谢谢建议
jefby
    56
jefby  
   2016-09-14 20:18:24 +08:00
赞👍!很想试试 Specht 啊,但是证书一直申请不下来,太慢了。。
lzs5240
    57
lzs5240  
   2016-09-15 00:29:12 +08:00
这个怎么在配置中配置某个 App 呀? 例如 Mail 走代理
nbndco
    58
nbndco  
OP
   2016-09-15 07:45:09 +08:00 via iPhone
@lzs5240 不能
DylanWu
    59
DylanWu  
   2016-09-27 21:43:17 +08:00
@tys 编译总是失败,想请教一下
yangpai
    60
yangpai  
   2016-10-18 11:57:08 +08:00
同一个 ss 服务端,用 spechtlite 比较慢, 不知道啥原因。 用其他客户端就好一点。
yangpai
    61
yangpai  
   2016-10-19 11:24:22 +08:00
@yangpai 重新配置了一下, 良好。感谢楼主^_^
chaucerling
    62
chaucerling  
   2016-10-28 10:54:54 +08:00
把 shadowsocksX-ng 换成 spectchlite ,感觉好用多了
我提交了 caskroom ,已经 merge 了,大家可以通过 brew cask install spectchlite 来安装
chaucerling
    63
chaucerling  
   2016-10-28 10:57:51 +08:00
@chaucerling 应该是 brew cask install spechtlite ,手快打错了
nbndco
    64
nbndco  
OP
   2016-10-29 22:16:35 +08:00 via iPhone
@chaucerling 最大的问题就是 cask 和自带更新很难协作
chaucerling
    65
chaucerling  
   2016-10-29 23:19:32 +08:00
@nbndco
自带更新是覆盖原来的 app 文件吗
如果是,那 cask 只是用来安装,像 atom 那样标注一下 "auto_updates" 可不可以?
nbndco
    66
nbndco  
OP
   2016-10-29 23:20:23 +08:00
@chaucerling 我也不知道,没有研究过 cask
Esay
    67
Esay  
   2016-11-05 03:11:26 +08:00   ❤️ 1
没有深入看 NEKit 的代码,但是搜索了一下 Github ,并没有使用 NEHotspotHelper ,是不是现在不需要 entitlements 了?

https://developer.apple.com/reference/networkextension

Except when you use the NEHotspotHelper class, you do not need to obtain entitlements from Apple to use Network Extension classes. To request an entitlement to use the NEHotspotHelper class, visit https://developer.apple.com/contact/network-extension.
nbndco
    68
nbndco  
OP
   2016-11-05 06:45:14 +08:00 via iPhone
Esay
    69
Esay  
   2016-11-06 11:32:15 +08:00 via iPhone
@nbndco 谢谢
dreammes
    70
dreammes  
   2016-11-07 22:55:41 +08:00
点赞
sutra
    71
sutra  
   2016-11-22 11:47:46 +08:00
可以试试 dual-licensing.
Esay
    72
Esay  
   2016-11-22 14:36:08 +08:00   ❤️ 1
@nbndco 发邮件申请,收到苹果的回复说并不需要申请了,直接在 developer.apple.com/account 里可以开启 Network Extension 。

Thank you for requesting information about the Network Extension framework. Please note that as of November 10, 2016 this process is not required for developers who wish to use App Proxy, Content Filter, or Packet Tunnel APIs. To use these services please navigate to your Developer Account at <https://developer.apple.com/account/> and select the Network Extension capability for the App ID you will be using for your app.
Esay
    73
Esay  
   2016-11-23 13:17:37 +08:00
@nbndco 花了一些时间试了一下,现在不需要申请就可以运行调试 Network Extension 了。
感谢开源 NEKit ,非常好用。
jason19659
    74
jason19659  
   2016-12-05 13:32:50 +08:00
非常感谢原作者的这款软件。告别了 surge 。。
wuming
    75
wuming  
   2016-12-09 23:14:59 +08:00   ❤️ 2
感谢作者的工具,写了一个脚本可以生成对应兼容的配置文件, https://github.com/geekpi/SpechtLiteConf
lazyyz
    76
lazyyz  
   2016-12-16 14:00:17 +08:00
今天折腾了一下,还是没弄明白,我还是老老实实用 SsX-NG 吧
ZernonHuang
    77
ZernonHuang  
   2016-12-27 09:01:05 +08:00
原来 Specht 和 SpechtLite 都没有上架...微博看到有人在安利,商店搜索了两下没找到。感谢作者的工具 : )
123s
    78
123s  
   2017-01-10 21:11:43 +08:00
原来不支持配置某个 app 走代理 ....
sky586hf
    79
sky586hf  
   2017-01-17 01:30:44 +08:00
@wuming 这个脚本怎么用啊
wuming
    80
wuming  
   2017-01-17 09:21:34 +08:00
@sky586hf 已经在 Readme.md 里面写了
sky586hf
    81
sky586hf  
   2017-01-18 00:56:00 +08:00
@wuming 还有一个问题就是,使用了里面的规则以后,谷歌香港也就是 google.com.hk 打不开, google.com 是可以打开的
wuming
    82
wuming  
   2017-01-18 12:01:29 +08:00
@sky586hf 更新后重新试一下
sky586hf
    83
sky586hf  
   2017-01-19 02:25:18 +08:00 via iPhone
@wuming 现在可以了,感谢
xy19009188
    84
xy19009188  
   2017-03-18 21:55:33 +08:00
@wuming 我 fork 一下你的项目,然后自己更新了文件,主要综合了一下 rejectlist ,现在全面去广告了,作为非程序员,表示第一次用 github ,您看有哪些违反规定了吗?我好修改。
nbndco
    85
nbndco  
OP
   2017-03-19 09:03:42 +08:00
@xy19009188 你要是开源了就没有
xy19009188
    86
xy19009188  
   2017-03-19 10:28:36 +08:00
@nbndco 因为我就丰富了 rejectlist 了嘛,我就直接上传了: https://github.com/S7venYoung/SpechtLiteConf-ADB
nbndco
    87
nbndco  
OP
   2017-03-19 11:18:57 +08:00
@xy19009188 你这个不是我的项目,而且 MIT 协议你可以随意处理
xy19009188
    88
xy19009188  
   2017-03-19 11:27:21 +08:00
@nbndco 这是 @wuming 他的,所以我 @wuming 了,既然没啥毛病,就先这样吧,感谢解答,同时也感谢大神写了这个牛逼的工具
Wao
    89
Wao  
   2017-09-22 16:48:53 +08:00
感谢,已经用上了
weihongchang
    90
weihongchang  
   2017-10-10 20:06:23 +08:00
问下 mail iCloud 的邮箱。老是 ssl 错误,这个 specht lite 怎么弄?
weihongchang
    91
weihongchang  
   2017-10-11 18:08:21 +08:00
@weihongchang 解决了,我的是 https 的 socks 代理关闭就好了
rove
    92
rove  
   2017-10-31 17:58:12 +08:00
手动点赞
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   930 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 30ms · UTC 21:36 · PVG 05:36 · LAX 13:36 · JFK 16:36
Developed with CodeLauncher
♥ Do have faith in what you're doing.