Clash 文档中心中文使用手册

Clash 怎样检查监听地址和系统防火墙的配合

Clash 怎样检查监听地址和系统防火墙的配合。了解适用条件、操作步骤与常见问题的排查方法。

更新于 2026/10/4

检查 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 自己做。

操作步骤:

  1. 读取 bind-address。若为 "*",代理入站可能出现在主机所有地址上,防火墙若只开放某一局域网网卡、却阻断了其他接口,表现会是「有的地址能连、有的不能」。
  2. 若为单个 IPv4 或单个 IPv6,防火墙放行对象应覆盖该地址上的代理端口。放行了 0.0.0.0 但进程并未绑在任意地址,或以错误地址为目的的数据包,仍到不了进程。
  3. 读取 lan-allowed-ips 与 lan-disallowed-ips。前者仅在 allow-lan 为 true 时生效,默认 0.0.0.0/0 和 ::/0;后者黑名单优先,默认空。这是 Clash 在应用层做的源地址过滤,不能替代系统防火墙,也不会自动在防火墙里生成对应规则。
  4. 若启用 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 一致。不要只按「局域网网段」写一条宽泛规则却漏掉你真正绑定的那张地址。

核对失败时按「监听未建立」和「监听被挡」分支处理

适用条件:防火墙已放行或已临时关闭测试,连通性仍不符合预期。

操作步骤:

  1. 确认 allow-lan 为 true 后再查代理端口。为 false 时,问题不是防火墙配合,而是根本未向其他设备提供代理端口。
  2. 确认 bind-address 仍是当前有效地址。地址变更后,旧防火墙规则可能仍指向过期 IP,表现为「规则还在、服务已不在该地址」。
  3. 需要 IPv6 时同时核对 ipv6 与 IPv6 防火墙链;只检查 IPv4 入站规则不能解释 IPv6 失败。
  4. 若检查的是 API:external-controller-unix / external-controller-pipe 不走 TCP 防火墙;external-controller-tls 还依赖 tls 证书与私钥配置,且文档要求使用 TLS 时必须同时填写 external-controller。证书问题不要当成防火墙拒绝。
  5. 从 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,而不是继续扩大防火墙范围。

https://wiki.metacubex.one/config/general/

返回文章索引使用教程