内网穿透:让你的项目实时与世界共享

本文记录了我在腾讯云轻量服务器上部署内网穿透服务,并用脚本 + systemd 实现自动检测端口、自动启动/关闭 frpc 客户端、实现开机自启的完整过程。适用于前端开发者本地真机调试、远程演示、项目部署等场景。


目录

  1. 场景需求与技术选型
  2. frp 内网穿透基础部署
  3. 编写自动检测脚本
  4. systemd 开机自启与守护
  5. 实战过程常见问题与优化建议
  6. 完整工程目录与配置说明
  7. 总结与展望

1. 场景需求与技术选型

  • 痛点:需要将本地 Nuxt、博客等服务穿透到公网,便于手机端随时进行真机测试,也便于产品/UI随时访问,提高开发效率。
  • 工具:选择 frp(轻量级高性能内网穿透工具)、腾讯云轻量服务器。
  • 进阶需求:只在本地有服务监听(如 3000/5173 端口)时才启动 frpc,节约资源;重启后 frpc 自动恢复,无需人工干预。

2. frp 内网穿透基础部署

2.1 服务器端(frps)部署

  • 登录腾讯云服务器,进入合适的目录,例如 ~/frp_0.56.0_linux_amd64

  • 前往 frp 官方 GitHub 下载最新版,使用 wget/curl 或本地上传:

    1
    2
    3
    wget https://github.com/fatedier/frp/releases/download/v0.56.0/frp_0.56.0_linux_amd64.tar.gz
    tar -zxvf frp_0.56.0_linux_amd64.tar.gz
    cd frp_0.56.0_linux_amd64
  • 配置 frps.ini,最简示例:

    1
    2
    3
    4
    5
    6
    [common]
    bind_port = 7000
    dashboard_port = 7500
    dashboard_user = admin
    dashboard_pwd = yourpassword
    token = yourtoken123
  • 使用 nohup、后台运行或者 systemd:

    1
    nohup ./frps -c frps.ini > frps.log 2>&1 &
  • 云服务器控制台(安全组)务必开放上述所有端口(如 7000、8000、7500 等),否则公网无法连接。

2.2 本地(frpc)基础测试

  • 在本地 Linux 设备下载、解压 frpc(版本必须和服务器一致):

    1
    2
    3
    wget https://github.com/fatedier/frp/releases/download/v0.56.0/frp_0.56.0_linux_amd64.tar.gz
    tar -zxvf frp_0.56.0_linux_amd64.tar.gz
    cd frp_0.56.0_linux_amd64
  • 编写 frpc.ini,举例:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    [common]
    server_addr = <你的腾讯云公网 IP>
    server_port = 7000
    token = yourtoken123

    [nuxt]
    type = tcp
    local_ip = 127.0.0.1
    local_port = 3000
    remote_port = 8000
    • 多服务可多配几个 [section]
  • 先在本地开好 nuxt 项目(npm run dev 默认监听 3000 端口),再手动运行 frpc:

    1
    ./frpc -c frpc.ini
  • 本地终端应看到 login to server success 等日志,腾讯云服务器上(frps.log)也能看到连接记录。

  • 测试方法:浏览器直接访问 http://<你的腾讯云公网 IP>:8000,理论上就能看到本地 Nuxt 页面。

  • 也可以试试用阿里云/腾讯云域名解析,直接映射到你的服务器。

注意细节:

  • 若端口/服务没开好,或 frps 没正常运行,连接会失败。
  • 服务器安全组端口未开放也会直接拒绝。
  • 服务器 frps 启动时如端口被占用,优先先 lsof -i:端口号 检查。

3. 编写自动检测 + 启停脚本

需求:监听多个关键端口,端口被占用(如本地 nuxt 开发环境启动)则自动启动 frpc,否则关闭。

3.1 端口检测+frpc自动启动/关闭脚本(bash)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#!/bin/bash

FRPC_PATH="$PWD/frpc"
FRPC_CONF="$PWD/frpc.ini"
FRPC_PID="/tmp/frpc.pid"
PORTS=(3000 5173)

check_ports() {
for port in "${PORTS[@]}"; do
if lsof -iTCP:"$port" -sTCP:LISTEN | grep -q LISTEN; then
return 0
fi
done
return 1
}

start_frpc() {
if [ ! -f "$FRPC_PID" ] || ! kill -0 $(cat $FRPC_PID) 2>/dev/null; then
nohup "$FRPC_PATH" -c "$FRPC_CONF" > /dev/null 2>&1 &
echo $! > "$FRPC_PID"
echo "frpc started!"
fi
}

stop_frpc() {
if [ -f "$FRPC_PID" ] && kill -0 $(cat $FRPC_PID) 2>/dev/null; then
kill $(cat "$FRPC_PID")
rm -f "$FRPC_PID"
echo "frpc stopped!"
fi
}

while true; do
if check_ports; then
start_frpc
else
stop_frpc
fi
sleep 10
}

  • 脚本要 chmod +x check_and_start_frpc.sh,支持多端口可扩展。
  • 可以用 nohup、screen、tmux 后台运行。

4. systemd 配置开机自启

4.1 新建 systemd 服务文件

/etc/systemd/system/frpc-monitor.service

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[Unit]
Description=Auto monitor ports and run frpc when needed
After=network.target

[Service]
Type=simple
User=maojianhui
WorkingDirectory=/home/maojianhui/frp_0.56.0_linux_amd64
ExecStart=/home/maojianhui/frp_0.56.0_linux_amd64/check_and_start_frpc.sh
Restart=always
RestartSec=5

[Install]
WantedBy=multi-user.target

4.2 启用/检查服务

1
2
3
4
5
6
sudo systemctl daemon-reload
sudo systemctl enable frpc-monitor
sudo systemctl start frpc-monitor
sudo systemctl status frpc-monitor
journalctl -u frpc-monitor -f # 查看实时日志

  • systemd 守护可防止脚本异常退出,日志可追溯。

5. 常见问题与调优

  • lsof 未安装需先 sudo apt install lsof
  • 用户/路径注意与实际一致,systemd 里的 User=WorkingDirectory 要正确
  • 日志、监控脚本占用极低,不影响服务器运行
  • 建议关键命令和配置文件加备注,方便运维和迁移
  • 需要支持更多端口/服务时,只要加到 PORTS=(...) 即可

6. 完整工程结构(推荐示例)

1
2
3
4
5
6
7
frp_0.56.0_linux_amd64/
├── frpc
├── frpc.ini
├── check_and_start_frpc.sh
├── monitor.log
└── ...


7. 总结与展望

本方案适用于日常前端 demo 展示、真机调试。系统性配置 + 自动化脚本可以极大提升远程协作效率。

后续可扩展方向:Nginx 反向代理+多域名、HTTPS、自动证书、更多自动化脚本等。
本文部分内容由 ChatGPT(OpenAI)辅助生成


内网穿透:让你的项目实时与世界共享
https://imjh.xyz/2025/05/26/Intranet-Penetration-For-Demo/
Author
blues
Posted on
May 26, 2025
Licensed under