内网穿透技术详解 – FRP 实战指南




内网穿透.md




内网穿透技术详解 – FRP 实战指南

一站式 FRP 内网穿透部署指南,从零开始搭建属于你的内网穿透服务

目录


什么是内网穿透?

基本概念

内网穿透(Intranet Penetration)是一种网络技术,它允许外网用户访问位于内网(局域网)中的服务或设备。

为什么需要内网穿透?

在日常开发和运维中,我们经常遇到以下场景:

  • 家庭场景:在公司想访问家里的 NAS 存储、树莓派等设备
  • 开发场景:需要让客户或团队成员访问本地开发环境
  • 运维场景:需要远程管理没有公网 IP 的服务器
  • 游戏场景:搭建私人游戏服务器供朋友联机

问题的本质

传统困境: 外网用户 → [公网] → [NAT路由器] → 无法直接访问内网设备 内网穿透解决方案: 外网用户 → [公网服务器(中转)] → [内网设备主动连接] → 成功访问

FRP 工作原理

FRP(Fast Reverse Proxy)是一个高性能的反向代理应用,专注于内网穿透。

核心组件

  1. frps(服务端):部署在有公网 IP 的服务器上,负责接收和转发流量
  2. frpc(客户端):部署在内网机器上,主动连接 frps 并暴露本地服务

工作流程图

uml diagram

通俗理解

可以把 FRP 想象成一个"快递中转站":

  • 公网服务器(frps):就像快递中转站,有固定地址,谁都能找到
  • 内网机器(frpc):就像你家,主动去中转站"租了个柜子"
  • 外网用户:想给你寄东西的人,只需要把快递寄到中转站
  • 数据传输:中转站会自动把快递放到你租的柜子里,你随时可以取

详细配置说明

服务端配置(frps)

关键配置:

部署在公网服务器(如阿里云)上,配置文件 frps.toml

# 服务端监听配置 bindAddr = "0.0.0.0" # 监听所有网卡 bindPort = 7000 # frpc 客户端连接的端口 # 认证配置 - 安全第一! auth.method = "token" auth.token = "your_secure_token_123456" # ⚠️ 务必修改为复杂密码 # Web 管理面板配置 webServer.addr = "0.0.0.0" webServer.port = 7500 # 访问 http://服务器IP:7500 查看状态 webServer.user = "admin" webServer.password = "your_dashboard_password" # ⚠️ 务必修改 # 端口白名单(可选,建议配置) allowPorts = [ { start = 6000, end = 60000 } # 只允许客户端使用 6000-60000 端口 ] # 日志配置 log.to = "./frps.log" log.level = "info" log.maxDays = 3

配置项说明

配置项 说明 建议
bindPort frpc 连接端口 默认 7000,需在防火墙开放
auth.token 认证密钥 必须设置强密码,客户端需一致
webServer.port 管理面板端口 可通过浏览器查看连接状态
allowPorts 允许的端口范围 限制端口范围,提高安全性

启动服务端

方式1:前台运行(测试用)

./frps -c frps.toml

方式2:后台运行

nohup ./frps -c frps.toml > frps.log 2>&1 &

方式3:systemd 管理(推荐生产环境)

创建服务文件:

sudo vim /etc/systemd/system/frps.service

配置内容:

[Unit] Description=Frp Server Service - Fast Reverse Proxy for Intranet Penetration Documentation=https://gofrp.org/ After=network-online.target syslog.target Wants=network-online.target [Service] Type=simple # 修改为你的 frps 实际路径 ExecStart=/root/frp_0.65.0_linux_amd64/frps -c /root/frp_0.65.0_linux_amd64/frps.toml # 工作目录(与 ExecStart 路径保持一致) WorkingDirectory=/root/frp_0.65.0_linux_amd64 # 以 root 用户运行(如需其他用户,修改此项) User=root Group=root # 自动重启配置 Restart=on-failure RestartSec=10s # 启动超时时间 TimeoutStartSec=30s # 标准输出和错误输出到日志 StandardOutput=journal StandardError=journal # 进程限制(可选) LimitNOFILE=65536 [Install] WantedBy=multi-user.target

启动并设置开机自启:

