Skip to content
luminsetPublic
forked from netheril96/MEOW

About

MEOW is a fork of COW that uses whitelist mode.

Resources

Stars

0 stars

Watchers

0 watching

Forks

 
 

Latest commit

 

History

1,174 Commits

Folders and files

NameName
Last commit message
Last commit date
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

MEOW Proxy

当前版本:1.5-nohafix 修改版(源版本 1.5) CHANGELOG Build Status

       /\
   )  ( ')     MEOW 是 [COW](https://github.com/cyfdecyf/cow) 的一个派生版本
  (  /  )      MEOW 与 COW 最大的不同之处在于,COW 采用黑名单模式, 而 MEOW 采用白名单模式
   \(__)|      国内网站直接连接,其他的网站使用代理连接

NOHAFIX 修改版说明

本修改版保留源版本号 1.5,运行版本格式为 1.5-nohafix[构建次数]。使用 script/build-nohafix.ps1 构建时会自动递增 build_count.txt,并生成 Windows amd64、Linux ARMv7、Linux ARM64 三个目标产物。

构建与兼容性

  • 增加 go.mod 与 go.sum,使旧 GOPATH 项目可在现代 Go 模块模式下构建。
  • 修复 chinaip_gen.go 文件头异常字符导致的编译失败。
  • 修复 chinaip_init.go 与 chinaip_data.go 中 IPv6 数据重复声明导致的编译失败。
  • 修复新版 Go 对测试函数命名的检查问题。
  • 当前项目可在 Windows 下本机构建,并可通过 Go 原生交叉编译输出 Linux ARMv7 与 Linux ARM64 程序。

配置文件自愈

  • Windows 下首次运行如果缺少 rc.txt,程序会自动创建默认配置文件。
  • 程序会自动创建 direct.txt、proxy.txt、reject.txt 名单文件,并在控制台输出提示信息。
  • 如果已有旧版本配置文件,程序会先读取其中已经启用的配置项,再按当前版本模板重新生成完整配置文件,并把旧配置值回填到对应分组。
  • 程序不再把新配置项追加到旧配置文件末尾,历史版本反复追加造成的重复配置分组会在重建时被清理。
  • 如果配置中指定了自定义 directFile、proxyFile、rejectFile,但对应文件不存在,程序会自动创建。
  • 配置中的文件路径类选项支持相对路径,相对路径统一按 rc 文件所在目录解析,包括 logFile、directFile、proxyFile、rejectFile、userPasswdFile、qqwryFile、cert、key。
  • 修复 Windows UTF-8 BOM 导致第一行配置项无法被识别的问题。

IP 库增强

  • 保留原有内置中国 IP CIDR 库,原始生成地址仍为 17mon/china_ip_list 的 IPv4 与 IPv6 列表。
  • 新增 QQWry.dat 本地 IPv4 库支持;当本地 QQWry.dat 不存在或读取失败时,程序会立即回退到内置中国 IP 库,并在后台尝试下载更新。
  • 如果本地 QQWry.dat 可读,且比本地 china_ip_list 文件更新,则 IPv4 判断优先使用 QQWry.dat;如果 QQWry.dat 无法判断,则继续回退到内置/本地 CIDR 库。
  • IPv6 仍使用原有内置/本地 CIDR 库。
  • QQWry.dat 默认更新地址为 https://raw.githubusercontent.com/FW27623/qqwry/main/qqwry.dat,可通过配置改为其他镜像。

配置示例:

# QQWry.dat 本地 IP 库路径;相对路径按 rc 文件所在目录解析
#qqwryFile = QQWry.dat

# QQWry.dat 在线更新地址
#qqwryUpdateURL = https://raw.githubusercontent.com/FW27623/qqwry/main/qqwry.dat

# QQWry.dat 自动更新频率;设置为 0s 可关闭定时更新
#qqwryUpdateInterval = 24h

黑白名单增强

direct.txt、proxy.txt、reject.txt 均支持以下规则:

  • 具体 IP:203.0.113.8
  • CIDR IP 段:198.51.100.0/24
  • IP 范围:192.0.2.10-192.0.2.20
  • 具体域名:www.example.com
  • 二级域名:example.com
  • 域名通配符:*.ads.example.net
  • URL path 片段:/ad/
  • URL query 片段:?ad.js

命中 reject.txt 时,程序会返回自带的 403 Forbidden 拦截页,提示访问的指定地址已经被拦截,并展示被拦截的目标地址。

代理模式

新增配置项 proxyMode,可写入 rc.txt:

# 代理模式,可选 default、keep、cow
# default:保持 MEOW 当前白名单模式不变
# keep:在 default 基础上,上游代理全部失败时尝试直连兜底
# cow:默认直连,直连失败时快速改用上游代理尝试连接
proxyMode = default

三种模式说明:

  • default:保持当前 MEOW 白名单模式不变。国内或白名单地址直连,其他地址走上游代理。
  • keep:保连接模式。默认判定逻辑不变;当请求需要走上游代理但所有上游代理连接失败,或上游代理真实请求返回 parentFallbackStatus 中的状态码时,程序会再尝试直接连接目标网站。
  • cow:COW 模式。未命中黑名单或显式代理规则时默认直连;如果直连失败且配置了上游代理,则快速切换为通过上游代理尝试连接。

状态码回退

状态码回退分为两个方向。程序会强制校验:同一个状态码不能同时出现在“直连转代理”和“代理转直连”两侧,否则启动时报错退出。

# 兼容旧配置,已不建议使用:直连收到该 HTTP 状态码时改用二级代理重试
# 请优先使用 directFallbackStatus;不能与 parentFallbackStatus 包含相同状态码,否则程序会报错退出
#httpErrorCode = 403

# 直连收到这些 HTTP 状态码时,改用二级代理重试;多个状态码用逗号分隔
# 仅当前请求正在直连、响应尚未发送给客户端且存在二级代理时生效
# 不能与 parentFallbackStatus 包含相同状态码;留空表示不启用该规则
#directFallbackStatus = 403

# KEEP 模式下,二级代理真实请求返回这些 HTTP 状态码时,尝试直连兜底;多个状态码用逗号分隔
# 仅 proxyMode = keep 且当前请求正在使用二级代理时生效;留空可关闭该规则
# 不能与 httpErrorCode/directFallbackStatus 包含相同状态码,否则程序会报错退出
parentFallbackStatus = 502,503,504

每个请求最多只会在直连和二级代理之间切换一次,避免异常状态码导致循环重试。parentProbeFailStatus 仅用于 loadBalance = latency 的周期探测,不参与真实请求的回退判断。比如 httpErrorCode = 503 与默认 parentFallbackStatus = 502,503,504 会冲突,程序会要求你删除其中一侧配置。

上游代理探测

新增 parentProbeURL 和 parentProbeInterval 配置项,仅在 loadBalance = latency 时使用,用于探测各个上游代理的连通性和延迟。

# 二级代理连通性/延迟探测地址,仅 loadBalance = latency 时使用
# 格式必须为 host:port;为空时使用默认值 www.google.com:443
# 域名示例:www.google.com:443;IPv4 示例:1.1.1.1:443;IPv6 示例:[2001:4860:4860::8888]:443
parentProbeURL = www.google.com:443

# 二级代理连通性/延迟探测周期,仅 loadBalance = latency 时使用
# 默认 60s;最小 10s,小于 10s 时会忽略配置并使用默认值,防止探测过于频繁
parentProbeInterval = 60s

配置解析策略:除明确允许空值的兼容项外,配置语法错误、未知配置项、非法数值、文件读取失败等都会输出错误并退出程序。parentProbeURL 是非关键探测地址,允许空值并回退到内置默认值。

MEOW 可以用来

  • 作为全局 HTTP 代理(支持 PAC),可以智能分流(直连国内网站、使用代理连接其他网站)
  • 将 SOCKS5 等代理转换为 HTTP 代理,HTTP 代理能最大程度兼容各种软件(可以设置为程序代理)和设备(设置为系统全局代理)
  • 架设在内网(或者公网),为其他设备提供智能分流代理
  • 编译成一个无需任何依赖的可执行文件运行,支持各种平台(Win / Linux / OS X),甚至是树莓派(Linux ARM)

获取

  • 从源码安装: 安装 Go,然后 go get github.com/netheril96/MEOW

配置

编辑 ~/.meow/rc (OS X, Linux) 或 rc.txt (Windows),例子:

# 监听地址,设为0.0.0.0可以监听所有端口,共享给局域网使用
listen = http://127.0.0.1:4411
# 至少指定一个上级代理
# SOCKS5 上级代理
# proxy = socks5://127.0.0.1:1080
# HTTP 上级代理
# proxy = http://127.0.0.1:8087
# shadowsocks 上级代理
# proxy = ss://aes-128-cfb:password@example.server.com:25
# HTTPS 上级代理
# proxy = https://user:password@example.server.com:port

工作方式

当 MEOW 启动时会从配置文件加载直连列表和强制使用代理列表,详见下面两节。

当通过 MEOW 访问一个网站时,MEOW 会:

  • 检查域名是否在直连列表中,如果在则直连
  • 检查域名是否在强制使用代理列表中,如果在则通过代理连接
  • 检查域名的 IP 是否为国内 IP
    • 通过本地 DNS 解析域名,得到域名的 IP
    • 如果是国内 IP 则直连,否则通过代理连接
    • 将域名加入临时的直连或者强制使用代理列表,下次可以不用 DNS 解析直接判断域名是否直连

直连列表

直接连接的域名列表保存在 ~/.meow/direct (OS X, Linux) 或 direct.txt (Windows)

匹配域名按 . 分隔的后两部分或者整个域名,例子:

  • baidu.com => *.baidu.com
  • com.cn => *.com.cn
  • edu.cn => *.edu.cn
  • music.163.com => music.163.com

一般是确定要直接连接的网站

强制使用代理列表

强制使用代理连接的域名列表保存在 ~/.meow/proxy (OS X, Linux) 或 proxy.txt (Windows),语法格式与直连列表相同 (注意:匹配的是域名按 . 分隔的后两部分或者整个域名)

致谢

About

MEOW is a fork of COW that uses whitelist mode.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages