Termux与 frp 实现内网穿透
Contents
Termux与 frp 实现内网穿透
第一步:在 VPS 上安装和配置 FRP 服务端
1. 在 VPS 上安装 FRP 服务端
# SSH 连接到你的 VPS
ssh root@your-vps-ip
# 下载 FRP 最新版本
cd /opt
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -xzf frp_0.52.3_linux_amd64.tar.gz
cd frp_0.52.3_linux_amd64
# 复制服务端文件
cp frps /usr/local/bin/
mkdir -p /etc/frp
2. 创建 VPS 服务端配置文件
nano /etc/frp/frps.toml
# FRP 服务端配置
[common]
bind_port = 7000
bind_addr = "0.0.0.0"
token = "your_secure_token_here_123456"
# 管理后台
[webServer]
addr = "0.0.0.0"
port = 7500
user = "admin"
password = "admin123"
# 日志配置
[log]
to = "/var/log/frps.log"
level = "info"
max_days = 3
# 允许端口范围
allow_ports = "2000-3000,3001,3003,4000-50000"
# 心跳配置
heartbeat_timeout = 90
3. 创建系统服务
nano /etc/systemd/system/frps.service
[Unit]
Description=Frp Server Service
After=network.target
[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/local/bin/frps -c /etc/frp/frps.toml
ExecReload=/bin/kill -s HUP $MAINPID
KillMode=mixed
TimeoutStopSec=5s
[Install]
WantedBy=multi-user.target
4. 启动并设置开机自启
# 重载系统服务
systemctl daemon-reload
# 启动服务
systemctl start frps
# 设置开机自启
systemctl enable frps
# 查看状态
systemctl status frps
5. 配置防火墙(如果有)
# UFW 防火墙
ufw allow 7000
ufw allow 7500
ufw allow 2222 # SSH 穿透端口
# iptables 防火墙
iptables -A INPUT -p tcp --dport 7000 -j ACCEPT
iptables -A INPUT -p tcp --dport 7500 -j ACCEPT
iptables -A INPUT -p tcp --dport 2222 -j ACCEPT
# 保存规则(CentOS/RHEL)
service iptables save
第二步:在 Termux 中安装和配置 FRP 客户端
1. 安装 FRP 客户端
# 更新 Termux
pkg update
# 下载 FRP ARM64 版本
cd ~/downloads || mkdir ~/downloads && cd ~/downloads
wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_arm64.tar.gz
# 解压安装
tar -xzf frp_0.52.3_linux_arm64.tar.gz
cd frp_0.52.3_linux_arm64
cp frpc $PREFIX/bin/
# 验证安装
frpc --version
2. 创建客户端配置文件
mkdir -p $PREFIX/etc/frp
nano $PREFIX/etc/frp/frpc.toml
配置内容:
# FRP 客户端配置
[common]
server_addr = "YOUR_VPS_IP"
server_port = 7000
token = "your_secure_token_here_123456"
# 用户标识
user = "termux_user"
# 管理后台
admin_addr = "127.0.0.1"
admin_port = 7400
admin_user = "admin"
admin_pwd = "admin123"
# 日志配置
[log]
to = "/data/data/com.termux/files/home/frpc.log"
level = "info"
max_days = 3
# 心跳配置
heartbeat_interval = 30
heartbeat_timeout = 90
# 连接池
pool_count = 1
# TCP 多路复用
tcp_mux = true
# SSH 服务代理配置
[[proxies]]
name = "ssh"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 8022
remote_port = 2222
use_encryption = true
use_compression = true
重要: 将 YOUR_VPS_IP
替换为你的 VPS 实际 IP 地址,token
必须与服务端配置一致。
3. 启动 Termux 中的 SSH 服务
# 安装 OpenSSH
pkg install openssh
# 设置密码(如果还没有)
passwd
# 启动 SSH 服务(默认运行在 8022 端口)
sshd
# 验证 SSH 服务运行
ps aux | grep sshd
netstat -tuln | grep 8022
4. 启动 FRP 客户端
# 前台启动(调试用)
frpc -c $PREFIX/etc/frp/frpc.toml
# 后台启动
nohup frpc -c $PREFIX/etc/frp/frpc.toml > ~/frpc.log 2>&1 &
第三步:创建管理脚本
nano ~/frp-ssh.sh
#!/data/data/com.termux/files/usr/bin/bash
# FRP SSH 穿透管理脚本
VPS_IP="YOUR_VPS_IP" # 替换为你的 VPS IP
SSH_PORT=2222 # VPS 上的 SSH 穿透端口
FRPC_CONFIG="$PREFIX/etc/frp/frpc.toml"
FRPC_LOG="$HOME/frpc.log"
FRPC_PID="$HOME/frpc.pid"
# 颜色定义
RED='\033[0;31m'
GREEN='\033[0;32m'
YELLOW='\033[1;33m'
BLUE='\033[0;34m'
NC='\033[0m'
log_info() { echo -e "${GREEN}[INFO]${NC} $1"; }
log_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; }
log_error() { echo -e "${RED}[ERROR]${NC} $1"; }
# 检查 FRP 客户端是否运行
is_frpc_running() {
if [[ -f "$FRPC_PID" ]]; then
local pid=$(cat "$FRPC_PID")
if kill -0 "$pid" 2>/dev/null; then
return 0
else
rm -f "$FRPC_PID"
fi
fi
return 1
}
# 检查 SSH 服务是否运行
is_sshd_running() {
pgrep -f "sshd" >/dev/null
}
# 启动 SSH 服务
start_sshd() {
if is_sshd_running; then
log_info "SSH 服务已运行"
else
log_info "启动 SSH 服务..."
sshd
sleep 2
if is_sshd_running; then
log_info "SSH 服务启动成功"
else
log_error "SSH 服务启动失败"
return 1
fi
fi
}
# 启动 FRP 客户端
start_frpc() {
if [[ ! -f "$FRPC_CONFIG" ]]; then
log_error "配置文件不存在: $FRPC_CONFIG"
log_info "请运行 '$0 config' 创建配置文件"
return 1
fi
if is_frpc_running; then
log_warn "FRP 客户端已运行"
return 1
fi
log_info "启动 FRP 客户端..."
# 验证配置文件
if ! frpc verify -c "$FRPC_CONFIG" >/dev/null 2>&1; then
log_error "配置文件验证失败"
frpc verify -c "$FRPC_CONFIG"
return 1
fi
# 启动客户端
nohup frpc -c "$FRPC_CONFIG" > "$FRPC_LOG" 2>&1 &
local pid=$!
echo $pid > "$FRPC_PID"
# 等待启动
sleep 3
if is_frpc_running; then
log_info "FRP 客户端启动成功 (PID: $pid)"
log_info "SSH 穿透地址: $VPS_IP:$SSH_PORT"
else
log_error "FRP 客户端启动失败"
log_error "查看日志: tail -f $FRPC_LOG"
return 1
fi
}
# 停止服务
stop_services() {
# 停止 FRP 客户端
if is_frpc_running; then
local pid=$(cat "$FRPC_PID")
log_info "停止 FRP 客户端 (PID: $pid)..."
kill "$pid"
rm -f "$FRPC_PID"
log_info "FRP 客户端已停止"
else
log_warn "FRP 客户端未运行"
fi
# 停止 SSH 服务
if is_sshd_running; then
log_info "停止 SSH 服务..."
pkill -f "sshd"
log_info "SSH 服务已停止"
else
log_warn "SSH 服务未运行"
fi
}
# 重启服务
restart_services() {
log_info "重启 SSH 穿透服务..."
stop_services
sleep 2
start_all
}
# 启动所有服务
start_all() {
start_sshd
if [[ $? -eq 0 ]]; then
start_frpc
fi
}
# 显示状态
show_status() {
echo -e "${BLUE}=== SSH 穿透服务状态 ===${NC}"
# SSH 服务状态
if is_sshd_running; then
echo -e "${GREEN}✓${NC} SSH 服务: 运行中"
echo " 本地端口: 8022"
else
echo -e "${RED}✗${NC} SSH 服务: 未运行"
fi
# FRP 客户端状态
if is_frpc_running; then
local pid=$(cat "$FRPC_PID")
echo -e "${GREEN}✓${NC} FRP 客户端: 运行中 (PID: $pid)"
echo " 穿透地址: $VPS_IP:$SSH_PORT"
echo " 管理界面: http://127.0.0.1:7400"
else
echo -e "${RED}✗${NC} FRP 客户端: 未运行"
fi
echo ""
echo -e "${BLUE}=== 连接信息 ===${NC}"
echo "外网 SSH 连接命令:"
echo " ssh -p $SSH_PORT $(whoami)@$VPS_IP"
echo ""
echo "本地连接测试:"
echo " ssh -p 8022 $(whoami)@127.0.0.1"
}
# 测试连接
test_connection() {
log_info "测试本地 SSH 连接..."
if nc -z 127.0.0.1 8022; then
log_info "本地 SSH 服务正常"
else
log_error "本地 SSH 服务不可达"
return 1
fi
log_info "测试 VPS 连接..."
if nc -z "$VPS_IP" 7000; then
log_info "VPS FRP 服务正常"
else
log_error "无法连接到 VPS FRP 服务"
return 1
fi
log_info "测试穿透端口..."
if nc -z "$VPS_IP" "$SSH_PORT"; then
log_info "SSH 穿透端口正常"
log_info "可以使用以下命令连接:"
echo " ssh -p $SSH_PORT $(whoami)@$VPS_IP"
else
log_error "SSH 穿透端口不可达"
return 1
fi
}
# 显示日志
show_logs() {
local lines=${1:-50}
if [[ -f "$FRPC_LOG" ]]; then
echo -e "${BLUE}=== FRP 客户端日志 (最后 $lines 行) ===${NC}"
tail -n "$lines" "$FRPC_LOG"
else
log_warn "日志文件不存在: $FRPC_LOG"
fi
}
# 实时监控日志
monitor_logs() {
if [[ -f "$FRPC_LOG" ]]; then
echo -e "${BLUE}=== 实时监控 FRP 日志 (Ctrl+C 退出) ===${NC}"
tail -f "$FRPC_LOG"
else
log_warn "日志文件不存在: $FRPC_LOG"
fi
}
# 生成配置文件
generate_config() {
if [[ -f "$FRPC_CONFIG" ]]; then
log_warn "配置文件已存在: $FRPC_CONFIG"
read -p "是否覆盖? (y/N): " -r
[[ ! $REPLY =~ ^[Yy]$ ]] && return 1
fi
# 获取用户输入
echo -e "${YELLOW}请输入配置信息:${NC}"
read -p "VPS IP 地址: " vps_ip
read -p "认证令牌 (与服务端一致): " token
read -p "SSH 穿透端口 (默认 2222): " ssh_port
ssh_port=${ssh_port:-2222}
# 创建配置目录
mkdir -p "$(dirname "$FRPC_CONFIG")"
# 生成配置文件
cat > "$FRPC_CONFIG" << EOF
# FRP 客户端配置
[common]
server_addr = "$vps_ip"
server_port = 7000
token = "$token"
user = "termux_user"
admin_addr = "127.0.0.1"
admin_port = 7400
admin_user = "admin"
admin_pwd = "admin123"
[log]
to = "$FRPC_LOG"
level = "info"
max_days = 3
heartbeat_interval = 30
heartbeat_timeout = 90
pool_count = 1
tcp_mux = true
# SSH 服务代理
[[proxies]]
name = "ssh"
type = "tcp"
local_ip = "127.0.0.1"
local_port = 8022
remote_port = $ssh_port
use_encryption = true
use_compression = true
EOF
# 更新脚本变量
sed -i "s/YOUR_VPS_IP/$vps_ip/g" "$0"
sed -i "s/SSH_PORT=2222/SSH_PORT=$ssh_port/g" "$0"
log_info "配置文件已创建: $FRPC_CONFIG"
log_info "VPS 地址: $vps_ip"
log_info "SSH 端口: $ssh_port"
}
# 自动重连监控
auto_reconnect() {
local interval=${1:-30}
local max_retries=${2:-10}
local retry_count=0
log_info "启动自动重连监控 (间隔: ${interval}秒)"
while true; do
if ! is_frpc_running || ! is_sshd_running; then
retry_count=$((retry_count + 1))
log_warn "服务异常,尝试重启 (第 $retry_count 次)"
if [[ $retry_count -le $max_retries ]]; then
restart_services
sleep 10
else
log_error "达到最大重试次数,停止监控"
break
fi
else
retry_count=0
fi
sleep "$interval"
done
}
# 开机自启脚本
setup_autostart() {
local boot_script="$HOME/.termux/boot/frp-ssh"
mkdir -p "$(dirname "$boot_script")"
cat > "$boot_script" << EOF
#!/data/data/com.termux/files/usr/bin/bash
# 等待网络就绪
sleep 15
# 获取唤醒锁
termux-wake-lock
# 启动 SSH 穿透服务
$0 start
# 启动自动重连监控
nohup $0 auto > /dev/null 2>&1 &
EOF
chmod +x "$boot_script"
log_info "开机自启动已配置: $boot_script"
}
# 主函数
main() {
case "$1" in
start)
start_all
;;
stop)
stop_services
;;
restart)
restart_services
;;
status)
show_status
;;
test)
test_connection
;;
logs)
show_logs "$2"
;;
monitor)
monitor_logs
;;
config)
generate_config
;;
auto)
auto_reconnect "$2" "$3"
;;
setup)
setup_autostart
;;
*)
echo -e "${BLUE}FRP SSH 穿透管理工具${NC}"
echo ""
echo "用法: $0 <命令> [选项]"
echo ""
echo -e "${YELLOW}命令:${NC}"
echo " start 启动 SSH 穿透服务"
echo " stop 停止所有服务"
echo " restart 重启服务"
echo " status 查看服务状态"
echo " test 测试连接"
echo " logs [lines] 查看日志"
echo " monitor 实时监控日志"
echo " config 生成配置文件"
echo " auto [interval] 自动重连监控"
echo " setup 设置开机自启"
echo ""
echo -e "${YELLOW}示例:${NC}"
echo " $0 config # 首次使用,生成配置"
echo " $0 start # 启动服务"
echo " $0 status # 查看状态"
echo " $0 test # 测试连接"
echo " $0 auto 30 # 30秒检查间隔自动重连"
echo " $0 setup # 设置开机自启"
;;
esac
}
# 执行主函数
main "$@"
第四步:配置和启动服务
1. 生成配置文件
# 运行配置向导
~/frp-ssh.sh config
# 按提示输入:
# VPS IP 地址: 你的VPS IP
# 认证令牌: your_secure_token_here_123456 (与服务端一致)
# SSH 穿透端口: 2222 (默认)
2. 启动服务
# 启动 SSH 穿透服务
~/frp-ssh.sh start
# 查看状态
~/frp-ssh.sh status
# 测试连接
~/frp-ssh.sh test
3. 从外网连接测试
# 从外网连接 (替换为你的实际 VPS IP 和用户名)
ssh -p 2222 your_termux_username@your_vps_ip
# 查看 Termux 用户名
whoami
第五步:设置开机自启和监控
1. 设置开机自启
# 安装 Termux:Boot (从 F-Droid)
# 然后运行:
~/frp-ssh.sh setup
2. 启动自动重连监控
# 30秒检查一次,最多重试10次
~/frp-ssh.sh auto 30 10 &
# 后台运行
nohup ~/frp-ssh.sh auto 30 10 > ~/frp-auto.log 2>&1 &
故障排除
1. 常见问题检查
# 查看 Termux 服务状态
~/frp-ssh.sh status
# 查看详细日志
~/frp-ssh.sh logs 100
# 实时监控日志
~/frp-ssh.sh monitor
# 测试各个环节的连接
~/frp-ssh.sh test
2. VPS 服务端检查
# 在 VPS 上检查服务状态
systemctl status frps
# 查看服务端日志
tail -f /var/log/frps.log
# 检查端口监听
netstat -tuln | grep -E ':(7000|7500|2222)'
# 重启服务端
systemctl restart frps
3. 网络连通性检查
# 在 Termux 中测试到 VPS 的连接
ping your_vps_ip
nc -zv your_vps_ip 7000
# 在外网测试穿透端口
nc -zv your_vps_ip 2222
安全建议
1. 修改默认端口和密码
# 修改 SSH 端口和加强认证
nano ~/.ssh/authorized_keys
# 设置强密码
passwd
# 禁用密码登录,只使用密钥认证(可选)
2. 配置防火墙规则
# 在 VPS 上只开放必要端口
ufw --force reset
ufw default deny incoming
ufw default allow outgoing
ufw allow ssh
ufw allow 7000 # FRP 控制端口
ufw allow 2222 # SSH 穿透端口
ufw --force enable
3. 监控访问日志
# 监控 SSH 连接
tail -f /var/log/auth.log | grep ssh
# 监控 FRP 连接
~/frp-ssh.sh monitor