如果你手头有一台阿里云轻量应用服务器,但发现它没有公网IP;或者你正在使用宝塔面板管理服务器,却苦于无法从外网直接访问;又或者你家里有一台绿联NAS,想把它的一些服务暴露到公网,但运营商不给你公网IP——那么,这篇文章就是为你准备的。
这三个看似独立的问题,其实指向同一个核心痛点:如何在缺乏直接公网IP的环境下,安全、稳定地将内网服务映射到公网,供自己或团队远程访问?很多人会想到端口转发、DDNS,但在云服务器无公网IP、家庭宽带无公网IP的双重限制下,这些传统方案几乎失效。
本文将为你提供一个经过实战验证的整合方案:利用FRP(Fast Reverse Proxy)内网穿透技术,以一台具备公网IP的服务器(作为跳板)为中转,打通你的阿里云轻量服务器(无公网IP)、宝塔面板以及家庭绿联NAS。这个方案的核心价值在于,它不依赖于任何一端的公网IP,而是通过“服务端-客户端”的架构,在复杂的网络环境中开辟一条稳定的隧道。
读完本文,你将能清晰地掌握:
- FRP穿透的核心原理:为什么它能解决无公网IP的访问难题。
- 完整的搭建流程:从云服务器FRP服务端部署,到内网客户端(宝塔服务器、绿联NAS)的配置。
- 宝塔面板的特殊处理:如何安全地穿透Web面板和管理端口。
- 绿联NAS的配置要点:针对NAS的特性进行优化配置。
- 安全与性能实践:避免常见陷阱,确保服务稳定可靠。
我们直接进入正题。
1. 场景拆解:为什么需要FRP,以及它解决了什么根本问题?
在深入配置之前,我们必须先理解问题的本质。你的网络环境很可能面临以下两种或多种情况:
- 场景A:阿里云轻量服务器无公网IP。部分轻量应用服务器套餐或特定区域实例可能只分配内网IP,这意味着你无法通过互联网直接SSH连接或访问其上的Web服务(如宝塔面板)。
- 场景B:家庭网络无公网IP。大多数家庭宽带由运营商分配的是私网IP(CGNAT),你的绿联NAS虽然在内网可以访问,但外部网络根本无法直接寻址到它。
- 场景C:需要统一入口。你可能希望用一个域名或一个公网服务器IP,来统一管理访问散落在不同内网环境中的多个服务(宝塔、NAS网页端、NAS的Docker服务等)。
传统的DDNS(动态域名解析)在场景B中完全失效,因为它需要一个公网IP来绑定域名。端口转发在场景A和B中也无法实施,因为你的路由器或云服务器控制台根本没有公网IP可供转发。
FRP的解决方案是“曲线救国”:
- 你需要一台拥有公网IP的服务器(以下简称“公网服务器”或“FRP服务端”)。这可以是另一台阿里云ECS、腾讯云CVM,或者其他任何具有固定公网IP的VPS。
- 在这台公网服务器上运行FRP服务端(
frps)。 - 在你的无公网IP的阿里云轻量服务器和家庭绿联NAS上,分别运行FRP客户端(
frpc)。 - 客户端主动连接到公网服务器的服务端,建立一条加密隧道。
- 当外部用户访问公网服务器的某个特定端口时,服务端会通过这条隧道,将请求转发给对应的内网客户端,再由客户端交给内网中真正的服务(如宝塔的8888端口、NAS的5000端口)。
简单比喻:公网服务器就像一个“接待处”(FRP服务端),而你的内网设备是“办公室”(FRP客户端)。外部访客无法直接进入办公室,但他们可以到接待处登记。接待处通过内部电话(隧道)通知办公室,办公室再把访客需要的信息传递出来。这样,访客无需知道办公室的具体地址(内网IP),也能完成访问。
接下来,我们开始具体的部署。
2. 环境准备与架构说明
在开始操作前,请确保你拥有以下资源,并理解整个架构:
| 角色 | 设备 | 要求 | 本文示例用途 |
|---|---|---|---|
| FRP服务端 | 具备公网IP的云服务器 | 1核1G以上,CentOS 7+/Ubuntu 18.04+,开放所需端口。 | 接收所有外部请求,并转发给对应的客户端。 |
| FRP客户端1 | 无公网IP的阿里云轻量服务器 | 可访问互联网,安装宝塔面板。 | 穿透宝塔面板(8888)和SSH(22)服务。 |
| FRP客户端2 | 家庭绿联NAS | 可访问互联网,支持Docker或能运行FRP客户端。 | 穿透NAS管理界面(5000)、文件服务或其他自建服务。 |
网络架构图(逻辑):
外部用户 --> [公网IP:端口] --> (FRP服务端 @ 公网服务器) --> [隧道] --> (FRP客户端 @ 阿里云轻量服务器) --> 宝塔面板(内网IP:8888) --> (FRP客户端 @ 绿联NAS) --> NAS管理页(内网IP:5000)重要安全前置提醒:
- 最小化暴露:只穿透必要的服务端口。
- 强密码与认证:务必为FRP服务端和客户端配置强密码或Token认证。
- 防火墙:公网服务器务必在安全组/防火墙中仅开放必需的端口(如FRP服务端端口、你要暴露的服务端口)。
- 使用非标端口:避免使用80、443、22、3389等常见端口作为公网访问端口,可降低被自动化工具扫描的风险。
3. 第一步:在公网服务器上部署FRP服务端 (frps)
这是整个架构的枢纽,必须首先搭建。
3.1 下载并安装FRP
通过SSH登录你的公网服务器。
# 创建并进入FRP工作目录 mkdir -p /opt/frp && cd /opt/frp # 查看系统架构,选择对应版本 (通常x86_64选择amd64) arch # 输出若为 x86_64,则下载amd64版本。绿联NAS多为ARM架构,但服务端通常用x86。 # 前往FRP GitHub Release页面查看最新版本号,替换下面的v0.52.3 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 # 进入解压后的目录 cd frp_0.52.3_linux_amd64 # 查看文件,其中 frps 是服务端程序,frps.ini 是服务端配置模板 ls -l3.2 配置FRP服务端 (frps.ini)
备份并编辑服务端配置文件:
# 备份原始配置 cp frps.ini frps.ini.bak # 使用vim或nano编辑配置 vim frps.ini以下是一个安全且功能完整的基础配置,请根据注释修改:
# frps.ini [common] # FRP服务端监听的端口,客户端通过此端口连接。必须开放防火墙。 bind_port = 7000 # 认证令牌,客户端配置必须与此一致。请务必修改为强密码! token = YourStrongPasswordHere123! # 仪表板端口,用于查看FRP连接状态(可选但推荐) dashboard_port = 7500 # 仪表板用户名和密码 dashboard_user = admin dashboard_pwd = YourDashboardPassword456! # 日志记录 log_file = ./frps.log log_level = info log_max_days = 3 # 允许客户端绑定的端口范围(可选,增加安全性) allow_ports = 10000-60000 # 子域名配置(可选,如果你有域名并想用子域名访问不同服务) # subdomain_host = frp.yourdomain.com关键配置解释:
bind_port:这是FRP的核心通信端口,所有客户端都通过这个端口连接到服务端。确保服务器安全组和系统防火墙(如firewalld/ufw)放行此端口(TCP)。token:这是服务端和客户端之间的共享密钥,用于认证。必须设置,且不要使用默认值。dashboard_port:Web管理界面端口,可以查看连接状态和流量统计。同样需要放行防火墙。allow_ports:限制客户端只能使用10000-60000范围内的端口来暴露服务,避免占用系统关键端口。
3.3 设置系统服务与启动
为了方便管理,我们将FRP服务端设置为systemd服务。
# 创建systemd服务文件 sudo vim /etc/systemd/system/frps.service将以下内容粘贴进去,注意修改ExecStart路径为你实际的FRP路径:
[Unit] Description=Frp Server Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/opt/frp/frp_0.52.3_linux_amd64/frps -c /opt/frp/frp_0.52.3_linux_amd64/frps.ini WorkingDirectory=/opt/frp/frp_0.52.3_linux_amd64 [Install] WantedBy=multi-user.target保存后,启动并设置开机自启:
# 重载systemd配置 sudo systemctl daemon-reload # 启动frps服务 sudo systemctl start frps # 设置开机自启 sudo systemctl enable frps # 查看服务状态,确认运行正常 (状态应为 active (running)) sudo systemctl status frps # 查看日志,确认无报错 sudo journalctl -u frps -f3.4 验证服务端
- 访问仪表板:在浏览器打开
http://你的公网服务器IP:7500,使用配置的用户名密码登录。你应该能看到一个空的连接列表。 - 检查端口监听:运行
sudo ss -tunlp | grep 7000,应看到frps正在监听7000端口。
至此,FRP服务端已部署完毕。接下来配置客户端。
4. 第二步:配置阿里云轻量服务器(FRP客户端 - 穿透宝塔)
登录你的无公网IP的阿里云轻量服务器。
4.1 下载并配置FRP客户端 (frpc)
操作步骤与服务端类似,但运行的是frpc。
# 在轻量服务器上操作 mkdir -p /opt/frp && cd /opt/frp # 根据轻量服务器架构下载,通常是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 cd frp_0.52.3_linux_amd64编辑客户端配置文件frpc.ini:
cp frpc.ini frpc.ini.bak vim frpc.ini以下是针对穿透宝塔面板和SSH的客户端配置:
# frpc.ini [common] # 公网FRP服务端的地址和端口 server_addr = 你的公网服务器IP server_port = 7000 # 必须与服务端 frps.ini 中的 token 一致 token = YourStrongPasswordHere123! # 客户端管理配置(可选) admin_addr = 127.0.0.1 admin_port = 7400 admin_user = admin admin_pwd = admin_local_pwd # 日志 log_file = ./frpc.log log_level = info log_max_days = 3 # 第一个穿透服务:宝塔Web面板 [bt_panel] type = tcp # 本地宝塔服务监听的IP和端口(默认是8888) local_ip = 127.0.0.1 local_port = 8888 # 在公网服务器上暴露的端口。外部用户将通过 公网IP:10000 访问宝塔。 remote_port = 10000 # 第二个穿透服务:SSH服务(用于远程管理) [bt_ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 # 使用另一个远程端口,例如10001 remote_port = 10001 # 你可以继续添加其他服务,如MySQL、其他Web应用等 # [web_app] # type = tcp # local_ip = 127.0.0.1 # local_port = 8080 # remote_port = 10002配置关键点:
server_addr:填写你公网服务器的IP地址。remote_port:这是外部用户访问服务时使用的端口。需要在公网服务器的防火墙/安全组中放行(例如10000, 10001)。local_port:这是你轻量服务器内部服务实际运行的端口。宝塔默认是8888,请根据你的实际情况修改。
4.2 启动FRP客户端并测试
同样,创建systemd服务来管理:
sudo vim /etc/systemd/system/frpc.service[Unit] Description=Frp Client Service After=network.target [Service] Type=simple User=nobody Restart=on-failure RestartSec=5s ExecStart=/opt/frp/frp_0.52.3_linux_amd64/frpc -c /opt/frp/frp_0.52.3_linux_amd64/frpc.ini WorkingDirectory=/opt/frp/frp_0.52.3_linux_amd64 [Install] WantedBy=multi-user.target启动服务:
sudo systemctl daemon-reload sudo systemctl start frpc sudo systemctl enable frpc sudo systemctl status frpc测试穿透是否成功:
- 回到公网服务器的FRP仪表板 (
http://公网IP:7500),你应该能看到一个客户端在线,并且下面列出了bt_panel和bt_ssh两个代理。 - 在你的本地电脑上,打开浏览器,访问
http://公网服务器IP:10000。如果配置正确,你应该能看到宝塔面板的登录页面。 - 重要安全警告:通过FRP暴露宝塔面板后,务必在宝塔面板的“安全”设置中,添加IP访问限制(仅允许你自己的公网IP),并确保面板密码足够复杂。因为现在任何人都能通过
公网IP:10000尝试登录。
5. 第三步:配置绿联NAS(FRP客户端 - 穿透NAS服务)
绿联NAS通常基于Linux,但可能没有包管理器。推荐使用Docker方式运行FRP客户端,这是最通用和干净的方法。假设你的绿联NAS已开启SSH或能在终端中执行命令(部分型号通过“网络服务”-“SSH”开启)。
5.1 通过Docker运行FRP客户端
在绿联NAS的终端中操作:
# 1. 创建一个目录存放配置文件 mkdir -p /opt/frp_nas && cd /opt/frp_nas # 2. 创建客户端配置文件 frpc_nas.ini vim frpc_nas.ini将以下内容粘贴到frpc_nas.ini中,注意修改server_addr和token:
# frpc_nas.ini [common] server_addr = 你的公网服务器IP server_port = 7000 token = YourStrongPasswordHere123! # NAS Web管理界面 (通常端口是5000) [nas_web] type = tcp local_ip = 192.168.1.100 # 修改为你的NAS在内网的实际IP地址 local_port = 5000 remote_port = 20000 # 在公网服务器上使用20000端口映射NAS # NAS的SMB文件共享服务 (端口445) [nas_smb] type = tcp local_ip = 192.168.1.100 local_port = 445 remote_port = 20445 # 注意:穿透SMB用于外网访问可能存在性能和安全隐患,请谨慎评估。 # NAS上的其他服务,例如PhotoStation、Download Station等 # [nas_photo] # type = tcp # local_ip = 192.168.1.100 # local_port = 80 # remote_port = 20080关键修改:
local_ip:必须填写你的绿联NAS在家庭局域网内的固定IP地址,例如192.168.1.100。请在你的路由器中为NAS设置静态IP分配。remote_port:为每个服务分配一个在公网服务器上唯一的端口。
5.2 使用Docker容器运行客户端
使用Docker可以避免在NAS系统上直接安装依赖,更加方便。
# 在 /opt/frp_nas 目录下,运行以下命令启动FRP客户端容器 docker run -d \ --name frpc_nas \ --restart=always \ -v /opt/frp_nas/frpc_nas.ini:/etc/frp/frpc.ini \ snowdreamtech/frpc:latest命令解释:
-d:后台运行。--restart=always:容器退出时总是重启,实现自启。-v ...:将宿主机(/opt/frp_nas/frpc_nas.ini)的配置文件挂载到容器内的默认配置路径。snowdreamtech/frpc:latest:一个维护良好的FRP客户端Docker镜像。
5.3 验证NAS穿透
- 再次查看公网服务器的FRP仪表板,现在应该能看到两个客户端在线(一个来自轻量服务器,一个来自NAS)。
- 在本地电脑浏览器访问
http://公网服务器IP:20000,应该能打开绿联NAS的Web管理登录界面。 - 重要:同样,强烈建议在NAS的防火墙或安全设置中,限制外网访问IP,并启用HTTPS和强密码认证。
6. 进阶配置:域名访问与HTTPS
通过IP+端口访问不够友好且不安全。我们可以使用域名并配置HTTPS。
6.1 域名解析与Nginx反向代理(推荐)
假设你有一个域名yourdomain.com,并且公网服务器上安装了Nginx。
- 域名解析:将域名(或子域名,如
nas.yourdomain.com,bt.yourdomain.com)的A记录指向你的公网服务器IP。 - 在公网服务器安装Nginx(如果未安装):
sudo apt install nginx或sudo yum install nginx。 - 配置Nginx反向代理:
以宝塔面板为例,为bt.yourdomain.com配置:
sudo vim /etc/nginx/conf.d/bt-proxy.conf添加以下配置:
server { listen 80; server_name bt.yourdomain.com; # 你的子域名 location / { proxy_pass http://127.0.0.1:10000; # 转发到FRP暴露的本地端口 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header X-Forwarded-Proto $scheme; proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; # 支持WebSocket,宝塔终端需要 proxy_read_timeout 300s; proxy_send_timeout 300s; } # 可选:限制访问IP # allow 你的办公室IP; # allow 你的家庭IP; # deny all; }为NAS配置类似 (nas.yourdomain.com代理到127.0.0.1:20000)。
- 重载Nginx:
sudo nginx -t && sudo systemctl reload nginx。 - 访问:现在你可以通过
http://bt.yourdomain.com访问宝塔面板,通过http://nas.yourdomain.com访问NAS。
6.2 配置HTTPS(使用Let‘s Encrypt免费证书)
使用Certbot可以轻松获取并自动续签证书。
# 安装Certbot (以Ubuntu为例) sudo apt update sudo apt install certbot python3-certbot-nginx # 为两个域名申请证书 sudo certbot --nginx -d bt.yourdomain.com -d nas.yourdomain.com按照提示操作,Certbot会自动修改Nginx配置,将HTTP重定向到HTTPS。完成后,即可通过https://bt.yourdomain.com安全访问。
7. 常见问题与排查思路
在配置过程中,你可能会遇到以下问题。这里提供一个系统的排查清单。
| 问题现象 | 可能原因 | 排查步骤 | 解决方案 |
|---|---|---|---|
| FRP服务端启动失败 | 1. 端口被占用 2. 配置文件语法错误 3. 权限不足 | 1.sudo systemctl status frps查看错误日志。2. sudo journalctl -u frps -f跟踪日志。3. sudo ss -tunlp | grep 7000检查端口占用。 | 1. 修改bind_port或停止占用程序。2. 检查 frps.ini的[common]等段落格式。3. 确保服务文件 ExecStart路径正确。 |
| 客户端无法连接服务端 | 1. 服务端IP/端口错误 2. 防火墙/安全组未放行 3. Token不匹配 4. 服务端未启动 | 1. 客户端执行frpc -c frpc.ini看具体报错。2. 在客户端 telnet 公网IP 7000测试连通性。3. 检查服务端和客户端 token是否完全一致。 | 1. 核对server_addr和server_port。2. 检查公网服务器安全组(阿里云/腾讯云控制台)和系统防火墙 ( firewall-cmd/ufw)。3. 确保token字符串一致(注意空格)。 |
| 能连接但访问不了服务 | 1. 远程端口未放行 2. 本地服务未运行或IP/端口错误 3. 客户端配置错误 | 1. 在公网服务器telnet 127.0.0.1 10000测试本地端口。2. 在客户端机器 curl 127.0.0.1:8888测试本地服务。3. 检查FRP仪表板,看对应代理是否在线。 | 1. 在公网服务器安全组放行remote_port(如10000)。2. 确保宝塔/NAS服务正在运行,且 local_ip和local_port正确。3. 重启客户端 sudo systemctl restart frpc。 |
| HTTPS访问不正常 | 1. 证书问题 2. Nginx配置错误 3. FRP不支持WebSocket | 1. 检查证书路径和有效期sudo certbot certificates。2. 检查Nginx错误日志 sudo tail -f /var/log/nginx/error.log。3. 宝塔终端等功能需要WebSocket。 | 1. 更新证书sudo certbot renew。2. 确保Nginx配置中包含了 proxy_set_header Upgrade和Connection指令。3. 在FRP客户端配置中,对于WebSocket服务可尝试 type = http并设置custom_domains。 |
| 连接不稳定,经常断开 | 1. 网络波动 2. 服务端/客户端资源不足 3. 心跳配置问题 | 1. 查看服务端和客户端日志中的断开信息。 2. 监控服务器CPU和内存使用情况。 | 1. 在[common]段增加心跳配置:tcp_mux = trueheartbeat_interval = 30heartbeat_timeout = 90。2. 考虑升级服务器配置或优化网络线路。 |
| NAS Docker容器无法启动 | 1. 配置文件路径错误 2. Docker服务未运行 3. 镜像拉取失败 | 1.docker logs frpc_nas查看容器日志。2. sudo systemctl status docker检查Docker服务。3. docker ps -a查看容器状态。 | 1. 确认-v挂载的配置文件路径绝对正确。2. 重启Docker服务。 3. 尝试指定镜像版本号,如 snowdreamtech/frpc:0.52.3。 |
8. 安全加固与最佳实践
将内网服务暴露到公网,安全是重中之重。请务必遵循以下实践:
- 使用高强度Token/密码:FRP服务端和客户端的
token、仪表板密码、宝塔面板密码、NAS密码均需使用随机生成的高强度密码。 - 限制访问来源:
- Nginx层面:在
server块中使用allow和deny指令,只允许你信任的IP段访问。 - 云服务器安全组:仅开放必要的端口(如80, 443, 7000),并对管理端口(如7500仪表板)设置源IP限制。
- 服务自身:宝塔面板、NAS管理界面都应设置IP白名单或失败登录锁定。
- Nginx层面:在
- 全程使用HTTPS:通过Nginx配置SSL证书,强制将所有HTTP流量重定向到HTTPS。避免在公网传输明文密码。
- 使用非标准端口:避免对FRP服务端端口(7000)和暴露的服务端口(如10000)使用22, 80, 443, 3389等常见端口。
- 定期更新:关注FRP的GitHub Release,定期更新服务端和客户端到稳定版本,修复潜在漏洞。
- 最小化暴露:只穿透绝对必要的服务。例如,不要轻易将NAS的SMB(445端口)暴露给公网,这存在较高风险。可以考虑使用SFTP或WebDAV over HTTPS作为替代。
- 监控与日志:定期检查FRP服务端和客户端的日志 (
frps.log,frpc.log),关注异常连接和登录失败信息。可以利用fail2ban等工具对异常访问进行封禁。 - 备份配置:将你的
frps.ini,frpc.ini, Nginx配置等文件进行备份。在服务器重置或迁移时能快速恢复。
9. 总结与扩展思路
通过本文的步骤,你已经成功搭建了一个基于FRP的、不依赖客户端公网IP的混合内网穿透架构。这个方案的核心优势在于其通用性和可控性。你不仅解决了阿里云轻量服务器无公网IP访问宝塔的问题,也实现了家庭绿联NAS的公网访问,所有流量都经由你完全掌控的公网服务器中转。
你可以进一步扩展这个架构:
- 穿透更多服务:将你内网开发的Web应用、数据库(谨慎!)、远程桌面、游戏服务器等统统纳入管理。
- 使用STCP模式增强安全:对于极度敏感的服务,可以使用FRP的
stcp(秘密TCP)模式,避免在服务端暴露任何端口,访问者也需要运行一个特定的frpc才能访问,实现点对点加密隧道。 - 负载均衡与高可用:如果你有多个公网服务器,可以在客户端配置多个
server_addr实现故障转移。或者部署多个FRP服务端做负载均衡。 - 与自动化运维结合:使用Ansible、SaltStack等工具批量部署和更新FRP客户端配置。
最后,记住技术是为需求服务的。在享受内网穿透带来的便利时,永远将安全性放在首位。定期审计你的配置和日志,不要让便利成为安全的短板。这套由你亲手搭建的穿透网络,将成为你管理分布式资源和服务的强大工具。