This repository has no description
2.8 kB
121 lines
1#!/usr/bin/env bash
2set -euo pipefail
3
4# Default SSH port
5SSH_PORT="${SSH_PORT:-22}"
6
7# Create temporary directory for this tor instance
8TOR_DIR=$(mktemp -d -t tor-ssh-service.XXXXXX)
9trap 'rm -rf "$TOR_DIR"' EXIT
10
11# Generate random ports
12SOCKS_PORT=$((9050 + RANDOM % 1000))
13CONTROL_PORT=$((SOCKS_PORT + 1))
14
15# Create hidden service directory with proper permissions
16mkdir -p "$TOR_DIR/hidden_service"
17chmod 700 "$TOR_DIR/hidden_service"
18
19# Create tor configuration
20cat > "$TOR_DIR/torrc" <<EOF
21DataDirectory $TOR_DIR/data
22SocksPort 127.0.0.1:$SOCKS_PORT
23ControlPort 127.0.0.1:$CONTROL_PORT
24Log notice file $TOR_DIR/tor.log
25RunAsDaemon 0
26
27# Hidden service configuration
28HiddenServiceDir $TOR_DIR/hidden_service
29HiddenServicePort 22 127.0.0.1:$SSH_PORT
30
31# Performance and reliability optimizations
32CircuitBuildTimeout 15
33LearnCircuitBuildTimeout 0
34NumEntryGuards 8
35KeepalivePeriod 60
36SocksTimeout 120
37
38# Reliability settings
39MaxCircuitDirtiness 600
40NewCircuitPeriod 30
41UseEntryGuards 1
42EOF
43
44echo "Starting Tor hidden service for SSH..."
45echo "SSH port: $SSH_PORT"
46echo "SOCKS port: $SOCKS_PORT"
47echo ""
48
49# Start tor in background
50tor -f "$TOR_DIR/torrc" &
51TOR_PID=$!
52
53# Function to cleanup tor process
54cleanup() {
55 if kill -0 "$TOR_PID" 2>/dev/null; then
56 kill "$TOR_PID" 2>/dev/null || true
57 wait "$TOR_PID" 2>/dev/null || true
58 fi
59 rm -rf "$TOR_DIR"
60}
61trap cleanup EXIT INT TERM
62
63# Wait for tor to bootstrap
64echo "Waiting for Tor to bootstrap..."
65for i in {1..300}; do
66 if grep -q "Bootstrapped 100%" "$TOR_DIR/tor.log" 2>/dev/null; then
67 echo "Tor bootstrapped successfully!"
68 break
69 fi
70 if [ "$i" -eq 300 ]; then
71 echo "Error: Tor failed to bootstrap"
72 exit 1
73 fi
74 sleep 0.5
75done
76
77# Wait for hidden service to be created
78echo "Waiting for hidden service..."
79for i in {1..60}; do
80 if [ -f "$TOR_DIR/hidden_service/hostname" ]; then
81 break
82 fi
83 if [ "$i" -eq 60 ]; then
84 echo "Error: Hidden service hostname not created"
85 exit 1
86 fi
87 sleep 1
88done
89
90# Display the onion address
91ONION_ADDRESS=$(cat "$TOR_DIR/hidden_service/hostname")
92echo ""
93echo "==============================================="
94echo "Tor SSH hidden service is running!"
95echo ""
96echo "Onion address: $ONION_ADDRESS"
97echo ""
98
99# Generate QR code for easy copying
100echo "QR Code for the onion address:"
101qrencode -t UTF8 "$ONION_ADDRESS"
102echo ""
103
104echo "To connect from another machine:"
105echo " torify ssh $ONION_ADDRESS"
106echo ""
107echo "Or with a specific user:"
108echo " torify ssh user@$ONION_ADDRESS"
109echo ""
110echo "Press Ctrl+C to stop the service"
111echo "==============================================="
112echo ""
113
114# Keep the service running
115while true; do
116 if ! kill -0 "$TOR_PID" 2>/dev/null; then
117 echo "Tor process died unexpectedly"
118 exit 1
119 fi
120 sleep 5
121done