# 重新加载 systemd 配置 sudo systemctl daemon-reload # 启动服务 sudo systemctl start frps # 设置开机自启动 sudo systemctl enable frps # 查看服务状态 sudo systemctl status frps # 查看实时日志 sudo journalctl -u frps -f # 其他常用命令 sudo systemctl stop frps # 停止服务 sudo systemctl restart frps # 重启服务 sudo systemctl disable frps # 取消开机自启

客户端配置(frpc)

部署在内网机器上,配置文件 frpc.toml

# 服务端连接配置 serverAddr = "8.146.198.118" # 公网服务器 IP serverPort = 7000 # 与 frps 的 bindPort 一致 # 认证配置(必须与服务端一致) auth.method = "token" auth.token = "your_secure_token_123456" # ============ 代理配置示例 ============ # 示例1:暴露 SSH 服务(远程登录内网机器) [[proxies]] name = "ssh" # 代理名称,自定义 type = "tcp" # 协议类型:tcp/udp/http/https localIP = "127.0.0.1" # 本地服务地址 localPort = 22 # 本地 SSH 端口 remotePort = 6000 # 公网服务器映射端口 # 可选:启用加密和压缩 transport.useEncryption = true transport.useCompression = true # 示例2:暴露 Web 服务(HTTP) [[proxies]] name = "web" type = "http" localIP = "127.0.0.1" localPort = 8080 # 本地 Web 服务端口 customDomains = ["dev.example.com"] # 自定义域名(需 DNS 解析到公网服务器) # 可选:HTTP 基础认证 httpUser = "admin" httpPassword = "admin123" # 示例3:暴露数据库服务(如 MySQL) [[proxies]] name = "mysql" type = "tcp" localIP = "127.0.0.1" localPort = 3306 remotePort = 6001

代理类型说明

uml diagram

访问方式对比

代理类型 访问方式 示例
TCP 公网IP:远程端口 ssh root@8.146.198.118 -p 6000
HTTP http://域名 http://dev.example.com
HTTPS https://域名 https://dev.example.com

启动客户端

方式1:前台运行(测试用)

./frpc -c frpc.toml

方式2:后台运行

nohup ./frpc -c frpc.toml > frpc.log 2>&1 &

方式3:systemd 管理(推荐)

创建服务文件:

sudo vim /etc/systemd/system/frpc.service

配置内容:

[Unit] Description=Frp Client Service - Fast Reverse Proxy Client Documentation=https://gofrp.org/ After=network-online.target Wants=network-online.target [Service] Type=simple # 修改为你的 frpc 实际路径 ExecStart=/root/frp_0.65.0_linux_amd64/frpc -c /root/frp_0.65.0_linux_amd64/frpc.toml # 工作目录 WorkingDirectory=/root/frp_0.65.0_linux_amd64 # 运行用户 User=root Group=root # 自动重启配置(重要:确保内网穿透持续可用) Restart=always RestartSec=10s # 启动超时 TimeoutStartSec=30s # 日志输出 StandardOutput=journal StandardError=journal # 进程限制 LimitNOFILE=65536 [Install] WantedBy=multi-user.target

启动并设置开机自启:

# 重新加载配置 sudo systemctl daemon-reload # 启动客户端 sudo systemctl start frpc # 设置开机自启动(重要!) sudo systemctl enable frpc # 查看运行状态 sudo systemctl status frpc # 查看实时日志 sudo journalctl -u frpc -f # 其他管理命令 sudo systemctl stop frpc # 停止 sudo systemctl restart frpc # 重启 sudo systemctl disable frpc # 取消自启

� Systemd 服务配置详解

配置项说明

配置项 说明 推荐值
After=network-online.target 等待网络完全就绪后启动 必须配置
Wants=network-online.target 依赖网络服务 必须配置
Restart=always/on-failure 自动重启策略 客户端用 always,服务端用 on-failure
RestartSec=10s 重启间隔时间 10-30秒
TimeoutStartSec=30s 启动超时时间 30秒
StandardOutput=journal 日志输出到 systemd journal 推荐
LimitNOFILE=65536 最大文件描述符数 高并发场景必须设置

