Upload files to "/"
This commit is contained in:
parent
980e39a218
commit
a8041d3491
|
|
@ -0,0 +1,314 @@
|
||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# TikTok 流量分流脚本
|
||||||
|
# 在台湾 VPS 上运行,让 TikTok 流量走美国 VPS
|
||||||
|
# 原理: SSH 动态隧道(SOCKS5) + redsocks + iptables 分流
|
||||||
|
# 适用: Debian / Ubuntu | 认证方式: 密码
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
set -e
|
||||||
|
|
||||||
|
RED="\033[31m"
|
||||||
|
GREEN="\033[32m"
|
||||||
|
YELLOW="\033[33m"
|
||||||
|
CYAN="\033[36m"
|
||||||
|
BOLD="\033[1m"
|
||||||
|
NC="\033[0m"
|
||||||
|
|
||||||
|
# ============================================================
|
||||||
|
# ⚙️ 请修改以下配置
|
||||||
|
# ============================================================
|
||||||
|
US_VPS_IP="142.171.202.195" # 美国 VPS IP
|
||||||
|
US_VPS_PORT="22" # 美国 VPS SSH 端口
|
||||||
|
US_VPS_USER="root" # 美国 VPS 用户名
|
||||||
|
US_VPS_PASS="2miijAPMZB" # 美国 VPS 密码 ← 改这里
|
||||||
|
SOCKS5_PORT="7891" # 本地 SOCKS5 监听端口
|
||||||
|
# ============================================================
|
||||||
|
|
||||||
|
TIKTOK_DOMAINS=(
|
||||||
|
"tiktok.com"
|
||||||
|
"www.tiktok.com"
|
||||||
|
"m.tiktok.com"
|
||||||
|
"live.tiktok.com"
|
||||||
|
"api.tiktok.com"
|
||||||
|
"tiktokv.com"
|
||||||
|
"ttwstatic.com"
|
||||||
|
"tiktokcdn.com"
|
||||||
|
"tiktokcdn-us.com"
|
||||||
|
"bytedance.com"
|
||||||
|
"ibytedtos.com"
|
||||||
|
"muscdn.com"
|
||||||
|
"musical.ly"
|
||||||
|
)
|
||||||
|
|
||||||
|
IPSET_NAME="tiktok_ips"
|
||||||
|
REDSOCKS_CONF="/etc/redsocks.conf"
|
||||||
|
|
||||||
|
log_info() { echo -e "${GREEN}[✓]${NC} $1"; }
|
||||||
|
log_warn() { echo -e "${YELLOW}[!]${NC} $1"; }
|
||||||
|
log_error() { echo -e "${RED}[✗]${NC} $1"; exit 1; }
|
||||||
|
log_title() { echo -e "\n${CYAN}${BOLD}─── $1 ───────────────────────────────────${NC}"; }
|
||||||
|
|
||||||
|
check_root() {
|
||||||
|
[ "$EUID" -ne 0 ] && log_error "请使用 root 权限运行此脚本"
|
||||||
|
}
|
||||||
|
|
||||||
|
install_deps() {
|
||||||
|
log_title "安装依赖"
|
||||||
|
apt-get update -qq
|
||||||
|
apt-get install -y redsocks ipset iptables dnsutils curl sshpass -qq
|
||||||
|
log_info "依赖安装完成(含 sshpass)"
|
||||||
|
}
|
||||||
|
|
||||||
|
test_ssh() {
|
||||||
|
log_title "测试 SSH 连接"
|
||||||
|
if sshpass -p "$US_VPS_PASS" ssh \
|
||||||
|
-o StrictHostKeyChecking=no \
|
||||||
|
-o ConnectTimeout=10 \
|
||||||
|
-p "$US_VPS_PORT" \
|
||||||
|
"${US_VPS_USER}@${US_VPS_IP}" "echo ok" &>/dev/null; then
|
||||||
|
log_info "SSH 连接美国 VPS 成功"
|
||||||
|
else
|
||||||
|
log_error "SSH 连接失败,请检查 IP / 用户名 / 密码是否正确"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_redsocks() {
|
||||||
|
log_title "配置 redsocks"
|
||||||
|
cat > "$REDSOCKS_CONF" << EOF
|
||||||
|
base {
|
||||||
|
log_debug = off;
|
||||||
|
log_info = on;
|
||||||
|
log = "syslog:daemon";
|
||||||
|
daemon = on;
|
||||||
|
redirector = iptables;
|
||||||
|
}
|
||||||
|
|
||||||
|
redsocks {
|
||||||
|
local_ip = 127.0.0.1;
|
||||||
|
local_port = 12345;
|
||||||
|
ip = 127.0.0.1;
|
||||||
|
port = ${SOCKS5_PORT};
|
||||||
|
type = socks5;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
log_info "redsocks 配置完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
create_tunnel_service() {
|
||||||
|
log_title "创建 SSH 隧道 systemd 服务"
|
||||||
|
|
||||||
|
# 把密码存到只有 root 可读的文件,避免 ps 命令暴露
|
||||||
|
echo "$US_VPS_PASS" > /etc/tiktok_tunnel.pass
|
||||||
|
chmod 600 /etc/tiktok_tunnel.pass
|
||||||
|
|
||||||
|
cat > /etc/systemd/system/tiktok-tunnel.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=TikTok SSH Tunnel to US VPS
|
||||||
|
After=network-online.target
|
||||||
|
Wants=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
User=root
|
||||||
|
Environment=SSHPASS_FILE=/etc/tiktok_tunnel.pass
|
||||||
|
ExecStart=/bin/bash -c 'sshpass -f /etc/tiktok_tunnel.pass ssh \
|
||||||
|
-N \
|
||||||
|
-D 127.0.0.1:${SOCKS5_PORT} \
|
||||||
|
-o StrictHostKeyChecking=no \
|
||||||
|
-o ServerAliveInterval=30 \
|
||||||
|
-o ServerAliveCountMax=3 \
|
||||||
|
-o ExitOnForwardFailure=yes \
|
||||||
|
-o ConnectTimeout=15 \
|
||||||
|
-p ${US_VPS_PORT} \
|
||||||
|
${US_VPS_USER}@${US_VPS_IP}'
|
||||||
|
Restart=always
|
||||||
|
RestartSec=5
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable tiktok-tunnel
|
||||||
|
systemctl restart tiktok-tunnel
|
||||||
|
sleep 3
|
||||||
|
|
||||||
|
if systemctl is-active --quiet tiktok-tunnel; then
|
||||||
|
log_info "SSH 隧道服务启动成功(SOCKS5 127.0.0.1:${SOCKS5_PORT})"
|
||||||
|
else
|
||||||
|
log_error "SSH 隧道启动失败,请运行: journalctl -u tiktok-tunnel -n 30"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
resolve_tiktok_ips() {
|
||||||
|
log_title "解析 TikTok IP 并写入 ipset"
|
||||||
|
ipset destroy "$IPSET_NAME" 2>/dev/null || true
|
||||||
|
ipset create "$IPSET_NAME" hash:ip timeout 86400
|
||||||
|
|
||||||
|
local total=0
|
||||||
|
for domain in "${TIKTOK_DOMAINS[@]}"; do
|
||||||
|
local ips
|
||||||
|
ips=$(dig +short "$domain" A 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+$')
|
||||||
|
for ip in $ips; do
|
||||||
|
ipset add "$IPSET_NAME" "$ip" 2>/dev/null || true
|
||||||
|
((total++)) || true
|
||||||
|
done
|
||||||
|
done
|
||||||
|
log_info "共解析 ${total} 条 TikTok IP"
|
||||||
|
}
|
||||||
|
|
||||||
|
setup_iptables() {
|
||||||
|
log_title "配置 iptables 透明代理规则"
|
||||||
|
|
||||||
|
# 清理旧规则
|
||||||
|
iptables -t nat -D OUTPUT -m set --match-set "$IPSET_NAME" dst -p tcp -j REDIRECT --to-port 12345 2>/dev/null || true
|
||||||
|
iptables -t nat -D PREROUTING -m set --match-set "$IPSET_NAME" dst -p tcp -j REDIRECT --to-port 12345 2>/dev/null || true
|
||||||
|
|
||||||
|
# 本机发出的流量
|
||||||
|
iptables -t nat -A OUTPUT \
|
||||||
|
-m set --match-set "$IPSET_NAME" dst \
|
||||||
|
-p tcp -j REDIRECT --to-port 12345
|
||||||
|
|
||||||
|
# 经过本机转发的流量(如作为网关)
|
||||||
|
iptables -t nat -A PREROUTING \
|
||||||
|
-m set --match-set "$IPSET_NAME" dst \
|
||||||
|
-p tcp -j REDIRECT --to-port 12345
|
||||||
|
|
||||||
|
log_info "iptables 规则设置完成"
|
||||||
|
}
|
||||||
|
|
||||||
|
start_redsocks() {
|
||||||
|
log_title "启动 redsocks"
|
||||||
|
pkill redsocks 2>/dev/null || true
|
||||||
|
sleep 1
|
||||||
|
redsocks -c "$REDSOCKS_CONF"
|
||||||
|
sleep 1
|
||||||
|
if pgrep -x redsocks > /dev/null; then
|
||||||
|
log_info "redsocks 启动成功(监听 127.0.0.1:12345)"
|
||||||
|
else
|
||||||
|
log_error "redsocks 启动失败"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
save_and_persist() {
|
||||||
|
log_title "保存规则并设置开机自启"
|
||||||
|
|
||||||
|
# 保存 ipset
|
||||||
|
ipset save > /etc/ipset.conf
|
||||||
|
|
||||||
|
# 保存 iptables
|
||||||
|
apt-get install -y iptables-persistent -qq 2>/dev/null || true
|
||||||
|
iptables-save > /etc/iptables/rules.v4 2>/dev/null || true
|
||||||
|
|
||||||
|
# ipset 开机恢复
|
||||||
|
cat > /etc/systemd/system/ipset-restore.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Restore ipset on boot
|
||||||
|
Before=network.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
ExecStart=/usr/sbin/ipset restore -f /etc/ipset.conf
|
||||||
|
RemainAfterExit=yes
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable ipset-restore
|
||||||
|
|
||||||
|
# redsocks 开机启动
|
||||||
|
cat > /etc/systemd/system/redsocks-tiktok.service << EOF
|
||||||
|
[Unit]
|
||||||
|
Description=Redsocks for TikTok
|
||||||
|
After=tiktok-tunnel.service ipset-restore.service
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=forking
|
||||||
|
ExecStart=/usr/sbin/redsocks -c /etc/redsocks.conf
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
|
EOF
|
||||||
|
systemctl daemon-reload
|
||||||
|
systemctl enable redsocks-tiktok
|
||||||
|
|
||||||
|
# 每6小时刷新 TikTok IP
|
||||||
|
cat > /usr/local/bin/tiktok_refresh_ips.sh << EOF
|
||||||
|
#!/bin/bash
|
||||||
|
DOMAINS="${TIKTOK_DOMAINS[*]}"
|
||||||
|
for domain in \$DOMAINS; do
|
||||||
|
ips=\$(dig +short "\$domain" A 2>/dev/null | grep -E '^[0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\$')
|
||||||
|
for ip in \$ips; do
|
||||||
|
ipset add "$IPSET_NAME" "\$ip" 2>/dev/null || true
|
||||||
|
done
|
||||||
|
done
|
||||||
|
ipset save > /etc/ipset.conf
|
||||||
|
EOF
|
||||||
|
chmod +x /usr/local/bin/tiktok_refresh_ips.sh
|
||||||
|
echo "0 */6 * * * root /usr/local/bin/tiktok_refresh_ips.sh" > /etc/cron.d/tiktok-refresh
|
||||||
|
|
||||||
|
log_info "开机自启配置完成,每6小时自动刷新 TikTok IP"
|
||||||
|
}
|
||||||
|
|
||||||
|
verify() {
|
||||||
|
log_title "验证 TikTok 访问"
|
||||||
|
echo -n " 正在通过美国 VPS 测试..."
|
||||||
|
|
||||||
|
local result
|
||||||
|
result=$(curl --socks5 127.0.0.1:"$SOCKS5_PORT" \
|
||||||
|
-s --max-time 15 \
|
||||||
|
-A "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36" \
|
||||||
|
-H "Accept-Encoding: gzip" \
|
||||||
|
"https://www.tiktok.com" 2>/dev/null | gunzip 2>/dev/null)
|
||||||
|
|
||||||
|
local region
|
||||||
|
region=$(echo "$result" | grep -o '"region":"[^"]*"' | head -1 | cut -f4 -d'"')
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
if [ -n "$region" ]; then
|
||||||
|
log_info "TikTok 访问成功!Region: ${GREEN}【${region}】${NC}"
|
||||||
|
else
|
||||||
|
log_warn "隧道已建立,但未获取到 region(TikTok 可能识别为 IDC IP,属正常现象)"
|
||||||
|
fi
|
||||||
|
}
|
||||||
|
|
||||||
|
print_summary() {
|
||||||
|
echo ""
|
||||||
|
echo -e "${CYAN}${BOLD}╔══════════════════════════════════════════════════╗${NC}"
|
||||||
|
echo -e "${CYAN}${BOLD}║ 🎉 配置完成! ║${NC}"
|
||||||
|
echo -e "${CYAN}${BOLD}╚══════════════════════════════════════════════════╝${NC}"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${GREEN}隧道路由:${NC} 台湾 VPS → SSH SOCKS5 → 美国 VPS (${US_VPS_IP})"
|
||||||
|
echo -e " ${GREEN}分流策略:${NC} 仅 TikTok 相关 IP 走美国,其他流量不变"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}常用命令:${NC}"
|
||||||
|
echo -e " 查看隧道: systemctl status tiktok-tunnel"
|
||||||
|
echo -e " 重启隧道: systemctl restart tiktok-tunnel"
|
||||||
|
echo -e " 查看日志: journalctl -u tiktok-tunnel -f"
|
||||||
|
echo -e " 刷新IP列表: bash /usr/local/bin/tiktok_refresh_ips.sh"
|
||||||
|
echo -e " 查看IP列表: ipset list $IPSET_NAME"
|
||||||
|
echo ""
|
||||||
|
echo -e " ${YELLOW}卸载方法:${NC}"
|
||||||
|
echo -e " systemctl stop tiktok-tunnel redsocks-tiktok"
|
||||||
|
echo -e " systemctl disable tiktok-tunnel redsocks-tiktok ipset-restore"
|
||||||
|
echo -e " iptables -t nat -F OUTPUT && iptables -t nat -F PREROUTING"
|
||||||
|
echo -e " ipset destroy $IPSET_NAME"
|
||||||
|
echo ""
|
||||||
|
}
|
||||||
|
|
||||||
|
# ── 主流程 ──────────────────────────────────────
|
||||||
|
check_root
|
||||||
|
install_deps
|
||||||
|
test_ssh
|
||||||
|
setup_redsocks
|
||||||
|
create_tunnel_service
|
||||||
|
resolve_tiktok_ips
|
||||||
|
setup_iptables
|
||||||
|
start_redsocks
|
||||||
|
save_and_persist
|
||||||
|
verify
|
||||||
|
print_summary
|
||||||
Loading…
Reference in New Issue