Skill: lxnan/clash-vpn (version 1.0.0)

--- name: clash-vpn description: Manage Clash VPN proxy service for accessing blocked websites like Google Play. Use when the user needs to (1) setup/configure VPN proxy, (2) update Clash proxy configuration, (3) start/stop VPN service, (4) test proxy connectivity, or (5) access blocked resources through proxy. --- # Clash VPN 管理 此 Skill 用于管理 Clash VPN 代理服务，实现访问 Google Play 等被屏蔽的网站。 ## 前置条件 - Clash 已安装: `/usr/local/bin/clash` - 配置文件路径: `/root/.config/clash/config.yaml` - 脚本路径: `scripts/clash-vpn.sh` ## 快速开始 ### 1. 更新配置文件 用户提供新的 Clash 配置时: ```bash # 使用脚本更新配置 cat << 'EOF' | scripts/clash-vpn.sh update port: 7890 socks-port: 7891 # ... 完整配置内容 ... EOF ``` 或直接写入文件: ```bash cat > /root/.config/clash/config.yaml << 'EOF' # 配置内容 EOF ``` ### 2. 启动 VPN ```bash scripts/clash-vpn.sh start ``` ### 3. 测试连接 ```bash scripts/clash-vpn.sh test ``` ### 4. 查看状态 ```bash scripts/clash-vpn.sh status ``` ## 代理地址 启动后使用以下代理地址: | 类型 | 地址 | |------|------| | HTTP | `http://127.0.0.1:7890` | | SOCKS5 | `socks5://127.0.0.1:7891` | | Mixed | `http://127.0.0.1:7893` | ## 使用代理访问网站 ```bash # HTTP 代理 curl --proxy http://127.0.0.1:7890 https://play.google.com # SOCKS5 代理 curl --proxy socks5://127.0.0.1:7891 https://play.google.com ``` ## 配置管理 ### 配置模板 参考 `references/config-guide.md` 获取配置模板和字段说明。 ### 配置更新流程 1. 接收用户的新配置内容 2. 使用脚本更新配置（自动备份旧配置） 3. 验证配置格式 4. 重启服务（如果正在运行） ### 配置备份 每次更新会自动创建备份: ``` /root/.config/clash/config.yaml.bak.YYYYMMDDHHMMSS ``` ## 故障排查 ### 查看日志 ```bash tail -f /var/log/clash.log ``` ### 验证配置 ```bash clash -t -f /root/.config/clash/config.yaml ``` ### 常见问题 1. **DNS 端口被占用**: 不影响使用，可忽略 2. **MMDB 下载失败**: 禁用 GEOIP 规则或手动下载 3. **连接失败**: 检查节点配置和网络连接 ## 脚本命令参考 ```bash scripts/clash-vpn.sh start # 启动 scripts/clash-vpn.sh stop # 停止 scripts/clash-vpn.sh restart # 重启 scripts/clash-vpn.sh status # 状态 scripts/clash-vpn.sh test # 测试连接 scripts/clash-vpn.sh update # 更新配置（从 stdin） scripts/clash-vpn.sh help # 帮助 ```

path: references/config-guide.md
content: # Clash VPN 配置模板

## 配置说明

此文件包含 Clash VPN 的配置模板和示例。

## 最小配置示例

```yaml
port: 7890
socks-port: 7891
mixed-port: 7893
allow-lan: true
mode: rule
log-level: info
external-controller: 0.0.0.0:9090

dns:
  enable: true
  listen: 0.0.0.0:53
  nameserver:
    - 119.29.29.29
    - 223.5.5.5

proxies:
  - {name: "节点1", server: server1.example.com, port: 443, type: ss, cipher: chacha20-ietf-poly1305, [REDACTED_SECRET]
  - {name: "节点2", server: server2.example.com, port: 443, type: ss, cipher: chacha20-ietf-poly1305, [REDACTED_SECRET]

proxy-groups:
  - name: 🚀 节点选择
    type: select
    proxies:
      - 节点1
      - 节点2

rules:
  - DOMAIN-SUFFIX,local,DIRECT
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT
  - MATCH,🚀 节点选择
```

