在 OpenWrt 路由器上使用 FRP 进行内网穿透来搭建网站,这可以让你将家里或办公室的设备(如 NAS、树莓派、个人电脑)上托管的网站,通过公网域名进行访问

### 整体架构 在开始之前,我们先理解整个流程的架构,这会让你对接下来的步骤有更清晰的认识: 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 评论