【教程】FRP实现内网穿透,公网轻松访问

  1. 1. 一、什么是 frp?
  2. 2. 二、frp 适合哪些场景?
    1. 2.1. 1. 远程访问内网 Web 服务
    2. 2.2. 2. 远程 SSH 登录内网服务器
    3. 2.3. 3. 访问家庭 NAS 或软路由面板
    4. 2.4. 4. TCP、UDP 服务转发
  3. 3. 三、准备工作
  4. 4. 四、安装 frp
  5. 5. 五、配置 frps 服务端
  6. 6. 六、配置 frpc 客户端
  7. 7. 七、配置 SSH 内网穿透
  8. 8. 八、配置 frp 身份认证
  9. 9. 九、使用 systemd 后台运行 frps
  10. 10. 十、常见问题排查
    1. 10.0.1. 1. frpc 连接不上 frps
  11. 10.1. 2. 公网端口无法访问
  12. 10.2. 3. 启动提示端口占用
  • 11. 十一、安全建议
  • 12. 十二、总结

  • 在日常开发、远程办公或家庭服务器搭建过程中,我们经常会遇到这样一个问题:服务部署在内网环境中,外网无法直接访问。

    比如:

    • 家里的 NAS 想在外面访问
    • 本地开发的 Web 项目想给同事演示
    • 实验室内网机器需要远程 SSH
    • 摄像头、面板、管理后台只在局域网可用

    如果没有公网 IP,传统方式往往比较麻烦。而 frp 就是一个非常实用的内网穿透工具,可以帮助我们把内网服务暴露到公网,实现公网轻松访问。


    一、什么是 frp?

    frp 全称是 Fast Reverse Proxy,是一个高性能的反向代理应用,主要用于内网穿透。

    它采用客户端和服务端的架构:

    • frps:服务端,部署在拥有公网 IP 的服务器上
    • frpc:客户端,部署在内网机器上

    简单来说,frpc 会主动连接公网服务器上的 frps,然后通过这条连接把内网服务映射到公网端口。

    这样,即使内网机器没有公网 IP,也可以通过公网服务器访问到它。


    二、frp 适合哪些场景?

    frp 的使用场景非常广,常见的有以下几种:

    1. 远程访问内网 Web 服务

    本地启动了一个 Web 项目,例如:

    1
    http://127.0.0.1:8080

    通过 frp 映射后,可以在公网通过类似下面的地址访问:

    1
    http://服务器IP:公网端口

    非常适合临时演示、接口联调和远程测试。


    2. 远程 SSH 登录内网服务器

    家里或公司的 Linux 机器没有公网 IP,但想在外面远程登录,可以使用 frp 映射 SSH 端口。

    映射后,就可以通过公网服务器连接内网机器:

    1
    ssh -p 6000 user@公网服务器IP

    当然也可以用于游戏服务器映射到公网,比如Minecraft等。


    3. 访问家庭 NAS 或软路由面板

    很多人会在家里部署 NAS、OpenWrt、Home Assistant 等服务。

    借助 frp,可以在外网访问这些管理页面,无需运营商提供公网 IP。


    4. TCP、UDP 服务转发

    除了 HTTP 和 HTTPS,frp 也支持 TCP、UDP、STCP、XTCP 等多种代理方式,灵活性很高。


    三、准备工作

    在开始之前,需要准备以下环境:

    角色 要求
    公网服务器 一台拥有公网 IP 的云服务器
    内网机器 需要被访问的本地电脑、服务器或 NAS
    frp 程序 下载对应系统版本的 frp
    防火墙端口 放行 frps 监听端口和映射端口

    这里使用的演示环境如下(公网服务器已做脱敏处理):

    项目 示例
    公网服务器 IP 1.2.3.4
    frps 监听端口 7000
    内网 Web 服务 127.0.0.1:8080
    映射公网端口 8088

    四、安装 frp

    前往 frp 的github release页面,下载对应系统版本的压缩包。

    Linux 服务器一般可以使用类似下面的命令:

    1
    2
    3
    wget https://github.com/fatedier/frp/releases/download/v0.XX.X/frp_0.XX.X_linux_amd64.tar.gz
    tar -zxvf frp_0.XX.X_linux_amd64.tar.gz
    cd frp_0.XX.X_linux_amd64

    目录中通常会包含以下文件:

    1
    2
    3
    4
    frps
    frps.toml
    frpc
    frpc.toml

    其中:

    • frps 是服务端程序
    • frps.toml 是服务端配置文件
    • frpc 是客户端程序
    • frpc.toml 是客户端配置文件

    五、配置 frps 服务端

    在公网服务器上编辑 frps.toml

    1
    bindPort = 7000

    这表示 frps 服务端监听 7000 端口,等待 frpc 客户端连接。

    启动 frps:

    1
    ./frps -c ./frps.toml

    如果看到服务正常启动,就说明服务端已经运行。

    为了保证外网可以连接,还需要在云服务器安全组和系统防火墙中放行端口:

    1
    2
    7000
    8088

    其中:

    • 7000 用于 frpc 连接 frps
    • 8088 用于公网访问内网 Web 服务

    六、配置 frpc 客户端

    在内网机器上编辑 frpc.toml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    serverAddr = "1.2.3.4"
    serverPort = 7000

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

    配置说明:

    配置项 含义
    serverAddr 公网服务器 IP
    serverPort frps 服务端端口
    name 代理名称,自定义即可
    type 代理类型,这里使用 TCP
    localIP 内网服务地址
    localPort 内网服务端口
    remotePort 映射到公网服务器的端口

    启动 frpc:

    1
    ./frpc -c ./frpc.toml

    启动成功后,访问:

    1
    http://1.2.3.4:8088

    就可以访问到内网机器上的 127.0.0.1:8080 服务。


    七、配置 SSH 内网穿透

    如果想远程登录内网 Linux 服务器,也可以配置 SSH 转发。

    假设内网机器 SSH 端口是 22,希望映射到公网服务器的 6000 端口,可以在 frpc.toml 中增加:

    1
    2
    3
    4
    5
    6
    [[proxies]]
    name = "ssh"
    type = "tcp"
    localIP = "127.0.0.1"
    localPort = 22
    remotePort = 6000

    然后重启 frpc。

    在外网环境中执行:

    1
    ssh -p 6000 user@1.2.3.4

    即可连接到内网机器。


    八、配置 frp 身份认证

    为了安全,不建议直接裸奔使用 frp。可以为 frps 和 frpc 配置认证 token。

    服务端 frps.toml

    1
    2
    3
    4
    bindPort = 7000

    auth.method = "token"
    auth.token = "your_secure_token"

    客户端 frpc.toml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    serverAddr = "1.2.3.4"
    serverPort = 7000

    auth.method = "token"
    auth.token = "your_secure_token"

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

    这样只有 token 一致的客户端才能连接到 frps。

    也可以在客户端配置的每一项中添加下面的配置来实现加密信道传输,保护数据安全:

    1
    2
    transport.useEncryption = true
    transport.useCompression = true

    九、使用 systemd 后台运行 frps

    在 Linux 服务器上,为了让 frps 开机自启,可以配置 systemd 服务。

    创建服务文件:

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

    写入以下内容:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    [Unit]
    Description=frp server
    After=network.target

    [Service]
    Type=simple
    ExecStart=/opt/frp/frps -c /opt/frp/frps.toml
    Restart=always
    RestartSec=5s

    [Install]
    WantedBy=multi-user.target

    然后执行:

    1
    2
    3
    4
    sudo systemctl daemon-reload
    sudo systemctl enable frps
    sudo systemctl start frps
    sudo systemctl status frps

    同理,内网客户端也可以配置 frpc.service,实现开机自动连接。

    注:也可以手动启动加上 nohope 和 & 使frps在后台运行。


    十、常见问题排查

    1. frpc 连接不上 frps

    可以检查以下几点:

    • 公网服务器 IP 是否正确
    • serverPort 是否和 bindPort 一致
    • 云服务器安全组是否放行端口
    • Linux 防火墙是否放行端口
    • token 是否一致

    2. 公网端口无法访问

    重点检查:

    • remotePort 是否被占用
    • 云服务器安全组是否开放该端口
    • frpc 是否正常运行
    • 内网服务本身是否正常启动

    可以在内网机器上先测试:

    1
    curl http://127.0.0.1:8080

    如果本地都访问不了,说明问题不在 frp,而在内网服务本身。


    3. 启动提示端口占用

    可以使用以下命令查看端口占用:

    1
    sudo lsof -i:8088

    或者:

    1
    sudo netstat -tunlp | grep 8088

    换一个未被占用的 remotePort 即可。


    十一、安全建议

    frp 很方便,但公网暴露服务也意味着风险增加。建议注意以下几点:

    1. 不要随意暴露敏感管理后台
    2. 使用强 token 进行认证
    3. SSH 禁用密码登录,优先使用密钥登录
    4. 给 Web 服务增加登录认证
    5. 只开放必要端口
    6. 定期更新 frp 版本
    7. 配合防火墙限制访问来源 IP

    尤其是 SSH、NAS、数据库、管理面板这类服务,不建议直接暴露在公网,最好额外加一层认证或访问控制。


    十二、总结

    frp 是一个非常实用的内网穿透工具。通过在公网服务器上部署 frps,在内网机器上部署 frpc,我们就可以轻松把内网服务映射到公网。

    它的核心优势包括:

    • 配置简单
    • 支持 TCP、UDP、HTTP、HTTPS 等多种协议
    • 性能较好
    • 适合开发调试、远程访问和家庭服务暴露
    • 可配合 systemd 实现长期稳定运行

    对于没有公网 IP 的用户来说,frp 是一种成本低、灵活性高的解决方案。

    只要合理配置权限和安全策略,就可以实现“内网服务,公网轻松访问”。