{"id":13415894,"url":"https://github.com/mellow-io/mellow","last_synced_at":"2025-05-15T00:07:58.280Z","repository":{"id":37706457,"uuid":"199595397","full_name":"mellow-io/mellow","owner":"mellow-io","description":"Mellow is a rule-based global transparent proxy client for Windows, macOS and Linux. Also a Proxifier alternative.","archived":false,"fork":false,"pushed_at":"2022-12-10T21:55:04.000Z","size":3457,"stargazers_count":3575,"open_issues_count":18,"forks_count":464,"subscribers_count":74,"default_branch":"master","last_synced_at":"2025-04-13T21:33:57.830Z","etag":null,"topics":["proxifier-alternative","proxy","vpn"],"latest_commit_sha":null,"homepage":"","language":"JavaScript","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/mellow-io.png","metadata":{"files":{"readme":"README.1.md","changelog":null,"contributing":null,"funding":null,"license":null,"code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null}},"created_at":"2019-07-30T07:07:42.000Z","updated_at":"2025-04-13T01:54:50.000Z","dependencies_parsed_at":"2023-01-26T11:45:56.202Z","dependency_job_id":null,"html_url":"https://github.com/mellow-io/mellow","commit_stats":null,"previous_names":[],"tags_count":10,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellow-io%2Fmellow","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellow-io%2Fmellow/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellow-io%2Fmellow/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/mellow-io%2Fmellow/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/mellow-io","download_url":"https://codeload.github.com/mellow-io/mellow/tar.gz/refs/heads/master","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254249198,"owners_count":22039029,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["proxifier-alternative","proxy","vpn"],"created_at":"2024-07-30T21:00:52.832Z","updated_at":"2025-05-15T00:07:53.271Z","avatar_url":"https://github.com/mellow-io.png","language":"JavaScript","readme":"# Mellow\n\n[![Build Status](https://travis-ci.com/mellow-io/mellow.svg?branch=master)](https://travis-ci.com/mellow-io/mellow)\n\nMellow 是一个基于规则的全局透明代理工具，可以运行在 Windows、macOS 和 Linux 上，也可以配置成路由器透明代理或代理网关，支持 SOCKS、HTTP、Shadowsocks、VMess 等多种代理协议。\n\n## 下载安装\n\n### Windows、macOS 和 Linux 安装文件下载\n\nhttps://github.com/mellow-io/mellow/releases\n\n### Homebrew 安装 (适用于 macOS)\n\n```\nbrew cask install mellow\n```\n\n## 配置\n\n### 全局代理配置\n\n```ini\n[Endpoint]\nMyProxyServer, ss, ss://aes-128-gcm:pass@192.168.100.1:8888\nDns-Out, builtin, dns\n\n[RoutingRule]\nFINAL, MyProxyServer\n\n[Dns]\nhijack = Dns-Out\n\n[DnsServer]\n8.8.8.8\n8.8.4.4\n```\n\n### 简单配置\n\n绕过 cn 和 private。\n\n```ini\n[Endpoint]\nMyProxyServer, ss, ss://aes-128-gcm:pass@192.168.100.1:8888\nDirect, builtin, freedom, domainStrategy=UseIP\nDns-Out, builtin, dns\n\n[RoutingRule]\nDOMAIN-KEYWORD, geosite:cn, Direct\nGEOIP, cn, Direct\nGEOIP, private, Direct\nFINAL, MyProxyServer\n\n[Dns]\nhijack = Dns-Out\n\n[DnsServer]\nlocalhost\n8.8.8.8\n```\n\n### 更多配置\n\n```ini\n[Endpoint]\n; tag, parser, parser-specific params...\nDirect, builtin, freedom, domainStrategy=UseIP\nReject, builtin, blackhole\nDns-Out, builtin, dns\nHttp-Out, builtin, http, address=192.168.100.1, port=1087, user=myuser, pass=mypass\nSocks-Out, builtin, socks, address=192.168.100.1, port=1080, user=myuser, pass=mypass\nProxy-1, vmess1, vmess1://75da2e14-4d08-480b-b3cb-0079a0c51275@example.com:443/path?network=ws\u0026tls=true\u0026ws.host=example.com\nProxy-2, vmess1, vmess1://75da2e14-4d08-480b-b3cb-0079a0c51275@example.com:10025?network=tcp\nProxy-3, ss, ss://aes-128-gcm:pass@192.168.100.1:8888\nProxy-4, vmess1, vmess1://75da2e14-4d08-480b-b3cb-0079a0c51275@example.com:443/path?network=http\u0026http.host=example.com%2Cexample1.com\u0026tls=true\u0026tls.allowinsecure=true\nProxy-7, vmess1, vmess1://75da2e14-4d08-480b-b3cb-0079a0c51275@example.com:10025?network=kcp\u0026kcp.mtu=1350\u0026kcp.tti=20\u0026kcp.uplinkcapacity=1\u0026kcp.downlinkcapacity=2\u0026kcp.congestion=false\u0026header=none\u0026sockopt.tos=184\nProxy-8, vmess1, vmess1://75da2e14-4d08-480b-b3cb-0079a0c51275@example.com:10025?network=quic\u0026quic.security=none\u0026quic.key=\u0026header=none\u0026tls=false\u0026sockopt.tos=184\n\n[EndpointGroup]\n; tag, colon-seperated list of selectors or endpoint tags, strategy, strategy-specific params...\nGroup-1, Proxy-1:Proxy-2:Proxy-3, latency, interval=300, timeout=6\n\n[Routing]\ndomainStrategy = IPIfNonMatch\n\n[RoutingRule]\n; type, filter, endpoint tag or enpoint group tag\nDOMAIN-KEYWORD, geosite:category-ads-all, Reject\nIP-CIDR, 223.5.5.5/32, Direct\nIP-CIDR, 8.8.8.8/32, Group-1\nIP-CIDR, 8.8.4.4/32, Group-1\nPROCESS-NAME, cloudmusic.exe, Direct\nPROCESS-NAME, NeteaseMusic, Direct\nGEOIP, cn, Direct\nGEOIP, private, Direct\nPORT, 123, Direct\nDOMAIN-KEYWORD, geosite:cn, Direct\nDOMAIN, www.google.com, Group-1\nDOMAIN-FULL, www.google.com, Group-1\nDOMAIN-SUFFIX, google.com, Group-1\nFINAL, Group-1\n\n[Dns]\n; hijack = dns endpoint tag\nhijack = Dns-Out\n; cliengIp = ip\nclientIp = 114.114.114.114\n\n[DnsServer]\n; address, port, tag\nlocalhost\n223.5.5.5\n8.8.8.8, 53, Remote\n8.8.4.4\n\n[DnsRule]\n; type, filter, dns server tag\nDOMAIN-KEYWORD, geosite:geolocation-!cn, Remote\nDOMAIN-SUFFIX, google.com, Remote\n\n[DnsHost]\n; domain = ip\ndoubleclick.net = 127.0.0.1\n\n[Log]\nloglevel = warning\n```\n\n更详细的 conf 配置，以及所对应的 JSON 配置可以[查看这里](https://github.com/mellow-io/mellow/blob/master/src/spec/conf_to_json.spec.js)。\n\n## 开发运行和构建\n\n```sh\ngit clone https://github.com/mellow-io/mellow.git\ncd mellow\n\n# 安装依赖\nnpm i\n\n# 下载数据文件\nnpm run dlgeo\n\n# 下载核心\n# 默认只下载本系统对应的核心文件，如果要为其它系统构建，加 `-- --all` 下载其它系统对应的文件\nnpm run dlcore [-- --all]\n\n# 运行\nnpm start\n\n# 构建 macOS 安装文件\nnpm run distmac\n\n# 构建 Windows 安装文件\nnpm run distwin\n\n# 构建 Linux 安装文件\nnpm run distlinux\n```\n\n## 一些说明\n\n### 要不要使用 Mellow？\nMellow 是一个透明代理客户端，如果不理解，那说得实际点，就是不仅可以代理浏览器的请求，还可以代理微信、QQ、Telegram 客户端、Instagram 客户端、网易云音乐、各种命令行工具、Docker 容器、虚拟机、WSL、各种 IDE、各种游戏等等的网络请求，不需要任何额外的代理设置。\n\n所以也很清楚的是，如果仅需要代理浏览器的请求，或者也不嫌麻烦为个别程序单独设置代理的话，是没必要使用 Mellow 的。\n\n### 关于配置和启动\n支持两种配置文件格式，一个是类 ini 的 conf 格式，另一个是 V2Ray JSON 格式，两种格式的配置可以同时存在。\n\n可以在 Tray 菜单 Config Template 中创建对应的配置模板，创建后就是一个纯文本文件，自行打开目录去编辑完善配置，编辑好后保存，即可启动代理，待图标变色后，就表示代理已经启动。\n\nmacOS 客户端在初次和每次升级后启动时，都可能会弹框请求管理权限。\n\nWindows 客户端在每次启动时都会弹框请求管理权限，如果不希望看到弹框，可以改变 UAC（用户帐户控制设置） 的通知等级。\n\n如果启动代理后有任何问题，比如弹出错误，比如无法连接，要反馈的话，请附上必要的截图（错误弹框等）、配置和日志。\n\n任何配置改动都需要重连生效。\n\n### 关于 DNS\n因为系统 DNS 很不好控制，推荐 Freedom Outbound 使用 UseIP 策略，再配置好内建 DNS 服务器，这样可以避免一些奇怪问题，也增加 DNS 缓存的利用效率。\n\n**macOS 和 Linux 用户可能需要检查下系统 DNS 配置，勿用路由器网关地址或私有地址作 DNS**，因为那样流量就不会被路由到 TUN 接口，从而完全摆脱了 Mellow 控制，然后会导致一些 DNS 解析异常以及导致 DNS 分流完全失效。\n\nDNS 的处理方面基本上和 [这篇文章](https://medium.com/@TachyonDevel/%E6%BC%AB%E8%B0%88%E5%90%84%E7%A7%8D%E9%BB%91%E7%A7%91%E6%8A%80%E5%BC%8F-dns-%E6%8A%80%E6%9C%AF%E5%9C%A8%E4%BB%A3%E7%90%86%E7%8E%AF%E5%A2%83%E4%B8%AD%E7%9A%84%E5%BA%94%E7%94%A8-62c50e58cbd0) 中介绍的没什么出入，默认使用 Sniffing 来处理 DNS 染污，建议再配置一下 DNS 分流，就是 conf 配置中的 DNS Hijack + DNS Outbound（Endpoint） + DNS Server + DNS Rule。\n\n### 关于 NAT 类型\n使用 SOCKS 或 Shadowsocks 协议的话支持 Full Cone NAT，注意服务器也要是支持 Full Cone NAT 的，如果要代理游戏，服务端可以考虑用 shadowsocks-libev、go-shadowsocks2 等。\n\n### 关于 JSON 配置的 Inbound\nJSON 配置文件中不需要有 Inbound，但也可以自行配置 Inbound 作其它用途，例如可以像其它非透明代理客户端一样，配置文件中写上 SOCKS/HTTP Inbound，再手动配置到系统或浏览器的代理设置中，那样浏览器的请求就会从 SOCKS/HTTP Inbound 过来，而不经过 TUN 接口，相当于 “系统代理” 模式（现在默认开启）。注意目前所有类型 Inbound 的 UDP 都不能用，因为我没见过哪个操作系统或浏览器真正地使用 SOCKS 的 UDP，所以也不会去修复它。\n\n### 关于日志\n日志有两份，一份是 Mellow 的日志，一份是 V2Ray 的日志，V2Ray 日志如果输出到 stdout/stderr，那 V2Ray 的日志会被打印到 Mellow 的日志里。\n\n### 关于 GUI\n目前没有任何计划做成 UI 配置的方式。\n\n## FAQ\n\n### 为什么在 Sessions 中有些请求显示进程名称为 `unknown process`？\n\n1. 某些 UDP 会话如果持续时间过短，则会无法获取其发送进程。\n2. 在 Windows 上，会看到较多的 `unknown process`，这是因为 Mellow 没有权限访问系统进程的信息，特别是 DNS 请求，因为发送 DNS 请求的通常是一个名为 svchost.exe 的系统进程。\n\n### “系统代理” 选项的作用是什么？\n\nMellow 目前提供两种流量接管方式，一是 TUN 模式（某些软件中所指的 Enhanced Mode 就是这个），二是系统代理（常见的代理软件都用这个，不严谨地说就是只代理浏览器请求那类），与其它软件不同，Mellow 默认强制开启 TUN 模式，可选开启 “系统代理” 模式。\n\nTUN 模式已经可以接管全部流量了，为什么还需要 “系统代理” 模式？\n\n1. TUN 模式有性能瓶颈。\n2. “系统代理” 模式不会有太多 DNS 相关的问题，代理浏览器请求也快。\n\n开启 “系统代理” 模式后，两种模式是并存的，可以走系统代理的请求优先走系统代理，剩下的走 TUN。\n\n### 可以在 Linux 上以命令行方式运行吗？\n\n可以的，只需要把 [这](https://github.com/mellow-io/mellow-core/releases/latest/download/core-linux-amd64) [四](https://github.com/v2ray/domain-list-community/releases/latest/download/dlc.dat) [个](https://web.archive.org/web/20191227182412/https://geolite.maxmind.com/download/geoip/database/GeoLite2-Country.tar.gz) [文件](https://github.com/mellow-io/mellow/blob/master/scripts/run_linux.sh) 下载到同一个目录，把 `dlc.dat` 改名为 `geosite.dat`，把 `GeoLite2-Country.tar.gz` 解压后改名为 `geo.mmdb`，再自行创建一个叫 `cfg.json` 的 V2Ray 配置文件，然后运行 `run_linux.sh` 脚本（需要 root 权限）。注意，如果用 ssh 连的 Linux，你可能需要打开一个持续 `ping` 目标 Linux 的窗口，不然在运行后 ssh 有可能失去连接或连接不上。\n\n### 可以用作网关吗？\n\n在 macOS 上，开启 Mellow 后，再开启 IP Forwarding 就行：\n\n```sh\nsudo sysctl -w net.inet.ip.forwarding=1\n```\n\n同样在 Linux 上，开启 IP Forwarding：\n\n```sh\nsudo sysctl -w net.ipv4.ip_forward=1\n```\n\n注意这种网关形式上有别于一般的路由器透明代理设置，这里的 “网关” 是局域网里另一台普通的局域网设备，它本身需要路由器作网关。\n\n### 怎么把 conf 配置转换成 JSON 配置？\n\n把 conf 配置运行起来，然后打开 Running Config 就是了，其实配置最终都是转成 JSON 再运行的。\n\n不依赖 UI 的话可以用这条命令来转换：\n\n```sh\ncat config.conf | node src/config/convert.js \u003e config.json\n```\n\n### 可以运行在路由器上做透明代理吗？\n可以的：\n\n1. 首先保证路由器处于一个正常状态，它本身也可以正常访问网络。（在路由器的 ssh shell 里可以 ping 通外网）\n2. 把所需文件下载下来放到路由器上某一个目录里面，有些文件需要改下名字，具体参考上面的 “在 Linux 上运行”。（你需要到 [Releases](https://github.com/mellow-io/mellow-core/releases) 页面找对应系统架构的 core）\n3. 同一目录里，创建一个叫 `cfg.json` 的 V2Ray 配置文件，不需要有 Inbound，其它配置按正常来，但建议参考 Mellow 所推荐的配置方式。\n4. 检查路由器的系统 DNS，保证不是 127.0.0.1 或任何私有地址，如果有必要，自己填两个上去。（/etc/resolv.conf）\n5. 然后运行 `run_linux.sh`（不是后台运行，你需要保留这个窗口）。\n6. 然后用 `ip addr show` 查看 TUN 接口的名字，比如是 `tun1`，那么运行下面这条 iptables 命令就 OK 啦：\n\n```sh\niptables -I FORWARD -o tun1 -j ACCEPT\n```\n\n在典型 OpenWrt 系统上流量**大概可能**是这么走的：\n```\n// 局域网其它设备的流量\nwlan0/eth0 -\u003e br-lan -\u003e FORWARD (iptables) -\u003e tun1 -\u003e tun2socks (Mellow) -\u003e ROUTING -\u003e pppoe-wan\n```\n\n```\n// 运行在路由器上的进程的流量（比如 dnsmasq）\nlocal process -\u003e ROUTING -\u003e tun1 -\u003e tun2socks (Mellow) -\u003e ROUTING -\u003e pppoe-wan\n```\n\n上面提到系统 DNS (/etc/resolv.conf) 中不能是 127.0.0.1、search lan、localhost 之类的原因是，假如路由器本地跑的是 dnsmasq 作 DNS 服务器，那么如果系统 DNS 是 127.0.0.1，Mellow 发的某些 DNS 请求就会给到 dnsmasq，而从上面第二个过程来看，dnsmasq (local process) 发出去的流量又会再次给到 Mellow，这其中如果处理不好就可能会出现死循环，这种情况一般都比较难处理，所以最直接的方法就是不让 DNS 流量经过本地的 dnsmasq。\n\n因为 `Sessions` 的地址是 127.0.0.1，所以如果想查看请求记录，可以做下 SSH Port Forwarding：\n\n```sh\n# 在本地机器上运行，192.168.1.1 是路由器地址，\n# 然后访问：http://localhost:6002/stats/session/plain\nssh -NL 6002:localhost:6001 root@192.168.1.1\n```\n\n### 如何配合其它代理软件使用？\n\n参考 https://github.com/mellow-io/mellow/issues/3 和 https://github.com/mellow-io/mellow/issues/52\n\n总的来说，需要处理好两点，一是把相应的代理软件流量用 PROCESS-NAME 规则排除掉，二是（有必要的话）对用到伪装域名的代理协议做额外处理。\n\n## Mellow 工作流程图\n\n![Mellow](https://raw.githubusercontent.com/mellow-io/mellow/master/.github/flow_zh.png)\n\n## JSON 配置的扩展功能说明\n\n### 自动选择最优线路\n就是 conf 配置中的 Endpoint Group 使用 latency 作策略，可根据代理请求的 RTT（即实际向 outbound 发送一个代理请求，记录返回非空数据所使用的时间），自动选择负载均衡组中最优线路来转发请求。\n\n```json\n\"routing\": {\n    \"balancers\": [\n        {\n            \"tag\": \"server_lb\",\n            \"selector\": [\n                \"server_1\",\n                \"server_2\"\n            ],\n            \"strategy\": \"latency\",\n            \"interval\": 60, // 秒，每次测速之间的最少时间间隔\n            \"totalMeasures\": 2, // 每次测速中对每个 outbound 所做的请求次数\n            \"delay\": 1, // 秒，每个测速请求之间的时间间隔\n            \"timeout\": 6, // 秒，测速请求的超时时间\n            \"tolerance\": 300, // 毫秒，可接受的延迟波动范围，切换最佳节点会将此波动范围考虑进去\n            \"probeTarget\": \"tls:www.google.com:443\", // 测速请求发送的目的地\n            \"probeContent\": \"HEAD / HTTP/1.1\\r\\n\\r\\n\" // 测速请求内容\n        }\n    ]\n}\n```\n\n### 应用进程规则\n就是 conf 配置中的 PROCESS-NAME 规则，支持 `*` 和 `?` 通配符匹配，匹配内容为进程名称，包括所有直接或非直接的父进程。\n\n在 Windows 上，进程名称通常为 `xxx.exe`，例如 `chrome.exe`，在 Mellow 的 `Sessions` 中可方便查看。\n\n在 macOS 上也可以通过 Mellow 的 `Sessions` 查看，也可以通过 `ps` 命令查看进程。\n\n```json\n\"routing\": {\n    \"rules\": [\n        {\n            \"app\": [\n                \"git*\",\n                \"chrome.exe\"\n            ],\n            \"type\": \"field\",\n            \"outboundTag\": \"proxy\"\n        }\n    ]\n}\n```\n\n### QoS 设置\n\n在 Outbound 的 streamSettings 中设置，仅支持 macOS 和 Linux。\n\n```json\n\"streamSettings\": {\n  \"sockopt\": {\n    \"tos\": 184\n  }\n}\n```\n","funding_links":[],"categories":["HarmonyOS","\u003ca id=\"1a9934198e37d6d06b881705b863afc8\"\u003e\u003c/a\u003e通信\u0026\u0026代理\u0026\u0026反向代理\u0026\u0026隧道","JavaScript","\u003ca id=\"d03d494700077f6a65092985c06bf8e8\"\u003e\u003c/a\u003e工具","Uncategorized"],"sub_categories":["Windows Manager","\u003ca id=\"56acb7c49c828d4715dce57410d490d1\"\u003e\u003c/a\u003e未分类-Proxy","\u003ca id=\"0ff94312f3ab4898f5996725133ea9d1\"\u003e\u003c/a\u003e未分类","Uncategorized"],"project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmellow-io%2Fmellow","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fmellow-io%2Fmellow","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fmellow-io%2Fmellow/lists"}