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
创建文件夹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 # 通用线程池
执行docker compose up -d启动,执行docker logs -f openclashhelper查看是否启动正常,正常时clash配置目录下会生成unreachable_domains.yaml文件,并不断增加新捕获数据
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"]
Content type
Image
Digest
sha256:680ee9dfa…
Size
23 MB
Last updated
6 months ago
docker pull 36bian/openclashhelper:1.4-arm64