shadowsocks/shadowsocks-windows

讨论:支持多个规则来源和/或GeoIP

Opened this issue · 12 comments

实现从多个来源添加规则,并/或支持GeoIP

基于 #2671 (comment) 的进一步考虑

需要解决的内容

  • GeoIP数据库解析
  • 制定程序本体与PAC间的接口标准
  • 一个符合上述标准的PAC
  • 实现多规则设定界面

待确定的问题

  • 配置应该以什么格式传递给PAC?
  • IP规则应当采用什么记法?(使用CIDR记法,单独传入,不和GFWList混合)
  • GFWList似乎没有形成完整的标准?
  • 应该支持哪些规则来源?
    • GeoIP
    • GFWList-base64
    • GFWList-纯文本

UI草案

+------------------------------------------+---+---+
| 系统代理设置                             | _ | x |
+------------------------------------------+---+---+
| [ ] 关                                           |
| [ ] 全局                                         |
| [.] PAC                                          |
|    [.] 本机PAC [C:\pac.txt                 ]     |
|    [ ] 在线PAC [http://example.com/pac.txt ]     |
|    [ ] GFWList规则                               |
|                                                  |
|    +------------+------------------------------+ |
|    | 类型       | 值                           | |
|    +------------+----------------------------+-+ |
|    | GFWList    | http://example.com/gfwlist |*| |
|    | 文本规则   | C:\rule.txt                |*| |
|    | 文本规则   | http://example.com/rule    |*| |
|    | GeoIP直连  | CN                         |-| |
|    | GeoIP代理  | LAN                        | | |
|    |>           |                           <| | |
|    |            |                            | | |
|    +------------+----------------------------+-+ |
|     [添加]   [删除]   [复制]   [上移]   [下移]   |
|                                                  |
|    +-规则设置----------------------------------+ |
|    | 类型 [ GeoIP       |#]                    | |
|    | 地区 [ RU          |#]                    | |
|    +-------------------------------------------+ |
|                                                  |
|     默认 [.] 直连 [ ] 代理                       |
|     在线规则自动更新 [ 1年      |#]              |
|                                                  |
+--------------------------------------------------+

GFWList 还有非常非常多的域名没有添加进去,很多小站被墙了,这里面都没有。

所以 ss 要想很好的翻墙,就只能选择全局模式了,但是那样的话,访问国内网站又会变得很慢,唉

程序本体与PAC间的接口标准,草案:

const __PROXY__: string;	// proxy provided by shadowsocks-windows
const __RULES__: string[];	// Legacy, GFWList rules

interface CIDRList {
	v4: string[],	// IPv4 CIDR ordered
	v6: string[]	// IPv6 CIDR .......
}

const __RULESET_V1__: {
	version: 1,
	cidr: { // GeoIP
		black: CIDRList,
		white: CIDRList
	},
	gfwlist: string[]	// GFWList rules
}

先征求意见。

接口标准草案

考虑到GeoIP规则应该可以和GFWList规则混合排序,以及可以有多个GFWList规则,采用以下标准:

declare const __RULES__: string[];
declare const __USERRULES__: string[];
declare const __PROXY__: string;

declare type RuleGroup = CIDRRule | GFWListRule;
interface CIDRRule {
	type: 'cidr';
	rules: string[];
	whitelist: boolean;
}
interface GFWListRule {
	type: 'gfwlist';
	rules: string[];
}
interface RuleSetV1 {
	version: 1;
	rules: RuleGroup[];
}
declare const __RULESET_V1__: RuleSetV1;

用GeoIP比PAC好。

用GeoIP比PAC好。

准备全都要

希望shadowsocks-windows、shadowsocks-qt5和shadowsocks-libev可以支持GeoIP,跨平台使用比较方便。

希望shadowsocks-windows、shadowsocks-qt5和shadowsocks-libev可以支持GeoIP,跨平台使用比较方便。

据我所知,shadowsocks-qt5停止开发了,而且它自身并没有负责路由的组件。shadowsocks-libev,包括其他命令行版本似乎也没有路由功能,也谈不上GeoIP。

shadowsocks-windows的路由功能是由系统代理(以及PAC,代理自动配置脚本)实现,换PAC脚本之后可以比较简单地使用GeoIP。

@celeron533 考虑在PACServer.SendResponse()里面先把规则和代理地址一起发送,然后用SendFile发送硬盘上没有包含规则的PAC脚本,这样不用监听PAC脚本的变化,也可以把规则和脚本拆开,方便用户维护。

图片

在做了.jpg

考虑改用v2ray规则,在代理服务器内进行路由,同时用v2ray的geosite数据库代替gfwlist。换句话说路由部分的设计向v2ray靠拢。

问题:

  • 代理服务器需要支持直连和拒绝连接,在这之前需要不少的整理重构
  • geosite数据库需要protobuf或者自己重新编译
  • 是否需要类似adblock的规则订阅
  • 显然我们需要新的窗口,在v4.x还是v5实现,WinForm还是WPF?

If you guys really want to add GeoIP feature, you should avoid DNS poisoning first or add a feature that allows domains in a specific list to skip the DNS resolution process like V2Ray does.