block-proxy 0.1.8 → 0.1.10
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.claude/settings.local.json +11 -0
- package/.claude/skills/commit/skill.md +32 -0
- package/.claude/skills/pcap-analyse/skill.md +100 -0
- package/CLAUDE.md +114 -0
- package/Dockerfile +1 -0
- package/README.md +3 -2
- package/bin/start.js +0 -1
- package/build/index.html +2 -1
- package/build/static/css/main.098e0e65.css +2 -0
- package/build/static/css/main.098e0e65.css.map +1 -0
- package/build/static/js/main.e8a52b27.js +3 -0
- package/build/static/js/main.e8a52b27.js.LICENSE.txt +49 -0
- package/build/static/js/main.e8a52b27.js.map +1 -0
- package/config.json +1 -57
- package/example/rule.js +1 -0
- package/hack-of-anyproxy/lib/requestHandler.js +33 -1
- package/package.json +3 -3
- package/proxy/operator.js +114 -0
- package/proxy/proxy.js +98 -169
- package/proxy/scan.js +49 -3
- package/server/express.js +1 -0
- package/socks5/test_tls_reuse.js +1 -0
- package/src/setupTests.js +1 -0
- package/tools/speed_test.sh +122 -0
- package/tools/tcpdump/output.pcap +0 -0
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
#!/usr/bin/env sh
|
|
2
|
+
|
|
3
|
+
# --- 参数检查 ---
|
|
4
|
+
if [ $# -eq 0 ]; then
|
|
5
|
+
echo "用法: $0 <URL> [TARGET_IP]"
|
|
6
|
+
echo "说明: 若提供 TARGET_IP,则绕过 DNS,直连该 IP 并使用 URL 中的域名作为 SNI/Host"
|
|
7
|
+
echo "示例:"
|
|
8
|
+
echo " $0 https://www.taobao.com"
|
|
9
|
+
echo " $0 https://www.taobao.com 211.100.8.95"
|
|
10
|
+
exit 1
|
|
11
|
+
fi
|
|
12
|
+
|
|
13
|
+
URL="$1"
|
|
14
|
+
TARGET_IP="${2:-}" # 第二个参数可选
|
|
15
|
+
PROXY="socks5://127.0.0.1:1081"
|
|
16
|
+
TUNNEL_PID=""
|
|
17
|
+
SOCAT_LOG="/tmp/socat_error.log"
|
|
18
|
+
|
|
19
|
+
# --- 从 URL 提取主机名(用于 --resolve 和 SNI)---
|
|
20
|
+
# 移除协议头,再截断路径和端口
|
|
21
|
+
HOST=$(echo "$URL" | sed -E 's|^[^:]+://||' | sed -E 's|/.*$||' | sed -E 's/:.*$//')
|
|
22
|
+
PORT="443"
|
|
23
|
+
|
|
24
|
+
cleanup() {
|
|
25
|
+
if [ -n "$TUNNEL_PID" ]; then
|
|
26
|
+
# 检查进程是否存在
|
|
27
|
+
if kill -0 "$TUNNEL_PID" 2>/dev/null; then
|
|
28
|
+
echo "" >&2
|
|
29
|
+
# echo "🛑 正在终止 socat 隧道 (PID: $TUNNEL_PID)..." >&2
|
|
30
|
+
kill "$TUNNEL_PID" 2>/dev/null
|
|
31
|
+
|
|
32
|
+
# 等待最多 1 秒让它优雅退出
|
|
33
|
+
i=0
|
|
34
|
+
while kill -0 "$TUNNEL_PID" 2>/dev/null && [ $i -lt 10 ]; do
|
|
35
|
+
sleep 0.1
|
|
36
|
+
i=$((i + 1))
|
|
37
|
+
done
|
|
38
|
+
|
|
39
|
+
# 如果还在,强制杀死
|
|
40
|
+
if kill -0 "$TUNNEL_PID" 2>/dev/null; then
|
|
41
|
+
echo "⚠️ 强制终止 socat..." >&2
|
|
42
|
+
kill -9 "$TUNNEL_PID" 2>/dev/null
|
|
43
|
+
fi
|
|
44
|
+
|
|
45
|
+
# 清理僵尸进程
|
|
46
|
+
wait "$TUNNEL_PID" 2>/dev/null
|
|
47
|
+
fi
|
|
48
|
+
fi
|
|
49
|
+
rm -f "$SOCAT_LOG"
|
|
50
|
+
exit "${1:-0}"
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
trap cleanup EXIT INT TERM
|
|
54
|
+
|
|
55
|
+
# --- 检查本地端口 1081 是否已被占用 ---
|
|
56
|
+
if command -v ss >/dev/null 2>&1; then
|
|
57
|
+
if ss -tuln 2>/dev/null | grep -q ':1081\b'; then
|
|
58
|
+
echo "⚠️ 警告: 本地端口 1081 已被占用,socat 可能启动失败。"
|
|
59
|
+
fi
|
|
60
|
+
elif command -v netstat >/dev/null 2>&1; then
|
|
61
|
+
if netstat -tuln 2>/dev/null | grep -q ':1081\b'; then
|
|
62
|
+
echo "⚠️ 警告: 本地端口 1081 已被占用,socat 可能启动失败。"
|
|
63
|
+
fi
|
|
64
|
+
fi
|
|
65
|
+
|
|
66
|
+
# --- 启动 socat 隧道,并记录错误 ---
|
|
67
|
+
echo "🔌 正在启动隧道: socat → OPENSSL:yui.cool:8002 ..."
|
|
68
|
+
socat TCP-LISTEN:1081,fork,bind=127.0.0.1 OPENSSL:yui.cool:8002,verify=0 >"$SOCAT_LOG" 2>&1 &
|
|
69
|
+
TUNNEL_PID=$!
|
|
70
|
+
sleep 0.5
|
|
71
|
+
|
|
72
|
+
# --- 检查 socat 是否仍在运行 ---
|
|
73
|
+
if ! kill -0 "$TUNNEL_PID" 2>/dev/null; then
|
|
74
|
+
echo "❌ 隧道启动失败!socat 报错如下:"
|
|
75
|
+
if [ -s "$SOCAT_LOG" ]; then
|
|
76
|
+
cat "$SOCAT_LOG"
|
|
77
|
+
else
|
|
78
|
+
echo "(无详细错误,可能进程立即崩溃)"
|
|
79
|
+
fi
|
|
80
|
+
exit 1
|
|
81
|
+
else
|
|
82
|
+
: > "$SOCAT_LOG" # 清空日志
|
|
83
|
+
fi
|
|
84
|
+
|
|
85
|
+
# --- 构建 curl 命令 ---
|
|
86
|
+
CURL_CMD="curl -k -I --proxy '$PROXY'"
|
|
87
|
+
|
|
88
|
+
if [ -n "$TARGET_IP" ]; then
|
|
89
|
+
CURL_CMD="$CURL_CMD --resolve '$HOST:$PORT:$TARGET_IP'"
|
|
90
|
+
echo "🌐 绕过 DNS: 直连 $TARGET_IP,SNI = $HOST"
|
|
91
|
+
else
|
|
92
|
+
echo "🌐 使用代理解析 DNS(常规模式)"
|
|
93
|
+
fi
|
|
94
|
+
|
|
95
|
+
echo "📡 请求: $URL via $PROXY"
|
|
96
|
+
|
|
97
|
+
# --- 执行 curl 并计时 ---
|
|
98
|
+
FINAL_CMD="$CURL_CMD $URL"
|
|
99
|
+
|
|
100
|
+
echo "$FINAL_CMD"
|
|
101
|
+
|
|
102
|
+
{ time_output=$( { time eval "$FINAL_CMD"; } 2>&1 1>&3 ); } 3>&1
|
|
103
|
+
exit_code=$?
|
|
104
|
+
|
|
105
|
+
# --- 提取状态行 ---
|
|
106
|
+
status_line=$(printf "%s\n" "$time_output" | head -n 1)
|
|
107
|
+
|
|
108
|
+
if [ "$exit_code" -eq 0 ]; then
|
|
109
|
+
echo "✅ 响应状态: $status_line"
|
|
110
|
+
else
|
|
111
|
+
echo "❌ 请求失败(退出码: $exit_code)"
|
|
112
|
+
[ -n "$status_line" ] && echo "⚠️ 部分响应: $status_line"
|
|
113
|
+
fi
|
|
114
|
+
|
|
115
|
+
# --- 显示耗时 ---
|
|
116
|
+
real_time=$(printf "%s\n" "$time_output" | grep "^real" | awk '{print $2}')
|
|
117
|
+
if [ -n "$real_time" ]; then
|
|
118
|
+
echo "⏱️ 耗时: $real_time"
|
|
119
|
+
else
|
|
120
|
+
echo "⚠️ 无法获取耗时(shell 不支持 time 内置命令的格式)"
|
|
121
|
+
fi
|
|
122
|
+
|
|
Binary file
|