服务端与客户端配置差异

uml diagram

快速部署脚本

服务端一键部署脚本

创建部署脚本 frps-install.sh

#!/bin/bash # frps-install.sh - FRP 服务端一键部署脚本 # 使用方法:sudo bash frps-install.sh set -e # 遇到错误立即退出 # ============ 配置区域(可修改) ============ FRP_VERSION="0.65.0" INSTALL_DIR="/usr/local/frp" AUTH_TOKEN="" # 留空则自动生成 WEB_USER="admin" WEB_PASSWORD="" # 留空则自动生成 BIND_PORT=7000 WEB_PORT=7500 ALLOW_PORT_START=6000 ALLOW_PORT_END=60000 # ============ 颜色输出 ============ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # No Color echo_info() { echo -e "${GREEN}[INFO]${NC} $1"; } echo_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } echo_error() { echo -e "${RED}[ERROR]${NC} $1"; } # ============ 检查权限 ============ if [[ $EUID -ne 0 ]]; then echo_error "此脚本需要 root 权限运行" echo "请使用: sudo bash $0" exit 1 fi # ============ 生成随机密码 ============ generate_password() { openssl rand -base64 32 | tr -d "=+/" | cut -c1-25 } # 如果未设置密码,自动生成 if [ -z "$AUTH_TOKEN" ]; then AUTH_TOKEN=$(generate_password) echo_info "已自动生成认证 Token: $AUTH_TOKEN" fi if [ -z "$WEB_PASSWORD" ]; then WEB_PASSWORD=$(generate_password) echo_info "已自动生成 Web 密码: $WEB_PASSWORD" fi # ============ 检查并安装依赖 ============ echo_info "检查系统依赖..." if ! command -v wget &> /dev/null; then echo_warn "wget 未安装,正在安装..." apt-get update && apt-get install -y wget || yum install -y wget fi # ============ 下载 FRP ============ echo_info "开始下载 FRP v${FRP_VERSION}..." cd /tmp DOWNLOAD_URL="https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz" if [ -f "frp_${FRP_VERSION}_linux_amd64.tar.gz" ]; then echo_warn "安装包已存在,跳过下载" else wget -O frp_${FRP_VERSION}_linux_amd64.tar.gz "$DOWNLOAD_URL" || { echo_error "下载失败,请检查网络或版本号" exit 1 } fi # ============ 解压并安装 ============ echo_info "解压安装包..." tar -xzf frp_${FRP_VERSION}_linux_amd64.tar.gz # 备份旧版本 if [ -d "$INSTALL_DIR" ]; then echo_warn "检测到旧版本,备份到 ${INSTALL_DIR}.bak" mv "$INSTALL_DIR" "${INSTALL_DIR}.bak.$(date +%Y%m%d_%H%M%S)" fi mv frp_${FRP_VERSION}_linux_amd64 "$INSTALL_DIR" echo_info "安装到: $INSTALL_DIR" # ============ 创建配置文件 ============ echo_info "生成配置文件..." cat > ${INSTALL_DIR}/frps.toml <<EOF # FRP 服务端配置文件 # 生成时间: $(date '+%Y-%m-%d %H:%M:%S') # 服务端监听配置 bindAddr = "0.0.0.0" bindPort = ${BIND_PORT} # 认证配置 auth.method = "token" auth.token = "${AUTH_TOKEN}" # Web 管理面板 webServer.addr = "0.0.0.0" webServer.port = ${WEB_PORT} webServer.user = "${WEB_USER}" webServer.password = "${WEB_PASSWORD}" # 端口白名单 allowPorts = [ { start = ${ALLOW_PORT_START}, end = ${ALLOW_PORT_END} } ] # 日志配置 log.to = "${INSTALL_DIR}/frps.log" log.level = "info" log.maxDays = 7 EOF # ============ 创建 systemd 服务 ============ echo_info "创建 systemd 服务..." cat > /etc/systemd/system/frps.service <<EOF [Unit] Description=Frp Server Service - Fast Reverse Proxy for Intranet Penetration Documentation=https://gofrp.org/ After=network-online.target syslog.target Wants=network-online.target [Service] Type=simple ExecStart=${INSTALL_DIR}/frps -c ${INSTALL_DIR}/frps.toml WorkingDirectory=${INSTALL_DIR} User=root Group=root Restart=on-failure RestartSec=10s TimeoutStartSec=30s StandardOutput=journal StandardError=journal LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF # ============ 配置防火墙 ============ echo_info "配置防火墙规则..." if command -v ufw &> /dev/null; then ufw allow ${BIND_PORT}/tcp comment 'FRP Server' ufw allow ${WEB_PORT}/tcp comment 'FRP Web Panel' ufw allow ${ALLOW_PORT_START}:${ALLOW_PORT_END}/tcp comment 'FRP Proxy Ports' echo_info "UFW 防火墙规则已添加" elif command -v firewall-cmd &> /dev/null; then firewall-cmd --permanent --add-port=${BIND_PORT}/tcp firewall-cmd --permanent --add-port=${WEB_PORT}/tcp firewall-cmd --permanent --add-port=${ALLOW_PORT_START}-${ALLOW_PORT_END}/tcp firewall-cmd --reload echo_info "Firewalld 防火墙规则已添加" else echo_warn "未检测到防火墙,请手动开放端口: ${BIND_PORT}, ${WEB_PORT}, ${ALLOW_PORT_START}-${ALLOW_PORT_END}" fi # ============ 启动服务 ============ echo_info "启动 FRP 服务..." systemctl daemon-reload systemctl enable frps systemctl start frps # ============ 检查服务状态 ============ sleep 2 if systemctl is-active --quiet frps; then echo_info "✅ FRP 服务端安装成功并已启动!" else echo_error "❌ 服务启动失败,请查看日志: journalctl -u frps -n 50" exit 1 fi # ============ 输出配置信息 ============ SERVER_IP=$(curl -s ifconfig.me || echo "获取失败") echo "" echo "==========================================" echo -e "${GREEN}🎉 FRP 服务端部署完成!${NC}" echo "==========================================" echo "" echo "📁 安装目录: $INSTALL_DIR" echo "📝 配置文件: ${INSTALL_DIR}/frps.toml" echo "📊 日志文件: ${INSTALL_DIR}/frps.log" echo "" echo "🔐 认证信息(请妥善保管):" echo " Token: $AUTH_TOKEN" echo "" echo "🌐 Web 管理面板:" echo " 地址: http://${SERVER_IP}:${WEB_PORT}" echo " 用户: $WEB_USER" echo " 密码: $WEB_PASSWORD" echo "" echo "🔧 常用命令:" echo " 查看状态: systemctl status frps" echo " 查看日志: journalctl -u frps -f" echo " 重启服务: systemctl restart frps" echo " 停止服务: systemctl stop frps" echo " 修改配置: vim ${INSTALL_DIR}/frps.toml" echo "" echo "⚠️ 重要提示:" echo " 1. 请将 Token 配置到客户端" echo " 2. 建议修改 Web 管理面板密码" echo " 3. 确保云服务器安全组已开放相关端口" echo "==========================================" # 保存配置信息到文件 cat > ${INSTALL_DIR}/install_info.txt <<EOF FRP 服务端安装信息 安装时间: $(date '+%Y-%m-%d %H:%M:%S') 服务器IP: ${SERVER_IP} 认证Token: ${AUTH_TOKEN} Web用户: ${WEB_USER} Web密码: ${WEB_PASSWORD} Web地址: http://${SERVER_IP}:${WEB_PORT} EOF chmod 600 ${INSTALL_DIR}/install_info.txt echo_info "配置信息已保存到: ${INSTALL_DIR}/install_info.txt"

