Podman 部署 Clash 与 Yacd 局域网代理配置笔记

一、环境概述

  • 宿主机:Linux(ARM架构)
  • 容器运行时:Podman
  • 代理核心:Clash(dreamacro/clash:dev)
  • 管理面板:Yacd(Yet Another Clash Dashboard)
  • 客户端:Windows 11 火狐浏览器

二、目录结构

/data/clash/
├── podman-compose.yml
└── config/
    └── config.yaml

三、Podman Compose 配置文件

文件路径:/data/clash/podman-compose.yml

services:
  clash:
    image: docker.io/dreamacro/clash:dev
    container_name: clash
    network_mode: bridge
    logging:
      driver: none
    ports:
      - "7895:7890"
      - "7896:7891"
      - "7897:9090"
    volumes:
      - ./config/config.yaml:/root/.config/clash/config.yaml:ro
    environment:
      - TZ=Asia/Shanghai
    restart: unless-stopped

  yacd:
    image: docker.io/haishanh/yacd:master
    container_name: yacd
    network_mode: bridge
    ports:
      - "1234:80"
    restart: unless-stopped

端口说明

宿主机端口容器端口用途
78957890HTTP/SOCKS5 代理端口
78967891混合代理端口
78979090外部控制 API 端口(Yacd 连接用)

建议:为了便于记忆,可将 "7897:9090" 改为 "9090:9090"


四、Clash 配置文件关键字段

文件路径:/data/clash/config/config.yaml

allow-lan: true
external-controller: 0.0.0.0:9090
secret: ""

字段说明

字段正确值错误值说明
allow-lantruefalse允许局域网设备连接代理
external-controller0.0.0.0:9090127.0.0.1:9090API 监听地址,0.0.0.0 表示接受所有来源连接
secret"" 或 "密码"-API 访问密码,空字符串表示无需认证

关键点external-controller 必须设置为 0.0.0.0:9090,否则外部无法访问 API。


五、Yacd 面板配置

访问地址

http://宿主机IP:1234

三个字段的填写

Yacd 字段填写内容说明
API Base URLhttp://宿主机IP:7897宿主机 IP + Clash API 映射端口
Secret留空对应 config.yaml 中的 secret 字段
Label任意名称Yacd 本地标签,用于标识不同配置

填写示例

假设宿主机 IP 为 192.168.1.100

字段填写内容
API Base URLhttp://192.168.1.100:7897
Secret(留空)
Label办公Clash

常见错误

错误填写原因
http://127.0.0.1:9090127.0.0.1 指向 Yacd 容器自身
http://localhost:7897localhost 同样指向 Yacd 容器自身
http://宿主机IP:9090端口错误,宿主机 9090 未映射

六、常用命令

查看端口映射

podman port clash

预期输出:

7890/tcp -> 0.0.0.0:7895
7891/tcp -> 0.0.0.0:7896
9090/tcp -> 0.0.0.0:7897

查看配置文件中的关键字段

grep -E "external-controller|secret|allow-lan" /data/clash/config/config.yaml

修改配置文件中 external-controller 的 IP

sed -i.bak 's/external-controller: 127.0.0.1:9090/external-controller: 0.0.0.0:9090/' /data/clash/config/config.yaml

启动所有服务

cd /data/clash
podman-compose up -d

单独启动或重启 Clash

podman-compose up -d clash
podman-compose restart clash

查看容器状态

podman-compose ps

查看日志

podman logs clash
podman-compose logs -f

测试 API 是否可访问

curl http://127.0.0.1:7897

正常响应应返回 404 page not found 或 JSON 格式内容。


七、故障排查

问题:curl 返回 Connection refused

可能原因external-controller 设置为 127.0.0.1:9090

解决方案

  1. 修改配置文件:

    external-controller: 0.0.0.0:9090
  2. 重启容器:

    podman-compose restart clash

问题:容器启动失败

排查步骤

  1. 查看日志:

    podman logs clash
  2. 确认配置文件格式正确(YAML 格式)
  3. 检查 config.yaml 是否完整

问题:Yacd 面板连接失败

排查步骤

  1. 在宿主机测试 API:

    curl http://127.0.0.1:7897
  2. 检查宿主机防火墙是否开放对应端口
  3. 确认 Yacd 中 API Base URL 填写正确

八、火狐浏览器代理配置

配置步骤

  1. 火狐浏览器 → 设置 → 搜索"代理" → 设置
  2. 选择"手动代理配置"
  3. HTTP 代理:宿主机 IP,端口:7895
  4. 勾选"将此代理服务器用于所有协议"
  5. 点击确定保存

配置示例

配置项
HTTP 代理192.168.1.100
端口7895
所有协议使用相同代理勾选

九、原理说明

Yacd 与 Clash 的关系

组件角色功能
Clash核心引擎处理网络流量、执行代理规则
Yacd控制面板通过 API 读取和修改 Clash 运行状态

节点切换原理

  1. Clash 启动时读取 config.yaml,将配置加载到内存
  2. Clash 完全按照内存中的配置运行
  3. 用户在 Yacd 面板点击节点
  4. Yacd 通过 API 向 Clash 发送 HTTP PATCH 请求
  5. Clash 更新内存中的节点选择状态
  6. 硬盘上的 config.yaml 文件内容保持不变

关键结论

  • Yacd 修改的是 Clash 的运行时内存状态,不是配置文件
  • 重启 Clash 容器会重新从硬盘读取配置,之前的选择会丢失
  • 如需要持久化节点选择,需在 config.yaml 中直接配置默认节点

十、资源占用说明

  • Clash 核心:主要资源消耗者,优化后可控制在 100MB 以内
  • Yacd 面板:纯静态前端页面,几乎不消耗服务器资源
  • Yacd 可以不持续运行,仅在需要切换节点时启动

资源优化建议

  1. 日志级别设为 errorwarning
  2. 关闭 TUN 模式(如仅需浏览器代理)
  3. 精简分流规则集
  4. 使用 Clash Meta (mihomo) 内核以获得更好内存优化

十一、配置文件镜像源说明

# 官方镜像
image: docker.io/haishanh/yacd:master

# 镜像加速服务(等同于官方镜像)
image: docker.1ms.run/haishanh/yacd:latest

docker.1ms.run 是镜像加速服务,拉取的是 Docker Hub 官方镜像的副本,功能完全一致。

标签: none

添加新评论