FRP 内网穿透 – 一键部署

FRP 内网穿透 – 技术文档

版本:v1.0.0
作者:liangshaojie
更新时间:2025-12-07


目录

  1. 系统架构
  2. 工作原理
  3. 脚本设计
  4. 安装流程
  5. 使用方式
  6. 故障排查
  7. 性能优化
  8. 安全建议

系统架构

整体架构

uml diagram

部署架构

uml diagram


工作原理

连接建立流程

uml diagram

认证流程

uml diagram


脚本设计

脚本架构

uml diagram

核心函数说明

函数名 功能 参数 返回值
main() 主函数,命令分发 $1: 命令名 0/1
show_menu() 显示交互式菜单
install_server() 安装服务端 0/1
install_client() 安装客户端 0/1
download_frp() 下载 FRP 程序 $1: 目录 0/1
read_input() 读取用户输入 $1: 提示, $2: 变量名
check_root() 检查 root 权限 $1: 命令名 0/1
update_server_ip() 更新服务端 IP 0/1

安装流程

服务端安装流程

uml diagram

客户端安装流程

uml diagram

下载流程(带重试)

uml diagram


使用方式

1. 快速开始

下载脚本

wget https://raw.githubusercontent.com/liangshaojie/frp/main/frp.sh
chmod +x frp.sh

使用交互式菜单(推荐)

bash frp.sh

会显示如下菜单:

=========================================
   FRP 内网穿透 - 统一管理工具
   版本: 1.0.0
=========================================

请选择操作:

  服务端管理
    1) 安装服务端
    2) 卸载服务端
    3) 查看服务端状态
    4) 重启服务端
    5) 查看服务端日志
    6) 查看服务端配置信息
    7) 更新服务端 IP 地址

  客户端管理
    8) 安装客户端
    9) 卸载客户端
   10) 查看客户端状态
   11) 重启客户端
   12) 查看客户端日志
   13) 编辑客户端配置

  其他
   14) 显示帮助信息
   15) 更新脚本
    0) 退出

请输入选项 [0-15]:

2. 命令行模式

服务端管理

# 安装服务端
sudo bash frp.sh install-server

# 查看状态
bash frp.sh status-server

# 查看日志(实时)
bash frp.sh logs-server

# 查看配置信息
bash frp.sh info-server

# 更新 IP 地址
sudo bash frp.sh update-server-ip

# 重启服务
sudo bash frp.sh restart-server

# 卸载服务端
sudo bash frp.sh uninstall-server

客户端管理

# 安装客户端
sudo bash frp.sh install-client

# 查看状态
bash frp.sh status-client

# 查看日志(实时)
bash frp.sh logs-client

# 编辑配置
sudo bash frp.sh config-client

# 重启服务
sudo bash frp.sh restart-client

# 卸载客户端
sudo bash frp.sh uninstall-client

其他命令

# 显示帮助
bash frp.sh help

# 显示版本
bash frp.sh version

# 更新脚本
bash frp.sh update

3. 典型使用场景

场景 1:SSH 远程登录

目标:从外网 SSH 登录内网机器

步骤

  1. 在公网服务器上安装服务端
sudo bash frp.sh install-server
  1. 记录输出的信息:

    • 服务器 IP: 8.146.198.118
    • Token: abc123xyz
  2. 在内网机器上安装客户端

sudo bash frp.sh install-client
  1. 输入配置:

    • 服务端 IP: 8.146.198.118
    • Token: abc123xyz
    • 选择: 1 (SSH 远程登录)
  2. 从外网连接

ssh root@8.146.198.118 -p 6000

场景 2:Web 服务访问

目标:从外网访问内网 Web 应用

步骤

  1. 安装服务端(同上)

  2. 在内网机器上安装客户端

sudo bash frp.sh install-client
  1. 选择代理类型: 2 (Web 服务)

  2. 从外网访问

http://8.146.198.118:6001

场景 3:多服务代理

目标:同时代理多个服务

步骤

  1. 安装客户端并选择 SSH

  2. 编辑配置添加更多代理

sudo bash frp.sh config-client
  1. 添加配置:
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000

