检查 Clash(mihomo)监听地址是否与系统防火墙一致,核心是先读清配置里「究竟绑在哪些地址、哪些端口角色」,再在操作系统层看这些地址上的入站是否被放行。官方全局配置把代理侧入口写在 allow-lan 与 bind-address,把 API 侧入口写在 external-controller 及相关项。防火墙看不到 YAML 里的意图,只看实际监听的地址和端口。
先分清两类监听:代理端口和外部控制 API
适用条件:你要验证的是「局域网设备或本机以外的客户端连进来是否被系统丢掉」,而不是规则是否命中。
代理端口是否提供给其他设备,由 allow-lan(true/false)决定。文档说明:允许其他设备经过 Clash 的代理端口访问互联网。这些端口实际接受连接的地址,由 bind-address 约束:"*" 绑定所有 IP;也可绑定单个 IPv4 或单个 IPv6。
外部控制是另一套监听。external-controller 为 API 监听地址,文档写明可以把 127.0.0.1 改成 0.0.0.0 来监听所有 IP,示例为 127.0.0.1:9090。此外还有 external-controller-tls、external-controller-unix、external-controller-pipe 等形态。Unix socket 与 Windows named pipe 从本地套接字访问且文档写明不会验证 secret,它们通常不经过 TCP 防火墙规则。
判断依据:
- 只改了
external-controller为0.0.0.0,并不会使allow-lan变为真,防火墙放行 API 端口也不等于放行代理端口。 bind-address为具体 IPv4 时,系统上应看到服务绑在该地址而非「任意地址」;防火墙若只放行了别的网卡地址,对端仍会失败。ipv6为false时,内核不接受 IPv6 流量,此时检查 IPv6 防火墙规则没有对应监听可放行。
失败时下一步:把「代理端口 + bind-address」和「external-controller 及其端口」分成两张清单,分别去做系统侧核对,禁止用一次 API 通断代替代理通断。
用绑定值对照系统防火墙应放行的对象
适用条件:配置已加载,需要判断防火墙规则是该针对「任意地址」还是「单一地址」,以及源 IP 过滤是否还要交给 Clash 自己做。
操作步骤:
- 读取
bind-address。若为"*",代理入站可能出现在主机所有地址上,防火墙若只开放某一局域网网卡、却阻断了其他接口,表现会是「有的地址能连、有的不能」。 - 若为单个 IPv4 或单个 IPv6,防火墙放行对象应覆盖该地址上的代理端口。放行了
0.0.0.0但进程并未绑在任意地址,或以错误地址为目的的数据包,仍到不了进程。 - 读取
lan-allowed-ips与lan-disallowed-ips。前者仅在allow-lan为true时生效,默认0.0.0.0/0和::/0;后者黑名单优先,默认空。这是 Clash 在应用层做的源地址过滤,不能替代系统防火墙,也不会自动在防火墙里生成对应规则。 - 若启用
authentication,防火墙放行只表示 TCP/UDP 能进进程;未提供用户名密码仍会被代理拒绝。skip-auth-prefixes示例为127.0.0.1/8和::1/128,本机回环往往不经过需放行外部网卡的那条防火墙路径。
判断依据:系统防火墙放行、但源 IP 落在 lan-disallowed-ips,故障点在 Clash 黑名单。反之,Clash 允许该源 IP、绑定也正确,而系统拒绝入站,故障点在防火墙或监听未落到该地址。API 若监听 127.0.0.1:9090,对防火墙而言这不是局域网入口;改成 0.0.0.0 后,才需要为该 API 端口准备对应入站规则,并意识到文档提醒 CORS、secret 等安全项需自行保证。
失败时下一步:在操作系统中确认进程实际绑定的地址族和地址(IPv4/IPv6、具体地址或任意地址),再改防火墙对象使之与 bind-address / external-controller 一致。不要只按「局域网网段」写一条宽泛规则却漏掉你真正绑定的那张地址。
核对失败时按「监听未建立」和「监听被挡」分支处理
适用条件:防火墙已放行或已临时关闭测试,连通性仍不符合预期。
操作步骤:
- 确认
allow-lan为true后再查代理端口。为false时,问题不是防火墙配合,而是根本未向其他设备提供代理端口。 - 确认
bind-address仍是当前有效地址。地址变更后,旧防火墙规则可能仍指向过期 IP,表现为「规则还在、服务已不在该地址」。 - 需要 IPv6 时同时核对
ipv6与 IPv6 防火墙链;只检查 IPv4 入站规则不能解释 IPv6 失败。 - 若检查的是 API:
external-controller-unix/external-controller-pipe不走 TCP 防火墙;external-controller-tls还依赖tls证书与私钥配置,且文档要求使用 TLS 时必须同时填写external-controller。证书问题不要当成防火墙拒绝。 - 从 Unix socket 或 named pipe 访问 API 不会验证
secret,这与防火墙无关,不能用来证明 TCP 监听与防火墙已经配合正确。
判断依据:本机回环可连、局域网不可连,优先怀疑绑定为 127.0.0.1 或防火墙未放行网卡地址。局域网部分主机可连、某一 IP 不可连,优先对照 lan-allowed-ips / lan-disallowed-ips,而不是继续加防火墙放行。API 能从其他设备访问、代理不能,说明防火墙可能只放行了 API 端口,或 allow-lan/bind-address 尚未构成代理侧监听。
失败时下一步:先让配置中的绑定地址与当前接口地址一致并重新加载,再让防火墙对象与该绑定一致。两层都对齐后,若仅特定源 IP 失败,回到允许/禁止网段和 authentication,而不是继续扩大防火墙范围。