客户端一键部署脚本

创建部署脚本 frpc-install.sh

#!/bin/bash # frpc-install.sh - FRP 客户端一键部署脚本 # 使用方法:sudo bash frpc-install.sh set -e # 遇到错误立即退出 # ============ 配置区域(必须修改) ============ SERVER_IP="" # 公网服务器 IP(必填) AUTH_TOKEN="" # 服务端的认证 Token(必填) FRP_VERSION="0.65.0" INSTALL_DIR="/usr/local/frp" SERVER_PORT=7000 # ============ 颜色输出 ============ RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' echo_info() { echo -e "${GREEN}[INFO]${NC} $1"; } echo_warn() { echo -e "${YELLOW}[WARN]${NC} $1"; } echo_error() { echo -e "${RED}[ERROR]${NC} $1"; } echo_step() { echo -e "${BLUE}[STEP]${NC} $1"; } # ============ 检查权限 ============ if [[ $EUID -ne 0 ]]; then echo_error "此脚本需要 root 权限运行" echo "请使用: sudo bash $0" exit 1 fi # ============ 交互式配置 ============ echo "==========================================" echo "FRP 客户端一键部署脚本" echo "==========================================" echo "" if [ -z "$SERVER_IP" ]; then read -p "请输入服务端 IP 地址: " SERVER_IP if [ -z "$SERVER_IP" ]; then echo_error "服务端 IP 不能为空" exit 1 fi fi if [ -z "$AUTH_TOKEN" ]; then read -p "请输入服务端的认证 Token: " AUTH_TOKEN if [ -z "$AUTH_TOKEN" ]; then echo_error "认证 Token 不能为空" exit 1 fi fi echo "" echo_info "配置信息确认:" echo " 服务端 IP: $SERVER_IP" echo " 服务端端口: $SERVER_PORT" echo " 认证 Token: ${AUTH_TOKEN:0:10}..." echo "" read -p "确认继续安装? (y/N): " confirm if [[ ! $confirm =~ ^[Yy]$ ]]; then echo "安装已取消" exit 0 fi # ============ 检查依赖 ============ echo_step "检查系统依赖..." if ! command -v wget &> /dev/null; then echo_warn "wget 未安装,正在安装..." apt-get update && apt-get install -y wget || yum install -y wget fi # ============ 下载 FRP ============ echo_step "下载 FRP v${FRP_VERSION}..." cd /tmp DOWNLOAD_URL="https://github.com/fatedier/frp/releases/download/v${FRP_VERSION}/frp_${FRP_VERSION}_linux_amd64.tar.gz" if [ -f "frp_${FRP_VERSION}_linux_amd64.tar.gz" ]; then echo_warn "安装包已存在,跳过下载" else wget -O frp_${FRP_VERSION}_linux_amd64.tar.gz "$DOWNLOAD_URL" || { echo_error "下载失败,尝试使用国内镜像..." # 可以添加国内镜像地址 exit 1 } fi # ============ 解压安装 ============ echo_step "解压安装包..." tar -xzf frp_${FRP_VERSION}_linux_amd64.tar.gz # 备份旧版本 if [ -d "$INSTALL_DIR" ]; then echo_warn "检测到旧版本,备份到 ${INSTALL_DIR}.bak" systemctl stop frpc 2>/dev/null || true mv "$INSTALL_DIR" "${INSTALL_DIR}.bak.$(date +%Y%m%d_%H%M%S)" fi mv frp_${FRP_VERSION}_linux_amd64 "$INSTALL_DIR" echo_info "安装到: $INSTALL_DIR" # ============ 配置代理服务 ============ echo_step "配置代理服务..." echo "" echo "请选择要配置的代理类型:" echo " 1) SSH (端口 22)" echo " 2) Web 服务 (HTTP)" echo " 3) 自定义配置" read -p "请选择 (1-3): " proxy_type case $proxy_type in 1) read -p "请输入远程端口 (默认 6000): " remote_port remote_port=${remote_port:-6000} cat > ${INSTALL_DIR}/frpc.toml <<EOF # FRP 客户端配置文件 # 生成时间: $(date '+%Y-%m-%d %H:%M:%S') serverAddr = "${SERVER_IP}" serverPort = ${SERVER_PORT} auth.method = "token" auth.token = "${AUTH_TOKEN}" # SSH 代理 [[proxies]] name = "ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = ${remote_port} transport.useEncryption = true transport.useCompression = true EOF echo_info "已配置 SSH 代理,远程端口: ${remote_port}" ;; 2) read -p "请输入本地 Web 端口 (默认 8080): " local_port local_port=${local_port:-8080} read -p "请输入自定义域名 (如 dev.example.com): " custom_domain cat > ${INSTALL_DIR}/frpc.toml <<EOF # FRP 客户端配置文件 serverAddr = "${SERVER_IP}" serverPort = ${SERVER_PORT} auth.method = "token" auth.token = "${AUTH_TOKEN}" # Web 服务代理 [[proxies]] name = "web" type = "http" localIP = "127.0.0.1" localPort = ${local_port} customDomains = ["${custom_domain}"] EOF echo_info "已配置 Web 代理,本地端口: ${local_port}, 域名: ${custom_domain}" ;; 3) cat > ${INSTALL_DIR}/frpc.toml <<EOF # FRP 客户端配置文件 serverAddr = "${SERVER_IP}" serverPort = ${SERVER_PORT} auth.method = "token" auth.token = "${AUTH_TOKEN}" # 请手动添加代理配置 # [[proxies]] # name = "your-service" # type = "tcp" # localIP = "127.0.0.1" # localPort = 22 # remotePort = 6000 EOF echo_warn "已创建基础配置,请手动编辑: ${INSTALL_DIR}/frpc.toml" ;; *) echo_error "无效选择" exit 1 ;; esac # ============ 创建 systemd 服务 ============ echo_step "创建 systemd 服务..." cat > /etc/systemd/system/frpc.service <<EOF [Unit] Description=Frp Client Service - Fast Reverse Proxy Client Documentation=https://gofrp.org/ After=network-online.target Wants=network-online.target [Service] Type=simple ExecStart=${INSTALL_DIR}/frpc -c ${INSTALL_DIR}/frpc.toml WorkingDirectory=${INSTALL_DIR} User=root Group=root Restart=always RestartSec=10s TimeoutStartSec=30s StandardOutput=journal StandardError=journal LimitNOFILE=65536 [Install] WantedBy=multi-user.target EOF # ============ 启动服务 ============ echo_step "启动 FRP 客户端..." systemctl daemon-reload systemctl enable frpc systemctl start frpc # ============ 检查服务状态 ============ sleep 2 if systemctl is-active --quiet frpc; then echo_info "✅ FRP 客户端安装成功并已启动!" else echo_error "❌ 服务启动失败,请查看日志: journalctl -u frpc -n 50" exit 1 fi # ============ 输出配置信息 ============ LOCAL_IP=$(hostname -I | awk '{print $1}') echo "" echo "==========================================" echo -e "${GREEN}🎉 FRP 客户端部署完成!${NC}" echo "==========================================" echo "" echo "📁 安装目录: $INSTALL_DIR" echo "📝 配置文件: ${INSTALL_DIR}/frpc.toml" echo "�️ 本机 IP: $LOCAL_IP" echo "🌐 服务端: ${SERVER_IP}:${SERVER_PORT}" echo "" echo "🔧 常用命令:" echo " 查看状态: systemctl status frpc" echo " 查看日志: journalctl -u frpc -f" echo " 重启服务: systemctl restart frpc" echo " 停止服务: systemctl stop frpc" echo " 修改配置: vim ${INSTALL_DIR}/frpc.toml" echo "" echo "⚠️ 重要提示:" echo " 1. 修改配置后需重启服务: systemctl restart frpc" echo " 2. 查看连接状态: journalctl -u frpc -f" echo " 3. 确保服务端已正确配置并运行" echo "==========================================" # 保存配置信息 cat > ${INSTALL_DIR}/install_info.txt <<EOF FRP 客户端安装信息 安装时间: $(date '+%Y-%m-%d %H:%M:%S') 本机IP: ${LOCAL_IP} 服务端: ${SERVER_IP}:${SERVER_PORT} 配置文件: ${INSTALL_DIR}/frpc.toml EOF chmod 600 ${INSTALL_DIR}/install_info.txt echo_info "配置信息已保存到: ${INSTALL_DIR}/install_info.txt"