## 支持的代理类型

- `ss`: Shadowsocks
- `ssr`: ShadowsocksR
- `vmess`: VMess (V2Ray)
- `trojan`: Trojan
- `http`: HTTP 代理
- `socks5`: SOCKS5 代理

## 配置字段说明

### 基础配置

| 字段 | 说明 | 默认值 |
|------|------|--------|
| port | HTTP 代理端口 | 7890 |
| socks-port | SOCKS5 代理端口 | 7891 |
| mixed-port | 混合代理端口 (HTTP+SOCKS) | - |
| allow-lan | 允许局域网连接 | false |
| mode | 代理模式 (rule/global/direct) | rule |
| log-level | 日志级别 (debug/info/warning/error) | info |

### DNS 配置

```yaml
dns:
  enable: true
  listen: 0.0.0.0:53
  nameserver:
    - 119.29.29.29      # 腾讯 DNS
    - 223.5.5.5         # 阿里 DNS
    - 8.8.8.8           # Google DNS
```

### 代理节点配置

Shadowsocks 示例:
```yaml
proxies:
  - name: "香港节点"
    type: ss
    server: hk.example.com
    port: 443
    cipher: chacha20-ietf-poly1305
    [REDACTED_SECRET]
    plugin: obfs
    plugin-opts:
      mode: http
      host: bing.com
```

VMess 示例:
```yaml
proxies:
  - name: "美国节点"
    type: vmess
    server: us.example.com
    port: 443
    uuid: your_uuid
    alterId: 0
    cipher: auto
    tls: true
    network: ws
    ws-opts:
      path: /path
```

### 规则配置

常见规则类型:
```yaml
rules:
  # 域名规则
  - DOMAIN,google.com,PROXY
  - DOMAIN-SUFFIX,google.com,PROXY
  - DOMAIN-KEYWORD,google,PROXY
  
  # IP 规则
  - IP-CIDR,127.0.0.0/8,DIRECT
  - IP-CIDR,192.168.0.0/16,DIRECT
  - GEOIP,CN,DIRECT
  
  # 兜底规则
  - MATCH,PROXY
```

## 配置验证

使用以下命令验证配置:
```bash
clash -t -f /root/.config/clash/config.yaml
```

## 获取配置的方式

1. **机场订阅**: 从服务商获取订阅链接
2. **自建节点**: 手动编写配置文件
3. **转换工具**: 使用订阅转换服务


path: scripts/clash-vpn.sh
content: #!/bin/bash
# Clash VPN 管理脚本
# 用于启动、停止、更新配置的便捷工具

CLASH_CONFIG="/root/.config/clash/config.yaml"
CLASH_LOG="/var/log/clash.log"
CLASH_BIN="/usr/local/bin/clash"

show_help() {
    echo "Clash VPN 管理脚本"
    echo ""
    echo "用法: $0 [命令]"
    echo ""
    echo "命令:"
    echo "  start       启动 Clash VPN"
    echo "  stop        停止 Clash VPN"
    echo "  restart     重启 Clash VPN"
    echo "  status      查看运行状态"
    echo "  update      更新配置文件"
    echo "  test        测试代理连接"
    echo "  help        显示帮助信息"
    echo ""
    echo "代理地址:"
    echo "  HTTP:  http://127.0.0.1:7890"
    echo "  SOCKS: socks5://127.0.0.1:7891"
}

