forked from eishare/tuic-hy2-node.js-python
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtuic.sh
More file actions
165 lines (143 loc) · 4.15 KB
/
tuic.sh
File metadata and controls
165 lines (143 loc) · 4.15 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
#!/bin/bash
# =========================================
# TUIC v1.4.5 over QUIC 自动部署脚本(免 root)
# 固定 SNI:www.bing.com,
# =========================================
set -euo pipefail
export LC_ALL=C
IFS=$'\n\t'
MASQ_DOMAIN="www.bing.com"
SERVER_TOML="server.toml"
CERT_PEM="tuic-cert.pem"
KEY_PEM="tuic-key.pem"
LINK_TXT="tuic_link.txt"
TUIC_BIN="./tuic-server"
# ========== 随机端口 ==========
random_port() {
echo $(( (RANDOM % 40000) + 20000 ))
}
# ========== 选择端口 ==========
read_port() {
if [[ $# -ge 1 && -n "${1:-}" ]]; then
TUIC_PORT="$1"
echo "✅ Using specified port: $TUIC_PORT"
return
fi
if [[ -n "${SERVER_PORT:-}" ]]; then
TUIC_PORT="$SERVER_PORT"
echo "✅ Using environment port: $TUIC_PORT"
return
fi
TUIC_PORT=$(random_port)
echo "🎲 Random port selected: $TUIC_PORT"
}
# ========== 检查已有配置 ==========
load_existing_config() {
if [[ -f "$SERVER_TOML" ]]; then
TUIC_PORT=$(grep '^server' "$SERVER_TOML" | grep -Eo '[0-9]+')
TUIC_UUID=$(grep '^\[users\]' -A1 "$SERVER_TOML" | tail -n1 | awk '{print $1}')
TUIC_PASSWORD=$(grep '^\[users\]' -A1 "$SERVER_TOML" | tail -n1 | awk -F'"' '{print $2}')
echo "📂 Existing config detected. Loading..."
return 0
fi
return 1
}
# ========== 生成证书 ==========
generate_cert() {
if [[ -f "$CERT_PEM" && -f "$KEY_PEM" ]]; then
echo "🔐 Certificate exists, skipping."
return
fi
echo "🔐 Generating self-signed certificate for ${MASQ_DOMAIN}..."
openssl req -x509 -newkey ec -pkeyopt ec_paramgen_curve:prime256v1 \
-keyout "$KEY_PEM" -out "$CERT_PEM" -subj "/CN=${MASQ_DOMAIN}" -days 365 -nodes >/dev/null 2>&1
chmod 600 "$KEY_PEM"
chmod 644 "$CERT_PEM"
}
# ========== 下载 tuic-server ==========
check_tuic_server() {
if [[ -x "$TUIC_BIN" ]]; then
echo "✅ tuic-server already exists."
return
fi
echo "📥 Downloading tuic-server..."
curl -L -o "$TUIC_BIN" "https://github.com/Itsusinn/tuic/releases/download/v1.4.5/tuic-server-x86_64-linux"
chmod +x "$TUIC_BIN"
}
# ========== 生成配置 ==========
generate_config() {
cat > "$SERVER_TOML" <<EOF
log_level = "warn"
server = "0.0.0.0:${TUIC_PORT}"
udp_relay_ipv6 = false
zero_rtt_handshake = true
dual_stack = false
auth_timeout = "8s"
task_negotiation_timeout = "4s"
gc_interval = "8s"
gc_lifetime = "8s"
max_external_packet_size = 8192
[users]
${TUIC_UUID} = "${TUIC_PASSWORD}"
[tls]
certificate = "$CERT_PEM"
private_key = "$KEY_PEM"
alpn = ["h3"]
[restful]
addr = "127.0.0.1:${TUIC_PORT}"
secret = "$(openssl rand -hex 16)"
maximum_clients_per_user = 999999999
[quic]
initial_mtu = $((1200 + RANDOM % 200))
min_mtu = 1200
gso = true
pmtu = true
send_window = 33554432
receive_window = 16777216
max_idle_time = "25s"
[quic.congestion_control]
controller = "bbr"
initial_window = 6291456
EOF
}
# ========== 获取公网IP ==========
get_server_ip() {
curl -s --connect-timeout 3 https://api64.ipify.org || echo "127.0.0.1"
}
# ========== 生成TUIC链接 ==========
generate_link() {
local ip="$1"
# 节点输出链接
cat > "$LINK_TXT" <<EOF
tuic://${TUIC_UUID}:${TUIC_PASSWORD}@${ip}:${TUIC_PORT}?congestion_control=bbr&alpn=h3&allowInsecure=1&sni=${MASQ_DOMAIN}&udp_relay_mode=native&disable_sni=0&reduce_rtt=1&max_udp_relay_packet_size=8192#TUIC-${ip}
EOF
echo "🔗 TUIC link generated successfully:"
cat "$LINK_TXT"
}
# ========== 守护进程 ==========
run_background_loop() {
echo "🚀 Starting TUIC server..."
while true; do
"$TUIC_BIN" -c "$SERVER_TOML" >/dev/null 2>&1 || true
echo "⚠️ TUIC crashed. Restarting in 5s..."
sleep 5
done
}
# ========== 主流程 ==========
main() {
if ! load_existing_config; then
read_port "$@"
TUIC_UUID="$(cat /proc/sys/kernel/random/uuid 2>/dev/null || uuidgen)"
TUIC_PASSWORD="$(openssl rand -hex 16)"
generate_cert
check_tuic_server
generate_config
else
generate_cert
check_tuic_server
fi
ip="$(get_server_ip)"
generate_link "$ip"
run_background_loop
}
main "$@"