Skip to content

Instantly share code, notes, and snippets.

@jnorthrup
Last active June 30, 2025 04:08
Show Gist options
  • Select an option

  • Save jnorthrup/381947bc169afbf2f02a19f374722868 to your computer and use it in GitHub Desktop.

Select an option

Save jnorthrup/381947bc169afbf2f02a19f374722868 to your computer and use it in GitHub Desktop.
single-file client/server symmetrical proxy bridge for termux
#!/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