Sign inSign up

36bian/openclashhelper

By 36bian

•Updated 6 months ago

clash的增强程序,智能生成被墙列表,支持x64/arm64

Image
0

995

36bian/openclashhelper repository overview

⁠简介

clash的增强程序,智能生成被墙列表。安装了36bian/openclash的可以无缝安装

⁠目的及原理

目的:解决clash自带黑名单无法覆盖所有域名,手动维护域名繁琐的问题
原理:监控clash日志,捕获network is unreachable的域名,有些不报错走到最后match Match using DIRECT的域名实际网页显示PR_END_OF_FILE_ERRORtls握手失败的,也会捕获(访问失败时刷新一次网页,第三次就可以捕获)。实测基本覆盖所有被墙域名

⁠更新历史

v1.0:对直连失败域名和实际失败域名进行检测
v1.1:增加了对慢网站的识别
v1.2:逻辑大幅修改,引入质量分级,现在可以对黑白名单进行自动维护
v1.3:处理了clash崩溃会影响退出的问题,支持自定义dns解析
v1.4:增加了ipfilter白名单功能(返回真实ip),修复了ttl隐藏bug

⁠安装

  1. 创建文件夹compose-openclashhelper在里边执行vi docker-compose.yml,将下列内容粘贴进去。env部分注释掉的是识别被墙域名的默认配置,打开后可以修改。一般只需要确保网络ip和网络名与clash一致、修改clash配置目录路径即可,详见注释

    docker-compose.yml

    version: '3.8'
    
    services:
      clashhelper: 
        image: 36bian/openclashhelper:1.4
        container_name: clashhelper
        restart: unless-stopped
        volumes:
          - /var/run/docker.sock:/var/run/docker.sock:ro
          # 替换为 Clash 配置文件的绝对路径
          - /root/compose-clash/config:/clash_config
        environment:
          # --- 核心配置 (根据你的环境调整) ---
          # - CLASH_CONTAINER_NAME=clash # Clash容器名
          - PROVIDER_FILENAME=unreachable_domains.yaml # 生成的文件名
          - CLASH_CONFIG_FILENAME=config.yaml # 替换成clash实际配置文件名
          # - DNS_SERVER=223.5.5.5 # 使用指定的dns进行解析,默认智能解析clash
          # - DNS_PORT=53
          # - ENABLE_CLASH_API_RELOAD=true # clash刷新通知,默认false
    
          # --- 调试与日志 ---
          # - DEBUG_MODE=true # 默认false,需要详细日志时开启
          # --- 匹配规则 ---
          # - ERROR_LOG_PATTERN='^.*match Match.*-->\s+([0-9a-fA-F:.\w-]+):\d+.*error:.*?(connection refused|network is unreachable|dial tcp.*failed)'
          # - DIRECT_LOG_PATTERN='.*-->\s+([\w.-]+):(\d+)\s+match\s+Match\s+using\s+DIRECT\b'
          # --- 慢速检测开关 ---
          # - ENABLE_SLOW_DETECTION=true # 默认true
          # --- 线程池 ---
          # - NEW_DOMAIN_POOL_SIZE=3 # 新域名专用线程池
          # - CONN_CHECK_MAX_WORKERS=7 # 通用线程池
    
  2. 执行docker compose up -d启动,执行docker logs -f openclashhelper查看是否启动正常,正常时clash配置目录下会生成unreachable_domains.yaml文件,并不断增加新捕获数据

⁠docker镜像构建脚本

Dockerfile v1.3

# ---- STAGE 1: Builder ----
FROM python:3.9-alpine AS builder
LABEL stage=builder

# 更新 Alpine 包索引,安装构建时依赖
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
RUN apk update && \
    apk add --no-cache python3-dev gcc musl-dev libffi-dev sqlite-dev && \
    rm -rf /var/cache/apk/*

# 设置工作目录
WORKDIR /app

# 复制依赖文件
COPY requirements.txt .

# 安装 Python 依赖
# 假设 requirements.txt 已经包含了 PyYAML, requests, dnspython>=2.0.0
RUN pip install --no-cache-dir -r requirements.txt && \
    python -c "import tldextract; extractor = tldextract.TLDExtract(cache_dir='/app/build_tldextract_cache', include_psl_private_domains=True); extractor('example.com')"

# 复制应用程序脚本
COPY enhancer_script.py .

# ---- STAGE 2: Runtime ----
FROM python:3.9-alpine AS runtime

# 安装运行时的系统依赖
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories && \
    apk update && \
    apk add --no-cache ca-certificates tzdata sqlite-libs && \
    rm -rf /var/cache/apk/*

# 设置工作目录
WORKDIR /app

# 从 builder 阶段复制已安装的 Python 依赖库
COPY --from=builder /usr/local/lib/python3.9/site-packages /usr/local/lib/python3.9/site-packages
# 从 builder 阶段复制预热的 tldextract 缓存
RUN mkdir -p /root/.cache
COPY --from=builder /app/build_tldextract_cache /root/.cache/tldextract
# 从 builder 阶段复制应用程序脚本
COPY --from=builder /app/enhancer_script.py .

# --- 核心配置 ---
ENV CLASH_CONTAINER_NAME=clash
ENV CLASH_CONFIG_DIR_IN_HELPER=/clash_config
ENV PROVIDER_FILENAME=unreachable_domains.yaml
ENV CLASH_API_URL=
ENV CLASH_API_SECRET=
ENV CLASH_API_TIMEOUT=10
ENV ENABLE_CLASH_API_RELOAD=true
ENV DEBUG_MODE=false
ENV TZ=Asia/Shanghai

# --- DNS Resolver Configuration ---
ENV CLASH_CONFIG_FILENAME="config.yaml"
ENV DNS_SERVER=""
ENV DNS_PORT=""
# 旧的 CLASH_DNS_SERVER 和 CLASH_DNS_PORT 已被移除,因为脚本内部逻辑会处理DNS配置

# --- 日志匹配模式 ---
ENV ERROR_LOG_PATTERN='^.*match Match.*-->\s+([0-9a-fA-F:.\w-]+):\d+.*error:.*?(network is unreachable|connect(?:ion)? refused|dial tcp.*failed)'
ENV DIRECT_LOG_PATTERN='.*-->\s+([0-9a-fA-F:.\w-]+):(\d+)\s+match\s+Match\s+using\s+DIRECT\b'
# --- 行为与性能调优参数 ---
ENV NEW_DOMAIN_POOL_SIZE=3
ENV CONN_CHECK_MAX_WORKERS=7
# --- Generalization Configuration ---
ENV BLACKLIST_GENERALIZATION_THRESHOLD=2
ENV WHITELIST_GENERALIZATION_CHILD_COUNT=2
ENV WHITELIST_GENERALIZATION_MIN_CHILD_OK_LEVEL=1
ENV PERIODIC_GENERALIZATION_CHECK_INTERVAL=1800
ENV PERIODIC_RECHECK_SCHEDULER_INTERVAL=20
# --- 连接性与慢速检测阈值 ---
ENV CONN_CHECK_TIMEOUT_DNS=2
ENV CONN_CHECK_TIMEOUT_TCP=2
ENV CONN_CHECK_TIMEOUT_TLS=3
ENV ENABLE_SLOW_DETECTION=true
ENV CONN_CHECK_SLOW_TCP_MS=400
ENV CONN_CHECK_SLOW_TLS_MS=700
ENV ENABLE_TTFB_CHECK=true
ENV CONN_CHECK_TIMEOUT_TTFB_SECONDS=3
ENV CONN_CHECK_SLOW_TTFB_MS=1000
# --- Network Outage Detection ---
ENV PRIMARY_SENTINEL_HOST="223.5.5.5:53"
ENV SECONDARY_SENTINEL_HOST="8.8.8.8:53"
ENV NETWORK_STATUS_CHECK_INTERVAL_SECONDS=60
ENV NETWORK_STATUS_RETRY_INTERVAL_SECONDS=30
ENV SENTINEL_CONNECTION_TIMEOUT=2
# --- Startup Stale Check Config ---
ENV STALE_CHECK_MAX_GRACE_PERIOD_SECONDS=604800
# --- Domain Inactivity ---
ENV DOMAIN_INACTIVITY_THRESHOLD_SECONDS=2592000
ENV INACTIVE_DOMAIN_RESCHEDULE_DELAY_SECONDS=86400
# --- Clash Log Monitoring ---
ENV CLASH_LOG_RETRY_INTERVAL_SECONDS=15
# --- Python 运行时特定设置 ---
ENV PYTHONUNBUFFERED=1

# 容器启动时执行的命令
CMD ["python", "enhancer_script.py"]

Tag summary

Content type

Image

Digest

sha256:680ee9dfa…

Size

23 MB

Last updated

6 months ago

docker pull 36bian/openclashhelper:1.4-arm64