start_clash() {
    if pgrep -x "clash" > /dev/null; then
        echo "Clash 已经在运行"
        return 0
    fi
    
    if [ ! -f "$CLASH_CONFIG" ]; then
        echo "错误: 配置文件不存在: $CLASH_CONFIG"
        echo "请先更新配置"
        return 1
    fi
    
    nohup "$CLASH_BIN" -f "$CLASH_CONFIG" > "$CLASH_LOG" 2>&1 &
    sleep 2
    
    if pgrep -x "clash" > /dev/null; then
        echo "Clash 启动成功"
        echo "HTTP 代理: http://127.0.0.1:7890"
        echo "SOCKS 代理: socks5://127.0.0.1:7891"
    else
        echo "Clash 启动失败，查看日志: $CLASH_LOG"
        return 1
    fi
}

stop_clash() {
    if ! pgrep -x "clash" > /dev/null; then
        echo "Clash 未在运行"
        return 0
    fi
    
    pkill -x clash
    sleep 1
    
    if ! pgrep -x "clash" > /dev/null; then
        echo "Clash 已停止"
    else
        echo "Clash 停止失败"
        return 1
    fi
}

restart_clash() {
    stop_clash
    sleep 1
    start_clash
}

show_status() {
    if pgrep -x "clash" > /dev/null; then
        echo "Clash 运行状态: 运行中"
        echo ""
        echo "代理地址:"
        echo "  HTTP:  http://127.0.0.1:7890"
        echo "  SOCKS: socks5://127.0.0.1:7891"
        echo ""
        echo "配置文件: $CLASH_CONFIG"
        echo "日志文件: $CLASH_LOG"
    else
        echo "Clash 运行状态: 未运行"
    fi
}

update_config() {
    local config_content="$1"
    
    if [ -z "$config_content" ]; then
        echo "错误: 配置内容为空"
        echo "用法: echo '配置内容' | $0 update"
        return 1
    fi
    
    # 备份旧配置
    if [ -f "$CLASH_CONFIG" ]; then
        cp "$CLASH_CONFIG" "$CLASH_CONFIG.bak.$(date +%Y%m%d%H%M%S)"
    fi
    
    # 写入新配置
    echo "$config_content" > "$CLASH_CONFIG"
    
    if [ $? -eq 0 ]; then
        echo "配置已更新: $CLASH_CONFIG"
        
        # 验证配置格式
        if "$CLASH_BIN" -t -f "$CLASH_CONFIG" 2>&1 | grep -q "Parse config error"; then
            echo "警告: 配置格式可能有误，请检查"
        else
            echo "配置格式验证通过"
        fi
        
        # 如果正在运行，询问是否重启
        if pgrep -x "clash" > /dev/null; then
            echo "Clash 正在运行，建议重启以应用新配置"
        fi
    else
        echo "配置更新失败"
        return 1
    fi
}

test_proxy() {
    echo "测试代理连接..."
    
    # 测试 HTTP 代理
    echo -n "HTTP 代理 (Google): "
    if curl -s --connect-timeout 10 --proxy http://127.0.0.1:7890 http://www.google.com > /dev/null 2>&1; then
        echo "✓ 正常"
    else
        echo "✗ 失败"
    fi
    
    # 测试 SOCKS 代理
    echo -n "SOCKS 代理 (Google): "
    if curl -s --connect-timeout 10 --proxy socks5://127.0.0.1:7891 http://www.google.com > /dev/null 2>&1; then
        echo "✓ 正常"
    else
        echo "✗ 失败"
    fi
}

# 主逻辑
case "${1:-}" in
    start)
        start_clash
        ;;
    stop)
        stop_clash
        ;;
    restart)
        restart_clash
        ;;
    status)
        show_status
        ;;
    update)
        # 从 stdin 读取配置内容
        config=$(cat)
        update_config "$config"
        ;;
    test)
        test_proxy
        ;;
    help|--help|-h)
        show_help
        ;;
    *)
        show_help
        exit 1
        ;;
esac


Security scan verdicts — ClawScan: suspicious | static analysis: clean | VirusTotal: clean | SkillSpector: suspicious (HIGH)