[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 6001

[[proxies]]
name = "mysql"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3306
remotePort = 6002
  1. 重启服务
sudo bash frp.sh restart-client

4. 日常维护

查看服务状态

# 服务端
bash frp.sh status-server

# 客户端
bash frp.sh status-client

# 或使用 systemctl
systemctl status frps
systemctl status frpc

查看日志

# 实时日志
bash frp.sh logs-server
bash frp.sh logs-client

# 查看历史日志
tail -n 100 /usr/local/frp/frps.log
tail -n 100 /usr/local/frp/frpc.log

重启服务

# 修改配置后重启
sudo bash frp.sh restart-server
sudo bash frp.sh restart-client

故障排查

故障排查流程

uml diagram

常见问题

1. 服务无法启动

检查步骤

# 查看服务状态
systemctl status frps  # 或 frpc

# 查看详细日志
journalctl -u frps -n 50  # 或 frpc

# 查看 FRP 日志
tail -f /usr/local/frp/frps.log

常见原因

  • 配置文件错误
  • 端口被占用
  • 权限不足

2. 客户端连接失败

检查步骤

# 1. 检查服务端是否运行
bash frp.sh status-server

# 2. 检查网络连接
ping 8.146.198.118
telnet 8.146.198.118 7000

# 3. 检查防火墙
sudo ufw status
sudo firewall-cmd --list-ports

# 4. 检查 Token
cat /usr/local/frp/frps.toml | grep token
cat /usr/local/frp/frpc.toml | grep token

3. IP 地址不正确

解决方案

# 更新 IP 地址
sudo bash frp.sh update-server-ip

# 输入正确的公网 IP
# 例如: 8.146.198.118

4. 端口无法访问

检查步骤

# 1. 检查服务端端口监听
netstat -tlnp | grep frps

# 2. 检查客户端连接
bash frp.sh logs-client

# 3. 检查本地服务
systemctl status sshd  # 或其他服务

# 4. 测试本地服务
ssh localhost -p 22
curl http://localhost:8080

性能优化

系统优化

1. 增加文件描述符限制

# 编辑 systemd 服务文件
sudo vim /etc/systemd/system/frps.service

# 添加或修改
[Service]
LimitNOFILE=65536

# 重新加载并重启
sudo systemctl daemon-reload
sudo systemctl restart frps

2. 启用 TCP 优化

# 编辑系统配置
sudo vim /etc/sysctl.conf

# 添加以下内容
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_tw_reuse = 1

# 应用配置
sudo sysctl -p

FRP 配置优化

1. 启用压缩和加密

# 客户端配置
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
transport.useEncryption = true      # 启用加密
transport.useCompression = true     # 启用压缩

2. 调整心跳间隔

# 客户端配置
transport.heartbeatInterval = 30    # 心跳间隔(秒)
transport.heartbeatTimeout = 90     # 心跳超时(秒)

3. 连接池优化

# 客户端配置
transport.poolCount = 5             # 连接池大小

安全建议

安全架构

uml diagram

安全清单

1. 密码安全

  • ✅ 使用脚本自动生成的强密码
  • ✅ 定期更换 Token
  • ✅ 不要在公开场合泄露密码
  • ✅ 配置文件权限设为 600
# 检查配置文件权限
ls -l /usr/local/frp/*.toml

# 应该显示 -rw------- (600)

2. 网络安全

  • ✅ 启用防火墙
  • ✅ 只开放必要端口
  • ✅ 考虑使用 IP 白名单
  • ✅ 定期检查连接日志
# 查看防火墙状态
sudo ufw status

# 查看连接日志
bash frp.sh logs-server

3. 服务安全

  • ✅ 使用 systemd 管理服务
  • ✅ 启用服务自动重启
  • ✅ 限制服务权限
  • ✅ 定期更新 FRP 版本
# 更新脚本
bash frp.sh update

# 重新安装最新版本
sudo bash frp.sh uninstall-server
sudo bash frp.sh install-server

4. 监控告警

  • ✅ 定期检查服务状态
  • ✅ 监控异常连接
  • ✅ 设置日志轮转
  • ✅ 备份重要配置
# 添加到 crontab
0 */6 * * * systemctl is-active frps || systemctl restart frps
0 */6 * * * systemctl is-active frpc || systemctl restart frpc

附录

A. 配置文件模板

服务端配置(frps.toml)

# 基本配置
bindAddr = "0.0.0.0"
bindPort = 7000

# 认证配置
auth.method = "token"
auth.token = "your_token_here"

# Web 管理面板
webServer.addr = "0.0.0.0"
webServer.port = 7500
webServer.user = "admin"
webServer.password = "your_password_here"

# 端口范围
allowPorts = [
  { start = 6000, end = 60000 }
]

# 日志配置
log.to = "/usr/local/frp/frps.log"
log.level = "info"
log.maxDays = 3

客户端配置(frpc.toml)

# 服务端配置
serverAddr = "8.146.198.118"
serverPort = 7000

# 认证配置
auth.method = "token"
auth.token = "your_token_here"

# SSH 代理
[[proxies]]
name = "ssh"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 6000
transport.useEncryption = true
transport.useCompression = true

# Web 代理
[[proxies]]
name = "web"
type = "tcp"
localIP = "127.0.0.1"
localPort = 8080
remotePort = 6001

# 日志配置
log.to = "/usr/local/frp/frpc.log"
log.level = "info"
log.maxDays = 3

B. 系统要求

项目 要求
操作系统 Linux (支持 systemd)
内存 最小 512MB,推荐 1GB+
磁盘 最小 100MB
网络 服务端需要公网 IP
权限 root 或 sudo

C. 端口说明

端口 用途 方向
7000 客户端连接 服务端监听
7500 Web 管理面板 服务端监听
6000-60000 代理服务 服务端监听

D. 文件结构

/usr/local/frp/
├── frps                # 服务端可执行文件
├── frpc                # 客户端可执行文件
├── frps.toml           # 服务端配置
├── frpc.toml           # 客户端配置
├── frps.log            # 服务端日志
├── frpc.log            # 客户端日志
└── install_info.txt    # 安装信息(仅服务端)

/etc/systemd/system/
├── frps.service        # 服务端 systemd 服务
└── frpc.service        # 客户端 systemd 服务

E. 参考资料

  • FRP 官方文档:https://gofrp.org/
  • GitHub 仓库:https://github.com/fatedier/frp
  • 本项目地址:https://github.com/liangshaojie/frp

版本历史

版本 日期 说明
v1.0.0 2025-12-07 初始版本,统一管理脚本

许可证

MIT License


文档结束

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

请登录后发表评论

    暂无评论内容