快速部署使用指南

方式一:直接执行(推荐)

服务端部署

# 下载并执行脚本 curl -fsSL https://raw.githubusercontent.com/your-repo/frp-scripts/main/frps-install.sh | sudo bash # 或者分步执行 wget https://raw.githubusercontent.com/your-repo/frp-scripts/main/frps-install.sh chmod +x frps-install.sh sudo bash frps-install.sh

客户端部署

# 下载并执行(会提示输入服务端信息) wget https://raw.githubusercontent.com/your-repo/frp-scripts/main/frpc-install.sh chmod +x frpc-install.sh sudo bash frpc-install.sh

方式二:本地创建脚本

1. 创建服务端脚本

# 将上面的服务端脚本内容保存为 frps-install.sh vim frps-install.sh # 粘贴脚本内容,保存退出 # 添加执行权限 chmod +x frps-install.sh # 执行安装 sudo bash frps-install.sh

2. 创建客户端脚本

# 将客户端脚本内容保存为 frpc-install.sh vim frpc-install.sh # 粘贴脚本内容,保存退出 # 执行安装(交互式配置) chmod +x frpc-install.sh sudo bash frpc-install.sh

部署流程图

uml diagram

部署后操作

服务端

# 查看自动生成的配置信息 cat /usr/local/frp/install_info.txt # 输出示例: # FRP 服务端安装信息 # 安装时间: 2025-12-07 13:30:00 # 服务器IP: 8.146.198.118 # 认证Token: Xy9mK2pL8nQ5rT3vW6yZ1 # Web用户: admin # Web密码: aB3dE5fG7hJ9kL2mN4pQ6 # Web地址: http://8.146.198.118:7500 # 访问 Web 管理面板 # 浏览器打开: http://8.146.198.118:7500 # 使用上面的用户名和密码登录 # 查看服务状态 systemctl status frps # 实时查看日志 journalctl -u frps -f

