
### 整体架构
在开始之前,我们先理解整个流程的架构,这会让你对接下来的步骤有更清晰的认识:
1. **访问者**: 你的网站用户,在互联网上任何地方。
2. **云服务器 (VPS)**: 拥有一枚**公网 IP**,作为 FRP 的**服务端 (frps)**。它是所有流量的中转站。
3. **你的域名**: 解析到你的云服务器公网 IP。
4. **OpenWrt 路由器**: 运行 FRP 的**客户端 (frpc)**,它会主动连接云服务器。
5. **内网 Web 服务器**: 运行在你家局域网内的一台设备(比如树莓派、NAS 或一台电脑),上面部署了你的网站程序。
**数据流向**: `访问者` -> `域名` -> `云服务器(frps)` -> `OpenWrt(frpc)` -> `内网 Web 服务器`
---
### 前提条件
1. **一台拥有公网 IP 的云服务器 (VPS)**
* 服务商:阿里云、腾讯云、Vultr、DigitalOcean 等都可以。
* 系统:建议使用主流的 Linux 发行版,如 `Ubuntu` 或 `Debian`。
* 配置:最低配置即可,1核 CPU / 512MB 内存就足够运行 FRP。
2. **一个你自己的域名**
* 例如 `www.yourdomain.com`。并准备好随时修改它的 DNS 解析。
3. **一台刷了 OpenWrt 的路由器**
* 确保可以正常上网,并且有权限安装软件。
4. **一台内网的设备作为 Web 服务器**
* 可以是任何设备,只要能运行 Web 服务(如 Nginx, Apache, Caddy, Node.js, Python HTTP Server 等)。
* 记下这台设备的**内网 IP 地址**(例如 `192.168.1.101`)。
---
### 第一步:配置云服务器 (FRP 服务端, frps)
这部分操作在你的云服务器上完成。
1. **登录你的云服务器**
使用 SSH 工具(如 PuTTY, Xshell, Termius)登录。
2. **下载并解压 FRP**
* 访问 FRP 的 GitHub Releases 页面: [https://github.com/fatedier/frp/releases](https://github.com/fatedier/frp/releases)
* 找到最新的版本,并选择适合你服务器 CPU 架构的版本。大部分 VPS 都是 `linux_amd64`。
```bash
# 获取最新版本链接(请自行替换为最新版)
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
```
3. **配置 FRP 服务端 (frps.ini)**
编辑 `frps.ini` 文件,这是服务端的配置文件。
```bash
vim frps.ini
```
将其内容修改为如下(这是一个最小化但足够强大的配置):
```ini
# frps.ini
[common]
# frp 服务端与客户端通信的端口,可以自定义
bind_port = 7000
# 让 frp 支持通过域名访问网站,这里设置的端口是访问者访问的端口
# 比如你希望通过 http://www.yourdomain.com:8080 访问,就设置为 8080
# 如果想直接用 http://www.yourdomain.com 访问,就设置为 80
vhost_http_port = 8080
# frp 的状态监控面板,方便你查看连接状态
dashboard_port = 7500
dashboard_user = admin
dashboard_pwd = your_secure_password # 请务必修改为一个复杂的密码
# 认证令牌,frpc 连接时必须携带此令牌,确保安全
token = your_secure_token # 请务必修改为一个复杂的token
```
**配置解释**:
* `bind_port`: FRP 客户端和服务端之间“握手”的端口。
* `vhost_http_port`: 你的网站最终通过公网访问的端口。
* `dashboard_...`: 一个 Web UI,可以通过 `http://你的公网IP:7500` 访问,查看客户端连接情况。
* `token`: 一个简单的密码,防止其他人滥用你的 FRP 服务。
4. **开放服务器防火墙端口**
你的云服务器通常有防火墙(如 `ufw`, `firewalld`)或安全组。你需要放行上面配置中用到的所有端口。
* `7000` (用于 frpc 连接)
* `8080` (用于网站访问)
* `7500` (用于 Dashboard 监控)
以 `ufw` (Ubuntu/Debian) 为例:
```bash
sudo ufw allow 7000
sudo ufw allow 8080
sudo ufw allow 7500
sudo ufw status
```
5. **运行 FRP 服务端**
* **前台测试运行**:
```bash
./frps -c ./frps.ini
```
如果没有报错,说明配置正确。按 `Ctrl + C` 停止。
* **后台长期运行 (使用 systemd)**:
创建一个 systemd 服务文件,让 frps 可以开机自启,稳定运行。
```bash
sudo vim /etc/systemd/system/frps.service
```
写入以下内容(注意 `ExecStart` 的路径要换成你自己的绝对路径):
```ini
[Unit]
Description=FRP Server
After=network.target
[Service]
Type=simple
User=nobody
Restart=on-failure
RestartSec=5s
# 注意这里的路径!修改为你自己的 frps 文件所在路径
ExecStart=/root/frp_0.52.3_linux_amd64/frps -c /root/frp_0.52.3_linux_amd64/frps.ini
[Install]
WantedBy=multi-user.target
```
然后启动并设置开机自启:
```bash
sudo systemctl enable frps
sudo systemctl start frps
sudo systemctl status frps # 查看状态,确保是 active (running)
```
---
### 第二步:配置内网 Web 服务器
这部分在你局域网内准备用来跑网站的设备上操作。
1. **获取内网 IP**
例如,你的树莓派 IP 是 `192.168.1.101`。
2. **搭建一个简单的网站用于测试**
如果你已经有网站了,确保它在运行。如果没有,可以用 Python 快速启动一个。
* 创建一个目录 `my_website`。
* 在里面创建一个文件 `index.html`。
```html
Welcome from FRP!
Hello, World! My site is tunneled by FRP on OpenWrt!
```
* 在该目录下,用 Python 启动一个 HTTP 服务器,监听 `8000` 端口。
```bash
# Python 3
python3 -m http.server 8000
```
* **本地测试**: 在局域网内其他电脑上访问 `http://192.168.1.101:8000`,如果能看到 "Hello, World!" 页面,说明 Web 服务器工作正常。
---
### 第三步:配置 OpenWrt 路由器 (FRP 客户端, frpc)
这部分在你的 OpenWrt 路由器的管理界面操作。
1. **安装 FRP 客户端插件**
* 登录 OpenWrt LuCI 管理界面(通常是 `192.168.1.1`)。
* 进入 `系统` -> `软件包`。
* 点击 `更新列表`,等待列表刷新完成。
* 在 `筛选` 框中输入 `frpc`,然后找到 `luci-app-frpc` 并点击 `安装`。系统会自动安装 `frpc` 核心程序和 LuCI 界面。
2. **配置 FRP 客户端**
* 安装完成后,刷新页面,在 `服务` 菜单下应该会出现 `FRP 客户端`。点击进入。
* **常规设置 (General Settings)**:
* 勾选 `启用`。
* `服务器地址`: 填写你**云服务器的公网 IP**。
* `服务器端口`: 填写 `7000` (与 `frps.ini` 中的 `bind_port` 一致)。
* `通讯协议`: `TCP`。
* `认证令牌`: 填写 `your_secure_token` (与 `frps.ini` 中的 `token` 一致)。
* 其他保持默认。
* **代理列表 (Proxies)**:
这里是关键,我们要添加一条规则,告诉 frp 把哪个内网服务穿透出去。
* 点击下方的 `添加`。
* **基本设置**:
* `代理名称`: 随便起一个,比如 `my_website`。
* `代理类型`: 选择 `http`。
* `本地 IP 地址`: 填写你内网 Web 服务器的 IP,即 `192.168.1.101`。
* `本地端口`: 填写你内网 Web 服务器的端口,即 `8000`。
* `使用加密`: 建议勾选。
* `使用压缩`: 建议勾选。
* **域名设置**:
* `自定义域名`: 填写你**准备使用的完整域名**,例如 `www.yourdomain.com`。frps 会根据这个域名来区分不同的网站请求。
* **保存并应用**: 点击页面最下方的 `保存并应用`。
---
### 第四步:域名解析和最终测试
1. **修改域名解析**
* 登录你的域名注册商(如 GoDaddy, NameSilo, 阿里云等)的管理后台。
* 找到 DNS 解析设置。
* 添加一条 `A` 记录:
* **主机记录 (Host/Name)**: `www` (如果你想用 `www.yourdomain.com`)
* **记录类型 (Type)**: `A`
* **记录值 (Value/Points to)**: 填写你**云服务器的公网 IP**。
* **TTL**: 默认即可。
* 保存。DNS 解析全球生效可能需要几分钟到几小时不等。
2. **最终测试**
* **检查状态**:
* 在 OpenWrt 的 `FRP 客户端` -> `状态` 页面,你应该能看到你的 `my_website` 代理状态是 `运行中`。
* 在云服务器上访问你的 Dashboard: `http://你的公网IP:7500`,用你设置的用户名和密码登录,你应该能看到有一个客户端连接,并且 `http` 代理列表中有 `www.yourdomain.com`。
* **访问网站**:
等待 DNS 生效后,在浏览器中输入 `http://www.yourdomain.com:8080` (注意,端口是你在 `frps.ini` 中设置的 `vhost_http_port`)。
如果一切顺利,你将看到你的 "Hello, World!" 网站页面!
### 进阶:使用 HTTPS (更安全)
直接通过 FRP 配置 HTTPS 较为复杂,推荐在云服务器端使用 Nginx 作为反向代理来处理 SSL 证书,这是业界标准做法。
**思路**: `访问者` -> `(443/HTTPS)` -> `Nginx (SSL解密)` -> `(HTTP)` -> `frps (vhost_http_port)` -> ...
1. **在云服务器上安装 Nginx 和 Certbot (Let's Encrypt 工具)**
```bash
sudo apt update
sudo apt install nginx python3-certbot-nginx -y
```
2. **确保防火墙开放 80 和 443 端口**
```bash
sudo ufw allow 80
sudo ufw allow 443
```
3. **使用 Certbot 自动获取并配置 SSL 证书**
```bash
# 运行此命令,Certbot 会自动检测 Nginx 配置并引导你为 www.yourdomain.com 申请证书
sudo certbot --nginx -d www.yourdomain.com
```
按照提示操作,它会自动修改 Nginx 配置以启用 HTTPS。
4. **修改 Nginx 配置,反向代理到 frps**
Certbot 生成的配置文件通常在 `/etc/nginx/sites-available/default` 或类似位置。编辑它:
```bash
sudo vim /etc/nginx/sites-enabled/default
```
找到 `server` 块中关于 `location /` 的部分,修改为如下内容:
```nginx
location / {
# proxy_pass 到你的 frps 的 vhost_http_port
proxy_pass http://127.0.0.1:8080;
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;
}
```
5. **重启 Nginx**
```bash
sudo systemctl restart nginx
```
现在,你可以直接通过 `https://www.yourdomain.com` (无端口号) 来访问你的网站了,并且带上了安全小绿锁!
0 评论