Last active
June 30, 2025 04:08
-
-
Save jnorthrup/381947bc169afbf2f02a19f374722868 to your computer and use it in GitHub Desktop.
single-file client/server symmetrical proxy bridge for termux
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/usr/bin/env bash | |
| # Proxy Bridge - Unified Client/Server for Mac/Termux/Linux | |
| # Combines 3proxy, tinyproxy, microsocks into one clean interface | |
| set -e | |
| # Debug mode | |
| : ${DEBUG:=0} | |
| : ${VERBOSE:=0} | |
| # Debug logging | |
| debug_log() { | |
| [[ "$DEBUG" == "1" ]] && echo -e "${BLUE}[DEBUG]${NC} $*" >&2 | |
| } | |
| verbose_log() { | |
| [[ "$VERBOSE" == "1" ]] && echo -e "${YELLOW}[VERBOSE]${NC} $*" >&2 | |
| } | |
| # Colors | |
| RED='\033[0;31m' | |
| GREEN='\033[0;32m' | |
| BLUE='\033[0;34m' | |
| YELLOW='\033[1;33m' | |
| NC='\033[0m' | |
| # Default configuration | |
| : ${SOCKS_PORT:=1080} | |
| : ${REMOTE_SOCKS:=1081} | |
| : ${HTTP_PORT:=3128} | |
| : ${REMOTE_HTTP:=3128} | |
| : ${TERMUX_PORT:=8022} | |
| : ${TERMUX_USER:=u0_a471} | |
| : ${TERMUX_HOST:=$(netstat -nr | grep '^default' | head -n1 | awk '{print $2}')} | |
| : ${WIFI_SERVICE:="Wi-Fi"} | |
| SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" | |
| print_banner() { | |
| echo -e "${BLUE}╔══════════════════════════════════╗${NC}" | |
| echo -e "${BLUE}║ PROXY BRIDGE ║${NC}" | |
| echo -e "${BLUE}║ Universal Client/Server ║${NC}" | |
| echo -e "${BLUE}╚══════════════════════════════════╝${NC}" | |
| echo | |
| } | |
| detect_platform() { | |
| if [[ "$PREFIX" == *"com.termux"* ]]; then | |
| echo "termux" | |
| elif [[ "$OSTYPE" == "darwin"* ]]; then | |
| echo "macos" | |
| else | |
| echo "linux" | |
| fi | |
| } | |
| get_local_ip() { | |
| case $(detect_platform) in | |
| "termux") | |
| # Get rmnet interface IP | |
| ip route get 8.8.8.8 2>/dev/null | awk '{print $7; exit}' || echo "127.0.0.1" | |
| ;; | |
| "macos") | |
| route get default 2>/dev/null | grep gateway | awk '{print $2}' || echo "127.0.0.1" | |
| ;; | |
| *) | |
| ip route get 8.8.8.8 2>/dev/null | awk '{print $7; exit}' || echo "127.0.0.1" | |
| ;; | |
| esac | |
| } | |
| # Termux 3proxy server setup | |
| start_3proxy_server() { | |
| local platform=$(detect_platform) | |
| if [[ "$platform" != "termux" ]]; then | |
| echo -e "${RED}Error: 3proxy server mode only available on Termux${NC}" | |
| exit 1 | |
| fi | |
| echo -e "${GREEN}Starting 3proxy server on Termux...${NC}" | |
| PROXY="$HOME/3proxy-src/bin/3proxy" | |
| CFG_FILE="$HOME/.3proxy.inline.cfg" | |
| PID_FILE="$HOME/.3proxy.inline.pid" | |
| LOG_FILE="$HOME/3proxy-inline.log" | |
| if [[ ! -f "$PROXY" ]]; then | |
| echo -e "${RED}Error: 3proxy not found at $PROXY${NC}" | |
| exit 1 | |
| fi | |
| # Get valid rmnet interfaces | |
| echo -e "${YELLOW}Scanning for active rmnet interfaces...${NC}" | |
| get_valid_rmnets() { | |
| local all_ifaces=$(ifconfig | grep -o '^rmnet_data[0-9]*' | sort -u) | |
| echo "Found rmnet interfaces: $all_ifaces" >&2 | |
| for iface in $all_ifaces; do | |
| echo "Testing $iface..." >&2 | |
| if curl --interface "$iface" -s --max-time 2 https://ifconfig.me >/dev/null 2>&1; then | |
| echo "✓ $iface: WORKING" >&2 | |
| echo "$iface" | |
| else | |
| echo "✗ $iface: blocked by Knox/carrier" >&2 | |
| fi | |
| done | |
| } | |
| valid_ifaces=$(get_valid_rmnets | sort) | |
| if [[ -z "$valid_ifaces" ]]; then | |
| echo -e "${YELLOW}No rmnet interfaces found, using default config${NC}" | |
| valid_ifaces="lo" | |
| fi | |
| echo -e "${BLUE}Selected working interfaces: $valid_ifaces${NC}" | |
| echo -e "${GREEN}Using $(echo $valid_ifaces | wc -w) interface(s) for 3proxy${NC}" | |
| # Check if already running with same config | |
| if [[ -f "$CFG_FILE" ]] && [[ -f "$PID_FILE" ]] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then | |
| old_config=$(grep '^external ' "$CFG_FILE" | awk '{print $2}' | sort | tr '\n' ' ') | |
| new_config=$(echo $valid_ifaces | tr '\n' ' ') | |
| if [[ "$new_config" == "$old_config" ]]; then | |
| echo -e "${GREEN}✅ 3proxy already running with matching interfaces${NC}" | |
| return 0 | |
| else | |
| echo -e "${YELLOW}🔁 Interfaces changed — restarting 3proxy${NC}" | |
| kill $(cat "$PID_FILE") 2>/dev/null || true | |
| rm -f "$PID_FILE" | |
| fi | |
| fi | |
| # Build config | |
| cat > "$CFG_FILE" << EOF | |
| daemon | |
| log $LOG_FILE D | |
| pidfile $PID_FILE | |
| nserver 8.8.8.8 | |
| nserver 1.1.1.1 | |
| auth none | |
| allow * | |
| flush | |
| $(for i in $valid_ifaces; do echo "external $i"; done) | |
| internal 127.0.0.1 | |
| socks -p$REMOTE_SOCKS -i127.0.0.1 | |
| proxy -p$REMOTE_HTTP -i127.0.0.1 | |
| EOF | |
| echo -e "${BLUE}Starting 3proxy with config:${NC}" | |
| cat "$CFG_FILE" | |
| "$PROXY" "$CFG_FILE" | |
| if [[ -f "$PID_FILE" ]] && kill -0 $(cat "$PID_FILE") 2>/dev/null; then | |
| echo -e "${GREEN}✅ 3proxy server started successfully${NC}" | |
| echo -e "SOCKS5: ${YELLOW}$(get_local_ip):$REMOTE_SOCKS${NC}" | |
| echo -e "HTTP: ${YELLOW}$(get_local_ip):$REMOTE_HTTP${NC}" | |
| else | |
| echo -e "${RED}❌ Failed to start 3proxy${NC}" | |
| exit 1 | |
| fi | |
| } | |
| # Simple proxy servers for other platforms | |
| start_simple_server() { | |
| local mode="$1" | |
| local port="$2" | |
| local platform=$(detect_platform) | |
| case "$mode" in | |
| "http") | |
| port=${port:-$HTTP_PORT} | |
| if command -v tinyproxy >/dev/null 2>&1; then | |
| echo -e "${GREEN}Starting tinyproxy HTTP server on port $port${NC}" | |
| local config_file="$SCRIPT_DIR/tinyproxy-$port.conf" | |
| cat > "$config_file" << EOF | |
| Port $port | |
| Listen 0.0.0.0 | |
| Timeout 600 | |
| LogLevel Info | |
| MaxClients 100 | |
| Allow 127.0.0.1 | |
| Allow 192.168.0.0/16 | |
| Allow 10.0.0.0/8 | |
| Allow 172.16.0.0/12 | |
| DisableViaHeader Yes | |
| EOF | |
| tinyproxy -d -c "$config_file" | |
| else | |
| echo -e "${RED}Error: tinyproxy not available${NC}" | |
| exit 1 | |
| fi | |
| ;; | |
| "socks") | |
| port=${port:-$SOCKS_PORT} | |
| if command -v microsocks >/dev/null 2>&1; then | |
| echo -e "${GREEN}Starting microsocks SOCKS5 server on port $port${NC}" | |
| microsocks -p $port | |
| else | |
| echo -e "${RED}Error: microsocks not available${NC}" | |
| exit 1 | |
| fi | |
| ;; | |
| esac | |
| } | |
| # Client connection setup | |
| start_client() { | |
| local target="$1" | |
| local platform=$(detect_platform) | |
| if [[ -z "$target" ]]; then | |
| echo -e "${RED}Error: Target required (host:port or 'auto' for Termux)${NC}" | |
| exit 1 | |
| fi | |
| if [[ "$target" == "auto" ]]; then | |
| if [[ "$platform" == "macos" ]]; then | |
| setup_mac_client | |
| else | |
| echo -e "${RED}Auto mode only available on macOS${NC}" | |
| exit 1 | |
| fi | |
| else | |
| setup_manual_client "$target" | |
| fi | |
| } | |
| setup_mac_client() { | |
| echo -e "${GREEN}Setting up Mac client for Termux 3proxy...${NC}" | |
| # Try microsocks first since it works better | |
| echo -e "${YELLOW}🔍 Starting microsocks on Termux...${NC}" | |
| echo -e "${BLUE}Target: ${TERMUX_USER}@${TERMUX_HOST}:${TERMUX_PORT}${NC}" | |
| timeout 10 ssh -o ConnectTimeout=3 -o BatchMode=yes -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST} "pkill microsocks tinyproxy; nohup microsocks -p ${REMOTE_SOCKS} & nohup tinyproxy -d -c /data/data/com.termux/files/home/tinyproxy.conf &" 2>/dev/null || echo "Could not start proxies" | |
| # Check if SSH tunnel already exists | |
| if lsof -iTCP:${SOCKS_PORT} >/dev/null 2>&1 && lsof -iTCP:${HTTP_PORT} >/dev/null 2>&1; then | |
| echo -e "${GREEN}✅ SSH tunnels already active${NC}" | |
| # Still activate Wi-Fi settings for existing tunnels | |
| if lsof -iTCP:${SOCKS_PORT} >/dev/null 2>&1; then | |
| echo -e "${YELLOW}🔥 Port ${SOCKS_PORT} live - activating SOCKS proxy...${NC}" | |
| ACTUAL_WIFI=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|AirPort" | head -1 || echo "Wi-Fi") | |
| echo -e "${BLUE}Using network service: $ACTUAL_WIFI${NC}" | |
| networksetup -setsocksfirewallproxy "$ACTUAL_WIFI" 127.0.0.1 "$SOCKS_PORT" && echo -e "${GREEN}✓ SOCKS proxy activated${NC}" || echo -e "${RED}✗ SOCKS proxy failed${NC}" | |
| networksetup -setsocksfirewallproxystate "$ACTUAL_WIFI" on && echo -e "${GREEN}✓ SOCKS proxy enabled${NC}" || echo -e "${RED}✗ SOCKS enable failed${NC}" | |
| fi | |
| if lsof -iTCP:${HTTP_PORT} >/dev/null 2>&1; then | |
| echo -e "${YELLOW}🔥 Port ${HTTP_PORT} live - activating HTTP/HTTPS proxy...${NC}" | |
| ACTUAL_WIFI=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|AirPort" | head -1 || echo "Wi-Fi") | |
| echo -e "${BLUE}Using network service: $ACTUAL_WIFI${NC}" | |
| networksetup -setwebproxy "$ACTUAL_WIFI" 127.0.0.1 "$HTTP_PORT" && echo -e "${GREEN}✓ HTTP proxy activated${NC}" || echo -e "${RED}✗ HTTP proxy failed${NC}" | |
| networksetup -setsecurewebproxy "$ACTUAL_WIFI" 127.0.0.1 "$HTTP_PORT" && echo -e "${GREEN}✓ HTTPS proxy activated${NC}" || echo -e "${RED}✗ HTTPS proxy failed${NC}" | |
| networksetup -setwebproxystate "$ACTUAL_WIFI" on && echo -e "${GREEN}✓ HTTP proxy enabled${NC}" || echo -e "${RED}✗ HTTP enable failed${NC}" | |
| networksetup -setsecurewebproxystate "$ACTUAL_WIFI" on && echo -e "${GREEN}✓ HTTPS proxy enabled${NC}" || echo -e "${RED}✗ HTTPS enable failed${NC}" | |
| fi | |
| else | |
| echo -e "${YELLOW}🔌 Creating SSH tunnels to Termux...${NC}" | |
| echo -e "Connecting to: ${BLUE}${TERMUX_USER}@${TERMUX_HOST}:${TERMUX_PORT}${NC}" | |
| # Kill existing tunnels | |
| pkill -f "ssh.*${TERMUX_HOST}.*${TERMUX_PORT}" 2>/dev/null || true | |
| # Create new tunnel | |
| debug_log "Creating SSH tunnel: -L ${SOCKS_PORT}:127.0.0.1:${REMOTE_SOCKS} -L ${HTTP_PORT}:127.0.0.1:${REMOTE_HTTP}" | |
| ssh -f -N \ | |
| -o StrictHostKeyChecking=no \ | |
| -o UserKnownHostsFile=/dev/null \ | |
| -L ${SOCKS_PORT}:127.0.0.1:${REMOTE_SOCKS} \ | |
| -L ${HTTP_PORT}:127.0.0.1:${REMOTE_HTTP} \ | |
| -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST} | |
| sleep 2 | |
| # Verify tunnels with detailed checking | |
| socks_ok=0 | |
| http_ok=0 | |
| if lsof -iTCP:${SOCKS_PORT} >/dev/null 2>&1; then | |
| socks_ok=1 | |
| debug_log "SOCKS tunnel on port ${SOCKS_PORT} is active" | |
| # SOCKS port is live - activate SOCKS proxy | |
| echo -e "${YELLOW}🔥 Port ${SOCKS_PORT} live - activating SOCKS proxy...${NC}" | |
| ACTUAL_WIFI=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|AirPort" | head -1 || echo "Wi-Fi") | |
| echo -e "${BLUE}Using network service: $ACTUAL_WIFI${NC}" | |
| networksetup -setsocksfirewallproxy "$ACTUAL_WIFI" 127.0.0.1 "$SOCKS_PORT" && echo -e "${GREEN}✓ SOCKS proxy activated${NC}" || echo -e "${RED}✗ SOCKS proxy failed${NC}" | |
| networksetup -setsocksfirewallproxystate "$ACTUAL_WIFI" on && echo -e "${GREEN}✓ SOCKS proxy enabled${NC}" || echo -e "${RED}✗ SOCKS enable failed${NC}" | |
| else | |
| debug_log "SOCKS tunnel on port ${SOCKS_PORT} failed" | |
| fi | |
| if lsof -iTCP:${HTTP_PORT} >/dev/null 2>&1; then | |
| http_ok=1 | |
| debug_log "HTTP tunnel on port ${HTTP_PORT} is active" | |
| # HTTP port is live - activate HTTP/HTTPS proxy | |
| echo -e "${YELLOW}🔥 Port ${HTTP_PORT} live - activating HTTP/HTTPS proxy...${NC}" | |
| ACTUAL_WIFI=$(networksetup -listallnetworkservices | grep -E "Wi-Fi|AirPort" | head -1 || echo "Wi-Fi") | |
| echo -e "${BLUE}Using network service: $ACTUAL_WIFI${NC}" | |
| networksetup -setwebproxy "$ACTUAL_WIFI" 127.0.0.1 "$HTTP_PORT" && echo -e "${GREEN}✓ HTTP proxy activated${NC}" || echo -e "${RED}✗ HTTP proxy failed${NC}" | |
| networksetup -setsecurewebproxy "$ACTUAL_WIFI" 127.0.0.1 "$HTTP_PORT" && echo -e "${GREEN}✓ HTTPS proxy activated${NC}" || echo -e "${RED}✗ HTTPS proxy failed${NC}" | |
| networksetup -setwebproxystate "$ACTUAL_WIFI" on && echo -e "${GREEN}✓ HTTP proxy enabled${NC}" || echo -e "${RED}✗ HTTP enable failed${NC}" | |
| networksetup -setsecurewebproxystate "$ACTUAL_WIFI" on && echo -e "${GREEN}✓ HTTPS proxy enabled${NC}" || echo -e "${RED}✗ HTTPS enable failed${NC}" | |
| else | |
| debug_log "HTTP tunnel on port ${HTTP_PORT} failed" | |
| fi | |
| if [[ $socks_ok == 1 && $http_ok == 1 ]]; then | |
| echo -e "${GREEN}✅ SSH tunnels established${NC}" | |
| else | |
| echo -e "${RED}❌ Failed to establish SSH tunnels${NC}" | |
| debug_log "Active SSH processes: $(ps aux | grep -E 'ssh.*${TERMUX_HOST}' | grep -v grep)" | |
| exit 1 | |
| fi | |
| fi | |
| # Set system proxy - try SOCKS first since it works | |
| echo -e "${YELLOW}🌐 Configuring system proxy...${NC}" | |
| # Export both SOCKS configurations | |
| export ALL_PROXY="socks5h://127.0.0.1:${SOCKS_PORT}" | |
| export all_proxy="socks5h://127.0.0.1:${SOCKS_PORT}" | |
| export SOCKS_PROXY="socks5h://127.0.0.1:${SOCKS_PORT}" | |
| export socks_proxy="socks5h://127.0.0.1:${SOCKS_PORT}" | |
| # Also keep HTTP proxy exports for completeness | |
| export HTTP_PROXY="http://127.0.0.1:${HTTP_PORT}" | |
| export http_proxy="http://127.0.0.1:${HTTP_PORT}" | |
| export HTTPS_PROXY="http://127.0.0.1:${HTTP_PORT}" | |
| export https_proxy="http://127.0.0.1:${HTTP_PORT}" | |
| # Network proxy settings already activated per-port above | |
| echo -e "${BLUE}All proxy environment variables exported${NC}" | |
| # Configure npm and git | |
| set_proxy | |
| echo -e "${GREEN}✅ Mac client configured${NC}" | |
| echo -e "HTTP Proxy: ${YELLOW}127.0.0.1:$HTTP_PORT${NC}" | |
| echo -e "SOCKS5 Proxy: ${YELLOW}127.0.0.1:$SOCKS_PORT${NC}" | |
| echo | |
| echo -e "${BLUE}SSH Commands for Termux Management:${NC}" | |
| echo -e "${YELLOW}# Sync this script to Termux:${NC}" | |
| echo "scp -P ${TERMUX_PORT} proxy-bridge ${TERMUX_USER}@${TERMUX_HOST}:." | |
| echo | |
| echo -e "${YELLOW}# SSH into Termux:${NC}" | |
| echo "ssh -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST}" | |
| echo | |
| echo -e "${YELLOW}# Start proxy server on Termux:${NC}" | |
| echo "ssh -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST} './proxy-bridge server'" | |
| echo | |
| echo -e "${YELLOW}# Check Termux proxy status:${NC}" | |
| echo "ssh -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST} './proxy-bridge status'" | |
| echo | |
| echo -e "${YELLOW}# Manual SSH tunnels:${NC}" | |
| echo "ssh -f -N -L ${SOCKS_PORT}:127.0.0.1:${REMOTE_SOCKS} -L ${HTTP_PORT}:127.0.0.1:${REMOTE_HTTP} -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST}" | |
| echo | |
| # Simple connection test | |
| echo -e "${BLUE}Testing proxy via environment...${NC}" | |
| curl ifconfig.me | |
| # Carrier switch diagnostics | |
| echo | |
| echo -e "${YELLOW}🔍 Carrier Switch Diagnostics:${NC}" | |
| echo -e "${BLUE}Testing direct connection (no proxy):${NC}" | |
| env -i curl -s --max-time 5 http://ifconfig.me || echo "Direct connection failed" | |
| echo -e "${BLUE}Testing SSH connection to Termux:${NC}" | |
| ssh -o ConnectTimeout=3 -p ${TERMUX_PORT} ${TERMUX_USER}@${TERMUX_HOST} "echo 'SSH OK'" || echo "SSH connection failed" | |
| echo -e "${BLUE}Checking tunnel processes:${NC}" | |
| ps aux | grep -E "ssh.*${TERMUX_HOST}" | grep -v grep || echo "No SSH tunnels found" | |
| # Additional diagnostics | |
| echo -e "${BLUE}Testing tunnel ports...${NC}" | |
| if ! nc -z 127.0.0.1 $SOCKS_PORT; then | |
| echo -e "${RED}✗ SOCKS tunnel port $SOCKS_PORT unreachable${NC}" | |
| else | |
| echo -e "${GREEN}✓ SOCKS tunnel port reachable${NC}" | |
| fi | |
| if ! nc -z 127.0.0.1 $HTTP_PORT; then | |
| echo -e "${RED}✗ HTTP tunnel port $HTTP_PORT unreachable${NC}" | |
| else | |
| echo -e "${GREEN}✓ HTTP tunnel port reachable${NC}" | |
| fi | |
| # Test explicit proxy connections | |
| echo -e "${BLUE}Testing SOCKS5 explicit proxy...${NC}" | |
| socks_result=$(timeout 10 curl -s --proxy "socks5h://127.0.0.1:$SOCKS_PORT" http://ifconfig.me 2>&1) | |
| if [[ $? -eq 0 && -n "$socks_result" ]]; then | |
| echo -e "${GREEN}✅ SOCKS5 test successful${NC}" | |
| echo -e "${GREEN}📍 External IP via SOCKS5: ${YELLOW}$socks_result${NC}" | |
| else | |
| echo -e "${YELLOW}❌ SOCKS5 failed: $socks_result${NC}" | |
| fi | |
| echo -e "${BLUE}Testing HTTP explicit proxy...${NC}" | |
| http_result=$(timeout 10 curl -s --proxy "http://127.0.0.1:$HTTP_PORT" http://ifconfig.me 2>&1) | |
| if [[ $? -eq 0 && -n "$http_result" ]]; then | |
| echo -e "${GREEN}✅ HTTP test successful${NC}" | |
| echo -e "${GREEN}📍 External IP via HTTP: ${YELLOW}$http_result${NC}" | |
| else | |
| echo -e "${YELLOW}❌ HTTP failed: $http_result${NC}" | |
| fi | |
| } | |
| setup_manual_client() { | |
| local proxy_addr="$1" | |
| echo -e "${GREEN}Setting up manual proxy client...${NC}" | |
| echo -e "Proxy: ${YELLOW}$proxy_addr${NC}" | |
| export http_proxy="http://$proxy_addr" | |
| export https_proxy="http://$proxy_addr" | |
| export HTTP_PROXY="http://$proxy_addr" | |
| export HTTPS_PROXY="http://$proxy_addr" | |
| echo -e "${GREEN}✅ Environment configured${NC}" | |
| echo -e "${YELLOW}Test with: curl http://ifconfig.me${NC}" | |
| } | |
| # Configure npm and git to use proxy | |
| set_proxy() { | |
| local http_proxy_url="http://127.0.0.1:${HTTP_PORT}" | |
| echo -e "${GREEN}Setting proxy configuration for npm and git...${NC}" | |
| # Configure npm | |
| if command -v npm >/dev/null 2>&1; then | |
| npm config set proxy "$http_proxy_url" && echo -e "${GREEN}✓ npm proxy set${NC}" || echo -e "${RED}✗ npm proxy failed${NC}" | |
| npm config set https-proxy "$http_proxy_url" && echo -e "${GREEN}✓ npm https-proxy set${NC}" || echo -e "${RED}✗ npm https-proxy failed${NC}" | |
| else | |
| echo -e "${YELLOW}⚠ npm not found${NC}" | |
| fi | |
| # Configure git | |
| if command -v git >/dev/null 2>&1; then | |
| git config --global http.proxy "$http_proxy_url" && echo -e "${GREEN}✓ git http.proxy set${NC}" || echo -e "${RED}✗ git http.proxy failed${NC}" | |
| git config --global https.proxy "$http_proxy_url" && echo -e "${GREEN}✓ git https.proxy set${NC}" || echo -e "${RED}✗ git https.proxy failed${NC}" | |
| else | |
| echo -e "${YELLOW}⚠ git not found${NC}" | |
| fi | |
| echo -e "${GREEN}✅ Proxy configuration complete${NC}" | |
| } | |
| # Remove proxy configuration from npm and git | |
| unset_proxy() { | |
| echo -e "${GREEN}Removing proxy configuration from npm and git...${NC}" | |
| # Remove npm proxy | |
| if command -v npm >/dev/null 2>&1; then | |
| npm config delete proxy 2>/dev/null && echo -e "${GREEN}✓ npm proxy removed${NC}" || echo -e "${BLUE}✓ npm proxy not set${NC}" | |
| npm config delete https-proxy 2>/dev/null && echo -e "${GREEN}✓ npm https-proxy removed${NC}" || echo -e "${BLUE}✓ npm https-proxy not set${NC}" | |
| fi | |
| # Remove git proxy | |
| if command -v git >/dev/null 2>&1; then | |
| git config --global --unset http.proxy 2>/dev/null && echo -e "${GREEN}✓ git http.proxy removed${NC}" || echo -e "${BLUE}✓ git http.proxy not set${NC}" | |
| git config --global --unset https.proxy 2>/dev/null && echo -e "${GREEN}✓ git https.proxy removed${NC}" || echo -e "${BLUE}✓ git https.proxy not set${NC}" | |
| fi | |
| echo -e "${GREEN}✅ Proxy configuration removed${NC}" | |
| } | |
| # Stop all proxies and tunnels | |
| stop_all() { | |
| echo -e "${YELLOW}🛑 Stopping all proxy services...${NC}" | |
| local platform=$(detect_platform) | |
| # Kill proxy processes | |
| pkill -f "tinyproxy|microsocks|3proxy" 2>/dev/null && echo -e "${GREEN}✓ Proxy processes stopped${NC}" || echo -e "${BLUE}✓ No proxy processes running${NC}" | |
| # Kill SSH tunnels (Mac) | |
| if [[ "$platform" == "macos" ]]; then | |
| pkill -f "ssh.*${TERMUX_HOST:-}.*${TERMUX_PORT:-}" 2>/dev/null && echo -e "${GREEN}✓ SSH tunnels stopped${NC}" || echo -e "${BLUE}✓ No SSH tunnels running${NC}" | |
| # Disable system proxy | |
| networksetup -setwebproxystate "$WIFI_SERVICE" off 2>/dev/null || true | |
| networksetup -setsecurewebproxystate "$WIFI_SERVICE" off 2>/dev/null || true | |
| networksetup -setsocksfirewallproxystate "$WIFI_SERVICE" off 2>/dev/null || true | |
| echo -e "${GREEN}✓ System proxy disabled${NC}" | |
| fi | |
| # Clean up config files | |
| rm -f "$SCRIPT_DIR"/tinyproxy-*.conf | |
| rm -f "$HOME"/.3proxy.inline.* 2>/dev/null || true | |
| # Remove proxy configuration | |
| unset_proxy | |
| echo -e "${GREEN}✅ All services stopped${NC}" | |
| } | |
| # Status check | |
| show_status() { | |
| print_banner | |
| local platform=$(detect_platform) | |
| echo -e "${YELLOW}Platform: ${BLUE}$platform${NC}" | |
| echo -e "${YELLOW}Local IP: ${BLUE}$(get_local_ip)${NC}" | |
| echo -e "${YELLOW}Script Dir: ${BLUE}$SCRIPT_DIR${NC}" | |
| echo | |
| echo -e "${YELLOW}Available Tools:${NC}" | |
| command -v tinyproxy >/dev/null 2>&1 && echo -e " ${GREEN}✓ tinyproxy${NC}" || echo -e " ${RED}✗ tinyproxy${NC}" | |
| command -v microsocks >/dev/null 2>&1 && echo -e " ${GREEN}✓ microsocks${NC}" || echo -e " ${RED}✗ microsocks${NC}" | |
| [[ -f "$HOME/3proxy-src/bin/3proxy" ]] && echo -e " ${GREEN}✓ 3proxy${NC}" || echo -e " ${RED}✗ 3proxy${NC}" | |
| echo | |
| echo -e "${YELLOW}Active Processes:${NC}" | |
| if pgrep -f "tinyproxy|microsocks|3proxy" >/dev/null 2>&1; then | |
| ps aux | grep -E "(tinyproxy|microsocks|3proxy)" | grep -v grep | |
| else | |
| echo -e " ${BLUE}No proxy processes running${NC}" | |
| fi | |
| if [[ "$platform" == "macos" ]]; then | |
| echo | |
| echo -e "${YELLOW}SSH Tunnels:${NC}" | |
| if pgrep -f "ssh.*${TERMUX_HOST:-}.*${TERMUX_PORT:-}" >/dev/null 2>&1; then | |
| ps aux | grep -E "ssh.*${TERMUX_HOST:-}.*${TERMUX_PORT:-}" | grep -v grep | |
| else | |
| echo -e " ${BLUE}No SSH tunnels active${NC}" | |
| fi | |
| fi | |
| } | |
| show_help() { | |
| print_banner | |
| echo -e "${YELLOW}Usage:${NC}" | |
| echo " $0 server - Start 3proxy server (Termux only)" | |
| echo " $0 http [port] - Start HTTP proxy server" | |
| echo " $0 socks [port] - Start SOCKS5 proxy server" | |
| echo " $0 client auto - Connect to Termux 3proxy (Mac)" | |
| echo " $0 client <host:port> - Connect through manual proxy" | |
| echo " $0 set_proxy - Configure npm and git proxy settings" | |
| echo " $0 unset_proxy - Remove npm and git proxy settings" | |
| echo " $0 status - Show current status" | |
| echo " $0 stop - Stop all proxies and tunnels" | |
| echo | |
| echo -e "${YELLOW}Examples:${NC}" | |
| echo " # On Termux phone:" | |
| echo " $0 server - Start 3proxy with rmnet interfaces" | |
| echo | |
| echo " # On Mac:" | |
| echo " $0 client auto - Auto-connect to Termux (uses gateway IP)" | |
| echo " export TERMUX_HOST=\$GATEWAY_IP" | |
| echo " $0 client auto - Override auto-detection" | |
| echo | |
| echo " # Manual proxy:" | |
| echo " $0 client \$PROXY_HOST:3128 - Use specific proxy" | |
| } | |
| # Parse debug flags | |
| while [[ $# -gt 0 ]]; do | |
| case $1 in | |
| --debug|-d) | |
| DEBUG=1 | |
| shift | |
| ;; | |
| --verbose|-v) | |
| VERBOSE=1 | |
| shift | |
| ;; | |
| *) | |
| break | |
| ;; | |
| esac | |
| done | |
| # Main execution | |
| case "${1:-help}" in | |
| "server"|"3proxy") | |
| print_banner | |
| start_3proxy_server | |
| ;; | |
| "http") | |
| print_banner | |
| start_simple_server "http" "$2" | |
| ;; | |
| "socks"|"socks5") | |
| print_banner | |
| start_simple_server "socks" "$2" | |
| ;; | |
| "client") | |
| print_banner | |
| start_client "$2" | |
| ;; | |
| "status"|"config") | |
| show_status | |
| ;; | |
| "stop"|"kill") | |
| stop_all | |
| ;; | |
| "set_proxy") | |
| print_banner | |
| set_proxy | |
| ;; | |
| "unset_proxy") | |
| print_banner | |
| unset_proxy | |
| ;; | |
| "help"|"--help"|"-h"|*) | |
| show_help | |
| ;; | |
| esac |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment