frp内网穿透体验
IT

frp内网穿透体验

huangyixin447@gmail.com
2025-12-31 / 0 评论 / 2 阅读 / 正在检测是否收录...

1.背景

我有许多内网穿透的场景,大多数都使用zerotier或者tailscale等虚拟局域网(vpn设备)来进行穿透,有好处也有坏处,好处是所有的设备都在一个局域网中,坏处是要手动nginx的stream映射到公网中,而且当所处网络环境不好或者网络十分不稳定等情况,虚拟局域网的方案大概率没法快速打通直连,而且会发生丢包等一系列难以使用的情况。基于以上种种情况,frp出现了,frp 非常适合对外暴露内网的远程22端口。

2.什么是frp?以及frp的原理

FRP 是一个基于 TCP 的“反向代理 / 端口转发工具”,用于把内网服务稳定地暴露到公网。

原理图如下:

[ 内网机器 A ] --(frpc)--> [ 公网服务器 ] <--(访问)-- [ 外部机器 B ]

可以看到frp的通信顺序,由内网机器主动访问公网服务器,然后将服务暴露在公网服务器的某一个端口中,这样就可以绕过内网机器的服务被nat挡住的困境。

frp的核心思想,既然外部访问无法主动找到我的内网服务,那么我的内网服务就全部使用出的方案,主动和具有公网的机器进行沟通,就像是一只苍蝇一直和公网机器说:有服务通过你请求我吗?

平常公网机器的回答都是否,但是一旦真的有请求,那么就会回答是然后回复请求内容给内网机器。

在这过程中,内网机器就像是金枪鱼,必须一直不停的游动(和公网机器进行沟通),不能停下。

为什么内网机器必须不停的主动询问公网机器呢?原因就是nat的规则,nat普遍只接受自己发送的请求的回包,一旦停止访问,公网机器转发外部服务的回包就不能进来了。

所以frp的可靠性很高,毕竟所有机器对一台公网服务器的访问能力都不会太差的。

3.具体如何使用frp?

本节按照真实部署顺序说明 FRP 的使用方式,从环境准备到系统服务化,适合长期运行。


3.1 FRP 是什么(一句话定位)

FRP 是一个基于 TCP 的反向代理工具,用来把内网服务稳定暴露到公网。

核心思想只有一句话:

外部不能“入”,那就全部改成“内网主动出”。

3.2 整体架构说明

FRP 至少需要两台机器:

[ 内网机器 ] ── frpc ──▶ [ 公网 VPS ] ── frps ──▶ 外部访问者

角色说明:

  • frps(服务端)

    • 部署在有公网 IP 的 VPS
    • 负责对外监听端口
  • frpc(客户端)

    • 部署在内网环境(家里 / 公司)
    • 主动与 frps 建立长连接

3.3 下载与安装 FRP(两端一致)

以 Linux amd64 为例:

wget https://github.com/fatedier/frp/releases/download/v0.52.3/frp_0.52.3_linux_amd64.tar.gz
tar -zxvf frp_0.52.3_linux_amd64.tar.gz

解压后目录结构如下:

frps
frpc
frps.toml
frpc.toml

⚠️ 注意事项:

  • frps 与 frpc 版本必须完全一致
  • 建议统一放在固定目录(如 /opt/frp_xxx)

3.4 服务端配置(VPS:frps)

3.4.1 编辑

frps.toml

bindPort = 7000

auth.method = "token"
auth.token = "替换为你自己的强随机字符串"

参数说明:

  • bindPort

    frpc 连接入口端口(不是业务端口)

  • auth.token

    防止未授权客户端接入


3.4.2 手动启动测试

./frps -c frps.toml

出现以下日志即表示启动成功:

frps started successfully

3.4.3 放行防火墙与安全组端口(必须)

VPS 本机防火墙(如 ufw):

sudo ufw allow 7000/tcp
sudo ufw allow 11808/tcp   # 示例业务端口

云厂商安全组:

  • 入方向放行 TCP 7000
  • 入方向放行 TCP 11808(或你实际使用的端口)

3.5 客户端配置(内网:frpc)

3.5.1 编辑

frpc.toml

serverAddr = "VPS公网IP"
serverPort = 7000

auth.method = "token"
auth.token = "与frps保持一致"

[[proxies]]
name = "ssh-home"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22
remotePort = 11808

含义说明:

VPS:11808  →  内网机器:22

3.5.2 手动启动测试

./frpc -c frpc.toml

成功标志:

login to server success
start proxy success

3.5.3 外部连通性验证

在任意公网机器上执行:

ssh 用户名@VPS公网IP -p 11808

能够登录内网机器即表示穿透成功。


3.6 将 frpc 设置为系统服务(开机自启)

生产环境禁止使用 nohup 启动

3.6.1 创建 systemd 服务文件(内网机器)

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

内容如下:

[Unit]
Description=FRP Client Service
After=network.target
Wants=network.target

[Service]
Type=simple
User=你的用户名
WorkingDirectory=/opt/frp_0.52.3_linux_amd64
ExecStart=/opt/frp_0.52.3_linux_amd64/frpc -c /opt/frp_0.52.3_linux_amd64/frpc.toml
Restart=always
RestartSec=5
LimitNOFILE=1048576
KillSignal=SIGTERM
TimeoutStopSec=10

[Install]
WantedBy=multi-user.target

3.6.2 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable frpc
sudo systemctl start frpc

检查状态:

systemctl status frpc

3.7 将 frps 设置为系统服务(VPS)

3.7.1 创建 systemd 服务文件

sudo nano /etc/systemd/system/frps.service
[Unit]
Description=FRP Server Service
After=network.target
Wants=network.target

[Service]
Type=simple
User=root
WorkingDirectory=/root/frp_0.52.3_linux_amd64
ExecStart=/root/frp_0.52.3_linux_amd64/frps -c /root/frp_0.52.3_linux_amd64/frps.toml
Restart=always
RestartSec=5
LimitNOFILE=1048576
KillSignal=SIGTERM
TimeoutStopSec=10

[Install]
WantedBy=multi-user.target

3.7.2 启用并启动服务

sudo systemctl daemon-reload
sudo systemctl enable frps
sudo systemctl start frps

3.8 最终验收流程(必须完成)

VPS 侧:

ss -lntp | grep 7000
ss -lntp | grep 11808

内网机器:

systemctl status frpc

重启测试:

sudo reboot

重启后确认:

systemctl status frps
systemctl status frpc

3.9 常见问题汇总(踩坑记录)

  1. 域名解析错误 → frps 日志无任何连接
  2. token 不一致 → EOF / session shutdown
  3. nohup 与 systemd 同时运行 → proxy already exists
  4. 云安全组未放行业务端口
  5. 使用 IPv6 但未放行 IPv6 防火墙规则

2291767152699_.pic.jpg

0

评论 (0)

取消