客户端

# 查看配置信息 cat /usr/local/frp/install_info.txt # 查看服务状态 systemctl status frpc # 查看连接日志 journalctl -u frpc -f # 如果需要修改配置 vim /usr/local/frp/frpc.toml systemctl restart frpc

常见部署场景

场景1:快速搭建 SSH 远程访问

# 服务端(公网服务器) sudo bash frps-install.sh # 记录输出的 Token # 客户端(内网机器) sudo bash frpc-install.sh # 输入服务端 IP: 8.146.198.118 # 输入 Token: [刚才记录的 Token] # 选择: 1 (SSH) # 输入远程端口: 6000 # 测试连接 ssh root@8.146.198.118 -p 6000

场景2:暴露本地 Web 服务

# 客户端执行 sudo bash frpc-install.sh # 输入服务端信息 # 选择: 2 (Web 服务) # 输入本地端口: 3000 # 输入域名: dev.example.com # 配置 DNS # 将 dev.example.com 的 A 记录指向服务端 IP # 访问测试 curl http://dev.example.com

脚本特性说明

特性 服务端脚本 客户端脚本
自动生成密码 ✅ Token 和 Web 密码 ❌ 需手动输入
交互式配置 ❌ 全自动 ✅ 引导式配置
防火墙配置 ✅ 自动配置 ❌ 无需配置
备份旧版本 ✅ 自动备份 ✅ 自动备份
服务状态检查 ✅ 自动检查 ✅ 自动检查
配置信息保存 ✅ install_info.txt ✅ install_info.txt
错误处理 ✅ 完善 ✅ 完善

