v2fly/domain-list-community:社区维护的域名清单,如何生成 geosite.dat
社区管理的域列表。为 V2Ray 生成 geosite.dat。域列表社区 该项目管理域列表,在项目 V 中用作路由目的的地理站点。
秒懂
- 它是什么?
- domain-list-community 是 Project V 生态里的社区维护域名清单,把 data 目录下的纯文本规则编译成 geosite.dat 供 V2Ray 路由使用。它的设计刻意保持中立,不判定域名该被屏蔽还是代理,但这份克制也带来了使用上的取舍。
- 适合谁用?
- domain-list-community 适合需要按清单做路由分流、且愿意接受社区更新节奏的 V2Ray 用户。它不适合想要精确到单个域名、或者需要自定义匹配逻辑的人,因为 data 文件里的语法与 V2Ray 配置中的 domain 规则并不完全兼容,直接复制会出错。
- 能商用吗?
- 可以。MIT 是宽松许可证:你可以使用、修改并销售基于它的软件,只需保留版权和许可证声明。
- 还在维护吗?
- 在维护。仓库最近一次提交在 2 天前。
- 用什么语言写的?
- 主要是 Go(依据 GitHub 的语言统计)。
以上回答依据项目的 GitHub 数据(最近同步于 2026年9月14日)和我们的分析,不构成法律意见。
开源项目深度解析
它解决的是路由规则的分发问题,而不是判定问题
V2Ray 的路由配置里,domain 字段可以写一个域名、一个子域前缀或者一个正则,但把这些规则手工维护成一份大清单并不现实。domain-list-community 做的就是这件事:把社区维护的域名清单编译成一个 geosite.dat 文件,让路由配置里可以直接写 geosite:cn 或者 geosite:google 这样的引用。这个项目刻意声明自己不持立场,README 里写得很清楚,它不认可、不声称也不暗示某个域名应该被屏蔽或代理。这意味着清单本身只是一个数据源,具体怎么用取决于你的路由规则。这个定位让它可以被自由取用,但也意味着它不提供任何关于清单质量的承诺,你拿到的是一份社区投票式的集合。
data 目录的语法:include、属性与归属的三种机制
整个项目的核心是 data 目录下的一堆文本文件,每个文件名就是一个清单名。文件里每一行是一种规则,有 domain、full、keyword、regexp 四种类型,前缀可以省略,比如直接写 google.com 就等价于 domain:google.com。规则后面可以跟 @ 开头的属性,属性会保留在最终生成的清单里。还有一个 & 开头的归属语法,它可以把一条规则同时加入另一个清单,但归属关系只存在于数据管理阶段,不会出现在 dlc.dat 里。include 指令则用来把另一个清单整体拉进来,它支持带属性的选择性包含,比如 include:list2 @attr1 @-attr2 表示只引入带 attr1 且不带 attr2 的规则。README 特别提醒,include 后面的属性是过滤,不是标记,这个区别容易踩坑。
从源码生成 dlc.dat 的具体步骤
生成过程不复杂,前提是机器上有 golang 和 git。先 git clone https://github.com/v2fly/domain-list-community.git,进入目录后 go mod download 装依赖,然后直接 go run ./ 就会用当前工作目录下的 data 目录生成 dlc.dat。如果你有自定义的数据目录,可以用 go run ./ --datapath=/path/to/your/custom/data/directory 指定。想了解全部参数就运行 go run ./ --help。生成流程在 README 里分了五步:读取 data 目录、解析并解析归属和包含关系、去重排序、导出纯文本清单、最后生成 dlc.dat。每一步对应 main.go 里的具体实现,想深究就去读源码。对于不想自己编译的人,GitHub Releases 页面直接提供 dlc.dat 和 dlc.dat_plain.yml 的下载链接,还有对应的 sha256sum 校验文件。
路由配置里的实际用法:geosite 引用与属性过滤
在 V2Ray 的 routing 配置里,每个 data 目录下的文件都可以作为一条规则引用,格式是 geosite:文件名。README 给了一个例子,把 geosite:category-ads-all 和 geosite:category-porn 指向 Reject 出站,把 geosite:cn 和 geosite:private 指向 Direct,把 geosite:category-anticensorship 指向 Proxy-1。domainStrategy 设置为 IPIfNonMatch,意思是域名匹配不上时再走 IP 判定。属性过滤的写法是 geosite:xxx@ads,注意 README 明确说,独立的非分类广告清单已经被移除,比如 geosite:xxx-ads 这种命名不再可用,要用 @ads 属性代替。这个改动会影响旧配置,升级前需要检查自己的规则里有没有依赖旧命名。
一个明显的限制:规则类型与 V2Ray 配置不兼容
README 里有一处容易被忽略的警告:data 目录里的规则类型与用户在 V2Ray 配置文件里定义的 domain 规则并不完全兼容,不能直接复制粘贴。这意味着你在 data 文件里看到的 domain:google.com 这样的写法,和你在 V2Ray 配置里写的 domain:google.com 不是一回事。前者是给编译工具读的源数据,后者是路由引擎的匹配规则。实际使用中,你只能通过 geosite: 引用来间接使用这些数据,而不能把 data 文件里的行抄进自己的配置。这个设计增加了数据维护的灵活性,但增加了使用者的理解成本。另一个限制是 README 明确不鼓励新增 regexp 和 keyword 规则,理由是容易用错,而且代理软件对这两种规则的匹配效率不高。
维护成本与许可证:更新频繁,但责任在你自己
这个项目采用 MIT 许可证,意味着你可以自由使用、修改和再分发,只要保留版权声明。仓库的提交频率很高,从最近的 release 时间戳看,同一天内就有多个版本发布,说明清单更新是持续进行的。但频繁更新也带来一个问题:你没法保证自己引用的 geosite:cn 在某个时刻的内容是什么,除非自己锁定版本并校验 sha256sum。项目本身不提供任何稳定性承诺,清单内容的增删完全由社区提交决定。对于生产环境,建议固定使用某个具体 release 的 dlc.dat,而不是跟随 latest 标签,否则清单内容的变化可能在你不知情的情况下改变路由行为。
与手工维护域名规则相比,它的取舍在哪里
另一种做法是完全不依赖这个项目,自己在 V2Ray 配置里写 domain 规则。那种方式的好处是精确,每个域名都是你亲手确认过的,坏处是维护成本高,域名数量一多就难管理。domain-list-community 的定位是中间层:它把社区贡献的域名集中起来,用 include 和归属机制减少重复数据,最后编译成统一的 geosite.dat。代价是你失去了对单个域名的控制,清单里可能有你不需要的域名,也可能缺你需要的。这个项目不是数据库,它只是数据的搬运工,最终路由行为取决于你如何组合 geosite: 引用和属性过滤。如果你对某个清单的构成不满意,可以 fork 一份自己改 data 目录,然后用自己的 datapath 生成自定义的 dlc.dat,README 里提到了这个用法。
编辑结论
domain-list-community 适合需要按清单做路由分流、且愿意接受社区更新节奏的 V2Ray 用户。它不适合想要精确到单个域名、或者需要自定义匹配逻辑的人,因为 data 文件里的语法与 V2Ray 配置中的 domain 规则并不完全兼容,直接复制会出错。采用前先确认两件事:一是你需要的域名是否已有对应清单文件,二是你依赖的 @ 属性是否还在,特别是 @!cn 已经从 cn 清单中移除,旧配置里的 geosite:geolocation-cn@!cn 已失效。如果你只是想要一个开箱即用的广告拦截清单,这个项目明确移除了独立广告分类,你需要改用 geosite:xxx@ads 的写法。
社区笔记