#!/bin/bash # Setup Clash Meta proxy server on server2 # Clash Meta is more actively maintained than original Clash echo "=== Setting up Clash Meta proxy server on server2 ===" echo "" ssh server2 << 'EOF' set -e # Get Tailscale IP TAILSCALE_IP=$(tailscale ip -4) echo "Tailscale IP: $TAILSCALE_IP" echo "" # Detect architecture ARCH=$(uname -m) case $ARCH in x86_64) CLASH_ARCH="amd64" ;; aarch64|arm64) CLASH_ARCH="arm64" ;; *) echo "Unsupported architecture: $ARCH"; exit 1 ;; esac # Create directories CLASH_DIR="$HOME/clash-meta" mkdir -p "$CLASH_DIR" mkdir -p ~/.config/clash-meta cd "$CLASH_DIR" # Download Clash Meta echo "Downloading Clash Meta..." CLASH_VERSION="v1.18.0" CLASH_FILE="clash.meta-linux-${CLASH_ARCH}-${CLASH_VERSION}" if wget -q "https://github.com/MetaCubeX/mihomo/releases/download/${CLASH_VERSION}/${CLASH_FILE}.gz" -O clash.gz; then gunzip -f clash.gz mv "$CLASH_FILE" clash chmod +x clash echo "✓ Clash Meta downloaded" else echo "Failed to download Clash Meta. Trying alternative method..." # Try downloading from release page wget -q "https://github.com/MetaCubeX/mihomo/releases/latest/download/mihomo-linux-${CLASH_ARCH}.gz" -O clash.gz 2>/dev/null || \ wget -q "https://github.com/MetaCubeX/mihomo/releases/download/v1.18.0/mihomo-linux-${CLASH_ARCH}.gz" -O clash.gz gunzip -f clash.gz mv mihomo-linux-${CLASH_ARCH} clash 2>/dev/null || mv mihomo clash chmod +x clash fi # Verify installation if [ -f ./clash ]; then ./clash -v || echo "Clash binary ready" else echo "✗ Clash binary not found" exit 1 fi # Create Clash configuration echo "Creating configuration..." cat > ~/.config/clash-meta/config.yaml << CONFIG # Clash Meta configuration for server2 proxy port: 7890 socks-port: 7891 mixed-port: 7892 allow-lan: true bind-address: '*' mode: rule log-level: info ipv6: false external-controller: 0.0.0.0:9090 external-ui: ui # DNS dns: enable: true listen: 0.0.0.0:53 enhanced-mode: fake-ip fake-ip-range: 198.18.0.1/16 nameserver: - 8.8.8.8 - 1.1.1.1 fallback: - 8.8.4.4 - 1.0.0.1 fallback-filter: geoip: true geoip-code: CN ipcidr: - 240.0.0.0/4 # Proxy (direct connection) proxies: - name: "direct" type: direct # Proxy groups proxy-groups: - name: "Proxy" type: select proxies: - direct - name: "Auto" type: select proxies: - direct # Rules - route all traffic through direct connection rules: - MATCH,Proxy # Experimental experimental: ignore-resolve-fail: true sniff-tls-sni: true CONFIG # Download Clash dashboard UI echo "Downloading Clash UI..." cd ~/.config/clash-meta if [ ! -d ui ]; then wget -q https://github.com/haishanh/yacd/archive/gh-pages.zip -O ui.zip 2>/dev/null || \ wget -q https://github.com/haishanh/yacd/releases/latest/download/yacd.tar.xz -O yacd.tar.xz 2>/dev/null if [ -f yacd.tar.xz ]; then tar -xf yacd.tar.xz mv public ui rm yacd.tar.xz elif [ -f ui.zip ]; then unzip -q ui.zip mv yacd-gh-pages ui rm ui.zip else echo "UI download failed, but Clash will work without it" fi fi # Create systemd service echo "Creating systemd service..." sudo tee /etc/systemd/system/clash-meta.service > /dev/null << SERVICE [Unit] Description=Clash Meta daemon After=network.target [Service] Type=simple Restart=always User=$USER WorkingDirectory=$CLASH_DIR ExecStart=$CLASH_DIR/clash -d $HOME/.config/clash-meta Environment="HOME=$HOME" [Install] WantedBy=multi-user.target SERVICE # Reload systemd and start Clash sudo systemctl daemon-reload sudo systemctl enable clash-meta sudo systemctl restart clash-meta # Wait for service to start sleep 3 # Check status if sudo systemctl is-active --quiet clash-meta; then echo "" echo "✓ Clash Meta is running!" echo "" echo "=== Configuration Summary ===" echo "HTTP Proxy: $TAILSCALE_IP:7890" echo "SOCKS5 Proxy: $TAILSCALE_IP:7891" echo "Mixed Proxy (HTTP+SOCKS5): $TAILSCALE_IP:7892" echo "Web UI: http://$TAILSCALE_IP:9090/ui" echo "" # Configure firewall echo "=== Firewall Configuration ===" if command -v ufw >/dev/null 2>&1 && sudo ufw status | grep -q "Status: active"; then echo "Configuring UFW..." sudo ufw allow 7890/tcp comment "Clash HTTP" sudo ufw allow 7891/tcp comment "Clash SOCKS5" sudo ufw allow 7892/tcp comment "Clash Mixed" sudo ufw allow 9090/tcp comment "Clash Web UI" sudo ufw allow 53/udp comment "Clash DNS" else echo "UFW not active. If using iptables, ensure ports 7890, 7891, 7892, 9090, 53 are open." fi echo "" echo "=== Client Configuration ===" echo "For Clash clients, configure:" echo " Type: HTTP" echo " Server: $TAILSCALE_IP" echo " Port: 7890" echo "" echo "Or use Mixed port (supports both HTTP and SOCKS5):" echo " Server: $TAILSCALE_IP" echo " Port: 7892" else echo "✗ Clash Meta failed to start" echo "Check logs: sudo journalctl -u clash-meta -n 50" exit 1 fi EOF echo "" echo "=== Setup Complete ===" echo "" echo "Commands:" echo " Status: ssh server2 'sudo systemctl status clash-meta'" echo " Logs: ssh server2 'sudo journalctl -u clash-meta -f'" echo " Restart: ssh server2 'sudo systemctl restart clash-meta'"