故障排查

如果部署失败,按以下步骤检查:

# 1. 检查脚本执行日志 # 脚本会输出详细的错误信息 # 2. 检查服务状态 systemctl status frps # 或 frpc journalctl -u frps -n 50 # 查看最近 50 行日志 # 3. 检查网络连通性 # 服务端 netstat -tlnp | grep 7000 # 检查端口监听 # 客户端 telnet 8.146.198.118 7000 # 测试连接 # 4. 检查防火墙 # 服务端 ufw status # 或 firewall-cmd --list-all # 5. 手动启动测试 cd /usr/local/frp ./frps -c frps.toml # 或 ./frpc -c frpc.toml # 查看错误输出

�🚀 实战案例

案例1:远程 SSH 登录内网服务器

场景:在公司需要登录家里的 Linux 服务器

配置

# frpc.toml [[proxies]] name = "home-ssh" type = "tcp" localIP = "127.0.0.1" localPort = 22 remotePort = 6000

使用

# 在任何地方通过公网服务器访问 ssh root@8.146.198.118 -p 6000

案例2:展示本地开发的 Web 项目

场景:需要让客户预览本地开发的网站

配置

# frpc.toml [[proxies]] name = "dev-web" type = "http" localIP = "127.0.0.1" localPort = 3000 # 本地开发服务器端口 customDomains = ["demo.yourdomain.com"]

