mudfish-exclude 用户指南
该程序仅适用于 Mudfish Cloud VPN 6.5.4 或更高版本。
mudfish-exclude 是 Linux 版 Mudfish 的命令行工具,用于启动特定程序并让它绕过 Mudfish 路径。尤其适合在使用 Full VPN 模式时,让浏览器、聊天工具、视频播放器或下载工具通过原有网络直接连接。
普通程序 -> Mudfish 路径 -> 中继服务器
mudfish-exclude 应用 -> 原有默认路由 -> 互联网
此工具不会向 Mudfish 仪表板添加任何设置。只需使用 mudfish-exclude 启动要排除的程序即可,而不是使用通常的运行命令。
支持范围: 目前仅支持 Linux 和 IPv4。它不能在 Windows、macOS 和 Android 中使用,并且没有单独的旁路策略应用于 IPv6 流量。
所需环境
需要满足以下所有条件:
- 必须安装 Linux 的 Mudfish。
- cgroup v2 必须挂载在
/sys/fs/cgroup上。 ip和iptables指令以及 iptables 的 cgroup match 功能必须可用。- 您必须具有
sudo权限才能设置策略路由和防火墙规则。 - Linux 的 main 路由表必须有健康的默认路由 IPv4。
安装的可执行文件通常位于:
/opt/mudfish/<Mudfish 版本>/bin/mudfish-exclude
可以通过以下命令找到当前的安装路径:
ls /opt/mudfish/*/bin/mudfish-exclude
如果可执行文件未在 PATH 下注册,请将下面示例中的 mudfish-exclude 替换为您在上面看到的完整路径。例如,版本6.5.4的默认安装路径是/opt/mudfish/6.5.4/bin/mudfish-exclude。
基本用法
- 运行Mudfish并正常连接所需的项目或Full VPN 模式。
- 如果要排除的程序已经在运行,请完全终止托盘或后台进程。
- 使用以下格式在终端中重新运行程序:
sudo mudfish-exclude <程序> [程序选项...]
例如,要从 Mudfish 中排除 Discord,请运行:
sudo mudfish-exclude discord
要在排除 Firefox 的情况下打开私人窗口,请运行以下命令:
sudo mudfish-exclude firefox --private-window
如果可执行路径包含空格,请将其用引号引起来。
sudo mudfish-exclude "/path/to/My Program" --option
sudo 用于设置网络策略。如果可能的话,作为 sudo mudfish-exclude ... 执行的程序本身将作为调用 sudo 的原始用户的 UID、GID、主目录和桌面会话环境运行。
要知道的事情
- 排除策略适用于通过
mudfish-exclude新启动的进程及其子进程。 - 您以后无法将策略附加到已经运行的程序。单实例程序必须首先干净地终止,以避免重用现有进程。
- 在典型的一次运行方法中,当程序及其子进程终止时,策略会自动清除。
- 可以同时执行多个
mudfish-exclude命令。最后一个被排除的程序退出后,通用策略将被清除。 - 来自排除程序的 IPv4 流量不使用该路由上的 Mudfish 中继服务器、加速功能和公共 IP。
检查运行是否正常
当连接 Full VPN 之前的公共 IPv4 地址与 Full VPN 中继服务器的公共 IPv4 地址不同时,最容易确认这一点。
首先,检查Full VPN 连接的通用终端上的地址。
curl -4 https://myip.mudfish.net
通过 mudfish-exclude 运行同一命令。
sudo mudfish-exclude curl -4 https://myip.mudfish.net
第一个结果应该是中继服务器端Mudfish的地址,第二个结果应该是您现有的Internet线路的地址。 -4 是仅使用 IPv4 进行扫描的选项,以匹配此工具的支持范围。
使用浏览器检查时,请完全关闭浏览器,然后运行以下命令连接到 https://myip.mudfish.net。
sudo mudfish-exclude firefox
退出和策略清理
正常关闭期间不需要单独的清理命令。但是,如果mudfish-exclude进程被强制终止、终端异常关闭或系统中断,则策略可能会保留。
首先,关闭使用此工具启动的所有程序,然后运行以下命令。
sudo mudfish-exclude --cleanup
当正在运行排除的程序时使用
--cleanup可能立即停止该程序的绕过策略。
命令选项
用法:mudfish-exclude [选项] 程序 [程序选项...]
| 选项 | 描述 |
|---|---|
-h, --help | 打印帮助。 |
--setup | 仅设置排除用网络策略后退出,不能同时指定程序。 |
--cleanup | 删除排除用网络策略后退出,不能同时指定程序。 |
--no-setup | 进入指定的 cgroup 并执行程序,而不重置现有策略。 |
--cgroup NAME | 指定要使用的名称 cgroup v2。默认为 mudfish-exclude。 |
--mark VALUE | 指定用于 数据包的防火墙 mark。默认为 0x6d660001。 |
--priority VALUE | IPv4 policy rule 指定优先级。默认为 8252。 |
--table VALUE | 指定将包含现有默认路由的路由表编号。默认为 8252。 |
要明确结束选项解析,可以在--之后编写程序。
sudo mudfish-exclude -- firefox --private-window
跨多个程序重用策略
对于一般用户,建议使用运行一次程序方法。如果您需要手动设置一次策略,然后在多个命令中重复使用它,您可以按以下顺序运行它:
sudo mudfish-exclude --setup
sudo mudfish-exclude --no-setup discord
sudo mudfish-exclude --no-setup firefox
关闭所有程序后,请务必清除该策略。
sudo mudfish-exclude --cleanup
手动方法不会执行自动清理。此外,某些桌面程序在运行时可能会从 systemd 移动到其他 cgroup,因此默认的运行一次方法(跟踪 cgroup 移动并自动清理)更适合这些程序。
如果更改了 --cgroup、--mark、--priority 和 --table 的值,则必须在 --setup、--no-setup 和 --cleanup 中使用相同的值。自定义值不得与系统上任何现有的防火墙 mark 或 policy routing 规则冲突。
故障排查
mudfish-exclude: command not found
PATH 中不包含可执行文件。使用以下命令找到安装位置并使用完整路径运行它。
ls /opt/mudfish/*/bin/mudfish-exclude
sudo /opt/mudfish/6.5.4/bin/mudfish-exclude discord
必须替换第二个命令中的版本号以匹配您安装的版本。
network policy setup requires root
您无权设置网络策略。再次运行该命令,并在命令前面添加 sudo。
sudo mudfish-exclude discord
cgroup v2 is required at /sys/fs/cgroup
cgroup v2 当前未被系统使用或未挂载在该位置。您可以使用以下命令检查它:
test -f /sys/fs/cgroup/cgroup.controllers && echo "cgroup v2 可用"
如果没有任何结果,您需要检查如何为您的发行版启用 cgroup v2。
iptables rule add failed 或 cgroup match 错误
确保已安装 iptables 并且内核和 iptables 支持 cgroup match。即使在基于 nftables 的发行版上,该工具也直接使用 iptables 兼容指令,因此需要正常的 iptables 兼容层。
failed to find the IPv4 default route
在 main 路由表中找不到现有 Internet 线路的 IPv4 的默认路由。验证以下命令结果中是否存在路径 default:
ip -4 route show default table main
如果没有默认路由或者已经指向另一个 VPN 接口,则 mudfish-exclude 无法配置原始 Internet 路由。
公网 IP即使排除后也不会改变
请按顺序检查以下各项:
- 验证 Full VPN 模式是否实际连接,并且中继服务器 IP 在正常执行期间可见。
- 终止目标程序的所有现有进程和后台进程并重新运行。
- 为避免与 IPv6 结果混淆,请使用
curl -4或 IPv4 验证方法。 - 检查目标程序是否将命令传递给单独的服务或已运行的启动器。排除策略仅适用于
mudfish-exclude新创建的进程沿袭。 - 验证
ip -4 route show default table main的默认路径是否指向真实的 Internet 接口。
程序关闭时终端命令未完成
子进程或后台进程可能仍在排除的 cgroup 上运行。关闭所有关联的托盘图标、启动器,甚至更新进程。默认的执行方法是等待所有子进程都完成,然后清理策略。
非正常关机后网络异常
关闭使用此工具运行的所有程序并清理所有剩余的策略。
sudo mudfish-exclude --cleanup
如果此后问题仍然存在,请关闭 Mudfish,检查系统默认路径和 iptables 规则,然后重新连接。
它是如何运作的
mudfish-exclude 将要执行的程序放置在单独的 cgroup v2 中,并将 iptables mark 设置为从该 cgroup 生成的 IPv4 数据包。具有相应 mark 的数据包通过单独的 policy routing 表转发到 Linux main 路由表中找到的默认路由,并应用所需的 NAT MASQUERADE。
此过程不会修改 mudrun、mudflow、mudfish 或 mudwfp_proxy 的设置或共享内存状态。排除策略仅适用于操作系统的 cgroup、iptables 和 IPv4 policy routing 层。