想让家里的 NAS、旧电脑、摄像头或本地开发服务在外网访问?但家里没有公网 IP,路由器端口映射和防火墙配置又让人头疼。

本文介绍免费开源的内网穿透工具 frp,用公网服务器中转流量,让内网服务获得“公网身份”。

frp 项目

项目地址:https://github.com/fatedier/frp

版本提示: 本文截图和配置来自 2025 年 8 月。frp 配置项会随版本调整,请使用官方最新稳定版,并以官方文档为准。

一、frp 的工作原理

frp 分为两部分:

  • frps:服务端,部署在有公网 IP 的云服务器上,负责接收外网请求并转发流量。
  • frpc:客户端,部署在内网设备上,主动连接 frps 并建立隧道。

外网请求先到达 frps,再通过隧道交给内网的 frpc,最后转发给本机或其他局域网服务。即使内网没有公网 IP,也可以通过这种方式对外提供服务。

二、准备事项

  • 一台有公网 IP 的云服务器;
  • 一台需要穿透的内网设备;
  • 如需 HTTPS 和域名访问,准备一个域名。

三、部署 frps

1. 下载 frp

进入 frp Releases,根据系统选择压缩包:

  • Linux 服务器:frp_xxx_linux_amd64.tar.gz
  • Windows 设备:frp_xxx_windows_amd64.zip

下载 frp

frp 目录文件

2. 配置服务端

把 frps 和 frps.toml 上传到云服务器,示例配置:

1
2
3
4
5
bindPort = 7000
vhostHTTPSPort = 443

auth.method = "token"
auth.token = "请使用强随机字符串"

安全提示: 示例中的简单令牌只用于演示。生产环境请使用长随机令牌,并只放行必要端口。

临时启动:

1
2
3
cd /opt/frps
chmod +x frps
nohup ./frps -c ./frps.toml &

命令行启动 frps

3. 使用 systemd 管理服务

创建 /etc/systemd/system/frps.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
cat >/etc/systemd/system/frps.service<<EOF
[Unit]
Description = frp server
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = /opt/frps/frps -c /opt/frps/frps.toml

[Install]
WantedBy = multi-user.target
EOF

常用命令:

1
2
3
4
sudo systemctl start frps
sudo systemctl enable frps
sudo systemctl status frps
sudo systemctl restart frps

systemd 管理 frps

记得在云服务器的安全组或防火墙放行 7000、443 和实际使用的远程端口。

四、部署 frpc

把 frpc 和 frpc.toml 放到内网设备上。

1. HTTPS 服务示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
serverAddr = "你的云服务器公网IP"
serverPort = 7000

auth.method = "token"
auth.token = "与服务端一致的令牌"

[[proxies]]
name = "web"
type = "https"
customDomains = ["home.example.com"]

[proxies.plugin]
type = "https2http"
localAddr = "127.0.0.1:7892"
crtPath = "./server.crt"
keyPath = "./server.key"
hostHeaderRewrite = "127.0.0.1"
requestHeaders.set.x-from-where = "frp"

域名需要解析到云服务器公网 IP。本文示例使用 Cloudflare 客户端证书:

创建 Cloudflare 客户端证书

保存证书内容

如果使用 Cloudflare DNS,并且 frp 直接处理证书,先关闭该记录的 CDN 代理。

关闭 CDN 代理

2. TCP 服务示例

例如把内网 3002 端口映射到公网 9000:

1
2
3
4
5
6
7
8
9
10
11
12
serverAddr = "你的云服务器公网IP"
serverPort = 7000

auth.method = "token"
auth.token = "与服务端一致的令牌"

[[proxies]]
name = "sunpanel"
type = "tcp"
localIP = "127.0.0.1"
localPort = 3002
remotePort = 9000

3. 启动客户端

1
2
3
4
5
6
7
chmod +x frpc

# Linux
nohup ./frpc -c ./frpc.toml &

# Windows
frpc.exe -c frpc.toml

启动 frpc

也可以创建 /etc/systemd/system/frpc.service:

1
2
3
4
5
6
7
8
9
10
11
12
13
cat >/etc/systemd/system/frpc.service<<EOF
[Unit]
Description = frp client
After = network.target syslog.target
Wants = network.target

[Service]
Type = simple
ExecStart = /opt/frpc/frpc -c /opt/frpc/frpc.toml

[Install]
WantedBy = multi-user.target
EOF

systemd 管理 frpc

五、验证访问

  • HTTPS 代理:使用绑定的域名访问,例如 https://home.example.com;
  • TCP 代理:使用 服务器公网IP:remotePort 访问。

HTTPS 服务访问成功

TCP 服务访问成功

六、安全建议

  1. 使用强随机令牌,不要复用示例值;
  2. 只放行必要的代理端口;
  3. 为被穿透服务设置强密码和访问控制;
  4. 定期更新 frp 和系统补丁;
  5. 敏感服务优先加入 VPN、访问列表或 Cloudflare Access。

更多用法见 frp 中文文档。

总结

frp 是一个轻量、稳定的内网穿透方案,适合有公网服务器、希望完全自主控制的用户。部署的关键不是“跑起来”,而是令牌安全、端口收敛和被穿透服务本身的防护。