使用

  • 客户访问:http://demo.yourdomain.com
  • 自动转发到你的本地 localhost:3000

案例3:远程访问内网数据库

场景:在外网需要连接公司内网的 MySQL 数据库

配置

# frpc.toml [[proxies]] name = "company-mysql" type = "tcp" localIP = "192.168.1.100" # 内网数据库服务器 IP localPort = 3306 remotePort = 6001 transport.useEncryption = true # 启用加密

使用

# 使用 MySQL 客户端连接 mysql -h 8.146.198.118 -P 6001 -u root -p

🔒 安全建议

1. 认证安全

# ✅ 推荐:使用强密码 auth.token = "Xy9$mK2#pL8@nQ5&rT3!" # ❌ 避免:简单密码 auth.token = "123456"

2. 端口限制

# 限制可用端口范围 allowPorts = [ { start = 6000, end = 6100 } # 只开放 100 个端口 ]

3. 传输加密

# 对敏感服务启用加密 transport.useEncryption = true transport.useCompression = true

4. HTTP 认证

# Web 服务添加基础认证 httpUser = "admin" httpPassword = "complex_password_here"

5. 防火墙配置

# 服务端只开放必要端口 sudo ufw allow 7000/tcp # frp 服务端口 sudo ufw allow 7500/tcp # Web 管理面板 sudo ufw allow 6000:6100/tcp # 代理端口范围

🛠️ 故障排查

常见问题

1. 客户端连接失败

uml diagram

检查步骤

# 1. 检查服务端是否运行 ps aux | grep frps # 2. 检查端口监听 netstat -tlnp | grep 7000 # 3. 查看日志 tail -f frps.log tail -f frpc.log # 4. 测试网络连通性 telnet 8.146.198.118 7000

2. 无法访问内网服务

问题 可能原因 解决方案
连接超时 本地服务未启动 检查本地服务状态
连接被拒绝 端口配置错误 核对 localPort 和 remotePort
域名无法访问 DNS 未解析 检查域名 A 记录指向

3. 性能优化

# 启用连接池 transport.poolCount = 5 # 启用压缩(适合文本传输) transport.useCompression = true # 心跳设置 transport.heartbeatInterval = 30 transport.heartbeatTimeout = 90

📊 监控与管理

Web 管理面板

访问 http://8.146.198.118:7500,可以查看:

  • ✅ 在线客户端列表
  • ✅ 代理连接状态
  • ✅ 流量统计
  • ✅ 实时日志

命令行监控

# 查看连接数 netstat -an | grep 7000 | wc -l # 实时日志 tail -f frps.log | grep -E "error|warn" # 查看进程状态 systemctl status frps

🎓 总结

FRP 的优势

  • 简单易用:配置简洁,上手快
  • 性能优秀:基于 Go 语言,高并发支持
  • 功能丰富:支持 TCP/UDP/HTTP/HTTPS 多种协议
  • 安全可靠:支持加密传输和认证
  • 开源免费:活跃的社区支持

适用场景

场景 推荐指数 说明
个人开发测试 ⭐⭐⭐⭐⭐ 完美适配
小团队协作 ⭐⭐⭐⭐ 性价比高
远程运维 ⭐⭐⭐⭐⭐ 安全便捷
生产环境 ⭐⭐⭐ 需配合其他安全措施

下一步

  1. 📥 下载 FRP:https://github.com/fatedier/frp/releases
  2. 📖 官方文档:https://gofrp.org/
  3. 🔧 根据实际需求调整配置
  4. 🛡️ 做好安全防护措施

提示:本文档基于 FRP v0.65.0 版本编写,不同版本配置可能略有差异。


© 版权声明
THE END
喜欢就支持一下吧
点赞11 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容