Mellow 是一个可以基于规则进行全局透明代理的 V2Ray 客户端,支持 Windows、macOS 和 Linux。并且可以配置成路由器透明代理或代理网关。
https://github.com/eycorsican/Mellow/releases
Mellow 可对所有应用、所有请求进行透明代理,不需要为每个应用或程序单独设置代理,它所支持的特性可以概括为:
Mellow | Surge Mac | SSTap | Proxifier | Outline | |
---|---|---|---|---|---|
Windows 支持 | ✅ | ✅ | ✅ | ✅ | |
macOS 支持 | ✅ | ✅ | ✅ | ✅ | |
Linux 支持 | ✅ | ✅ | |||
透明代理 | ✅ | ✅ | ✅ | ✅ | ✅ |
TCP 代理 | ✅ | ✅ | ✅ | ✅ | ✅ |
UDP 代理 | ✅ | ✅ | ✅ | ✅ | |
IP 规则 | ✅ | ✅ | ✅ | ✅ | |
域名规则 | ✅ | ✅ | ✅ | ||
应用进程规则 | ✅ | ✅ | ✅ | ||
端口规则 | ✅ | ✅ | ✅ | ||
MitM | ✅ | ||||
URL Rewrite | ✅ | ||||
多个代理出口 | ✅ | ✅ | ✅ | ||
负载均衡 | ✅ | ✅ | |||
DNS 分流 | ✅ | ✅ | |||
SOCKS | ✅ | ✅ | ✅ | ✅ | |
HTTP | ✅ | ✅ | ✅ | ||
Shadowsocks | ✅ | ✅ | ✅ | ✅ | |
VMess | ✅ | ||||
WebSocket, mKCP, QUIC, HTTP/2 传输 | ✅ |
其它 V2Ray 所支持的功能也都是支持的,上面并没有全部列出。
[Endpoint]
MyProxyServer, ss, ss://aes-128-gcm:[email protected]:8888
[Endpoint]
; tag, parser, parser-specific params...
Direct, builtin, freedom, domainStrategy=UseIP
Reject, builtin, blackhole
Dns-Out, builtin, dns
Http-Out, builtin, http, address=192.168.100.1, port=1087, user=myuser, pass=mypass
Socks-Out, builtin, socks, address=127.0.0.1, port=1080, user=myuser, pass=mypass
Proxy-1, vmess1, vmess1://[email protected]:443/v2?network=ws&tls=true
Proxy-2, vmess1, vmess1://[email protected]:10025?network=tcp
Proxy-3, ss, ss://aes-128-gcm:[email protected]:8888
Proxy-4, vmess1, vmess1://[email protected]:443/h2?network=http&http.host=example.com%2Cexample1.com&tls=true&tls.allowinsecure=true
[EndpointGroup]
; tag, colon-seperated list of selectors or endpoint tags, strategy, strategy-specific params...
MyGroup, Proxy-1:Proxy-2:Proxy-3, latency, interval=300, timeout=6
[Routing]
domainStrategy = IPIfNonMatch
[RoutingRule]
; type, filter, endpoint tag or enpoint group tag
DOMAIN-KEYWORD, geosite:category-ads-all, Reject
IP-CIDR, 223.5.5.5/32, Direct
IP-CIDR, 8.8.8.8/32, MyGroup
IP-CIDR, 8.8.4.4/32, MyGroup
PROCESS-NAME, cloudmusic.exe, Direct
PROCESS-NAME, NeteaseMusic, Direct
GEOIP, cn, Direct
GEOIP, private, Direct
PORT, 123, Direct
DOMAIN-KEYWORD, geosite:cn, Direct
DOMAIN, www.google.com, MyGroup
DOMAIN-FULL, www.google.com, MyGroup
DOMAIN-SUFFIX, google.com, MyGroup
FINAL, MyGroup
[Dns]
; hijack = dns endpoint tag
hijack = Dns-Out
clientIp = 114.114.114.114
[DnsServer]
; address, port, tag
localhost
223.5.5.5
8.8.8.8, 53, Remote
8.8.4.4
[DnsRule]
; type, filter, dns server tag
DOMAIN-KEYWORD, geosite:geolocation-!cn, Remote
DOMAIN-SUFFIX, google.com, Remote
[DnsHost]
; domain = ip
doubleclick.net = 127.0.0.1
[Log]
loglevel = warning
建议在 macOS 或者 Linux 上进行开发或构建,如果想在 Windows 上开发,那可能需要手动下载一下依赖数据(因为是用 curl 来下载)。
# 下载依赖数据
yarn dlgeo
# 开发运行
yarn start
# 构建 macOS 安装文件
yarn && yarn distmac
# 构建 Windows 安装文件
yarn && yarn distwin
# 构建 Linux 安装文件
yarn && yarn distlinux
Mellow 是一个透明代理客户端,如果不理解,那说得实际点,就是不仅可以代理浏览器的请求,还可以代理微信、QQ、Telegram 客户端、Instagram 客户端、网易云音乐、各种命令行工具、Docker 容器、虚拟机、WSL、各种 IDE、各种游戏等等的网络请求,不需要任何额外的代理设置。
所以也很清楚的是,如果仅需要代理浏览器的请求,或者也不嫌麻烦为个别程序单独设置代理的话,是没必要使用 Mellow 的。
支持两种配置文件格式,一个是类 ini 的 conf 格式,另一个是 V2Ray JSON 格式,两种格式的配置可以同时存在。
可以在 Tray 菜单 Config Template 中创建对应的配置模板,创建后就是一个纯文本文件,自行打开目录去编辑完善配置,编辑好后保存,即可启动代理,待图标变色后,就表示代理已经启动。
macOS 客户端在初次和每次升级后启动时,都可能会弹框请求管理权限。
Windows 客户端在每次启动时都会弹框请求管理权限,如果不希望看到弹框,可以改变 UAC(用户帐户控制设置) 的通知等级。
如果启动代理后有任何问题,比如弹出错误,比如无法连接,要反馈的话,请附上必要的截图(错误弹框等)、配置和日志。
任何配置改动都需要重连生效。
因为系统 DNS 很不好控制,推荐 Freedom Outbound 使用 UseIP 策略,再配置好内建 DNS 服务器,这样可以避免一些奇怪问题,也增加 DNS 缓存的利用效率。
macOS 和 Linux 用户可能需要检查下系统 DNS 配置,勿用路由器网关地址或私有地址作 DNS,因为那样流量就不会被路由到 TUN 接口,从而完全摆脱了 Mellow 控制,然后会导致一些 DNS 解析异常以及导致 DNS 分流完全失效。
DNS 的处理方面基本上和 这篇文章 中介绍的没什么出入,默认使用 Sniffing 来处理 DNS 染污,建议再配置一下 DNS 分流,就是 conf 配置中的 DNS Hijack + DNS Outbound(Endpoint) + DNS Server + DNS Rule。
如果启用 DNS 分流(DNS Hijack),Sessions 中的 DNS 请求并不是实际发出的 DNS 请求,这是被 Hijack 前记录下的,Hijack 后实际所发的 DNS 请求暂时没有记录。
使用 SOCKS 或 Shadowsocks 协议的话支持 Full Cone NAT,注意服务器也要是支持 Full Cone NAT 的,如果要代理游戏,服务端可以考虑用 shadowsocks-libev、go-shadowsocks2 等。
JSON 配置文件中不需要有 Inbound,但也可以自行配置 Inbound 作其它用途,例如可以像其它非透明代理客户端一样,配置文件中写上 SOCKS/HTTP Inbound,再手动配置到系统或浏览器的代理设置中,那样浏览器的请求就会从 SOCKS/HTTP Inbound 过来,而不经过 TUN 接口。注意目前所有类型 Inbound 的 UDP 都不能用,因为我没见过哪个操作系统或浏览器真正地使用 SOCKS 的 UDP,所以也不会去修复它。
日志有两份,一份是 Mellow 的日志,一份是 V2Ray 的日志,V2Ray 日志如果输出到 stdout/stderr,那 V2Ray 的日志会被打印到 Mellow 的日志里。
另打开 Sessions 页面可看到所有请求的详细信息,注意这个页面不会自动刷新。
目前没有任何计划做成 UI 配置的方式。
- 某些 UDP 会话如果持续时间过短,则会无法获取其发送进程。
- 在 Windows 上,会看到较多的
unknown process
,这是因为 Mellow 没有权限访问系统进程的信息,特别是 DNS 请求,因为发送 DNS 请求的通常是一个名为 svchost.exe 的系统进程。
可以的,只需要把 这 四 个 文件 下载到同一个目录,把 dlc.dat
改名为 geosite.dat
,把 GeoLite2-Country.tar.gz
解压后改名为 geo.mmdb
,再自行创建一个叫 cfg.json
的 V2Ray 配置文件,然后运行 run_linux.sh
脚本(需要 root 权限)。
在 macOS 上,开启 Mellow 后,再开启 IP Forwarding 就行:
sudo sysctl -w net.inet.ip.forwarding=1
同样在 Linux 上,开启 IP Forwarding:
sudo sysctl -w net.ipv4.ip_forward=1
注意这种网关形式上有别于一般的路由器透明代理设置,这里的 “网关” 是局域网里另一台普通的局域网设备,它本身需要路由器作网关。
把 conf 配置运行起来,然后打开 Running Config 就是了,其实配置最终都是转成 JSON 再运行的。
不依赖 UI 的话可以用这条命令来转换:
cat config.conf | node src/config/convert.js > config.json
可以的:
- 首先保证路由器处于一个正常状态,它本身也可以正常访问网络。(在路由器的 ssh shell 里可以 ping 通外网)
- 把所需文件下载下来放到路由器上某一个目录里面,有些文件需要改下名字,具体参考上面的 “在 Linux 上运行”。(你需要到 Releases 页面找对应系统架构的 core)
- 同一目录里,创建一个叫
cfg.json
的 V2Ray 配置文件,不需要有 Inbound,其它配置按正常来,但建议参考 Mellow 所推荐的配置方式。 - 检查路由器的系统 DNS,保证不是 127.0.0.1 或任何私有地址,如果有必要,自己填两个上去。(/etc/resolv.conf)
- 然后运行
run_linux.sh
(不是后台运行,你需要保留这个窗口)。 - 然后用
ip addr show
查看 TUN 接口的名字,比如是tun1
,那么运行下面这条 iptables 命令就 OK 啦:
iptables -I FORWARD -o tun1 -j ACCEPT
因为 Sessions
的地址是 127.0.0.1,所以如果想查看请求记录,可以做下 SSH Port Forwarding:
# 在本地机器上运行,192.168.1.1 是路由器地址,
# 然后访问:http://localhost:6002/stats/session/plain
ssh -NL 6002:localhost:6001 [email protected]
就是 conf 配置中的 Endpoint Group 使用 latency 作策略,可根据代理请求的 RTT,自动选择负载均衡组中最优线路来转发请求。
"routing": {
"balancers": [
{
"tag": "server_lb",
"selector": [
"server_1",
"server_2"
],
"strategy": "latency",
"totalMeasures": 2,
"interval": 300,
"delay": 1,
"timeout": 6,
"tolerance": 300,
"probeTarget": "tls:www.google.com:443",
"probeContent": "HEAD / HTTP/1.1\r\n\r\n"
}
]
}
就是 conf 配置中的 PROCESS-NAME 规则,支持 *
和 ?
通配符匹配,匹配内容为进程名称,包括所有直接或非直接的父进程。
在 Windows 上,进程名称通常为 xxx.exe
,例如 chrome.exe
,在 Mellow 的 Sessions
中可方便查看。
在 macOS 上也可以通过 Mellow 的 Sessions
查看,也可以通过 ps
命令查看进程。
"routing": {
"rules": [
{
"app": [
"git*",
"chrome.exe"
],
"type": "field",
"outboundTag": "proxy"
}
]
}