FRP(Fast Reverse Proxy)是一款开源的内网穿透工具,适用于将内网服务暴露到公网。它通过一个具有公网IP的服务器(如VPS)作为中转,将外部请求转发到内网设备(如家内群晖)。以下是使用FRP实现内网穿透的详细步骤:
1. FRP 的工作原理
- FRP 服务端(frps):运行在具有公网IP的服务器(如VPS)上,负责接收外部请求并将其转发到内网设备。
- FRP 客户端(frpc):运行在内网设备(如家内群晖)上,负责与服务端建立连接,并将服务端的请求转发到内网服务。
2. 准备工作
- VPS:一台具有公网IPv4地址的服务器。
- 家内群晖:确保群晖NAS可以通过内网访问。
- 域名(可选):如果需要通过域名访问,建议准备一个域名并解析到VPS的公网IP。
3. 在VPS上配置FRP服务端(frps)
3.1 下载FRP
访问FRP的GitHub发布页面,下载适合VPS操作系统的版本:
https://github.com/fatedier/frp/releases
例如,下载Linux版本:
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_amd64.tar.gz
tar -zxvf frp_0.51.3_linux_amd64.tar.gz
cd frp_0.51.3_linux_amd64
3.2 配置FRP服务端
编辑frps.ini文件:
[common]
bind_port = 7000 # FRP服务端监听的端口
token = your_token # 客户端连接时的认证令牌(可选但推荐)
bind_port:FRP服务端与客户端通信的端口。token:用于客户端和服务端之间的认证,增加安全性。
3.3 启动FRP服务端
运行以下命令启动FRP服务端:
./frps -c frps.ini
3.4 设置FRP服务端开机自启(可选)
编辑系统服务文件(如/etc/systemd/system/frps.service):
[Unit]
Description=FRP Server
After=network.target
[Service]
ExecStart=/path/to/frps -c /path/to/frps.ini
Restart=on-failure
[Install]
WantedBy=multi-user.target
启用并启动服务:
sudo systemctl enable frps
sudo systemctl start frps
4. 在家内群晖上配置FRP客户端(frpc)
4.1 下载FRP客户端
在群晖NAS上下载适合的FRP版本(如Linux ARM版本):
wget https://github.com/fatedier/frp/releases/download/v0.51.3/frp_0.51.3_linux_arm.tar.gz
tar -zxvf frp_0.51.3_linux_arm.tar.gz
cd frp_0.51.3_linux_arm
4.2 配置FRP客户端
编辑frpc.ini文件:
[common]
server_addr = your_vps_ip # VPS的公网IP
server_port = 7000 # FRP服务端的端口
token = your_token # 与服务端一致的认证令牌
[synology] # 自定义名称
type = http # 协议类型
local_ip = 192.168.1.100 # 家内群晖的内网IP
local_port = 5000 # 家内群晖的服务端口
remote_port = 8080 # 在VPS上暴露的端口
custom_domains = yourdomain.com # 绑定的域名(可选)
server_addr:VPS的公网IP。server_port:与服务端bind_port一致。local_ip和local_port:家内群晖的内网IP和服务端口。remote_port:在VPS上暴露的端口,外部通过该端口访问。custom_domains:如果使用域名,将其解析到VPS的公网IP。
4.3 启动FRP客户端
运行以下命令启动FRP客户端:
./frpc -c frpc.ini
4.4 设置FRP客户端开机自启(可选)
在群晖NAS上,可以通过计划任务或Docker容器实现FRP客户端的开机自启。
5. 配置Nginx反向代理(可选)
如果希望通过域名访问,可以在VPS上配置Nginx反向代理:
server {
listen 80;
server_name yourdomain.com;
location / {
proxy_pass http://127.0.0.1:8080; # 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;
}
}
yourdomain.com:替换为你的域名。8080:FRP客户端配置中remote_port的值。
6. 测试访问
- 通过浏览器访问
http://yourdomain.com或http://your_vps_ip:8080,确保能够访问家内群晖。
7. 安全性增强
- 启用HTTPS:
- 使用Let’s Encrypt为域名配置SSL证书。
- 在Nginx中启用HTTPS监听。
- 限制访问:
- 在VPS上配置防火墙,仅允许必要的端口(如80、443、7000)。
- 使用FRP的
token认证,确保只有合法的客户端可以连接。
- 日志监控:
- 定期检查FRP服务端和客户端的日志,排查异常连接。
总结
通过FRP实现内网穿透,可以安全地将家内群晖暴露到公网。FRP配置简单、灵活,适合没有公网IPv4或IPv6的家庭网络。结合Nginx反向代理和SSL/TLS加密,可以进一步提升安全性和访问体验。
