OpenWrt 的 Frp 使用记录 2024-05-19 程序之旅,生活,记录 暂无评论 376 次阅读 ## OpenWrt 的 Frp 使用记录 前些日子使用了树莓派刷了 openwrt 系统,作为代理的网关使用,还是使用 nas 安装了 SmartDNS 对数据进行分流。这几天家里宽带到期,在网购了一个电信套餐,发现现在动态的 Ip 分配需要付费,需要 多100 元一个月,家里的 Nas 就不能进行 DDNS 映射,之前有使用 Frp 的经验,现在基于原有的经验基础上再进行拓展使用。需要让 Nginx 根据不同的子域名分别转发到不同的内部端口。 ### Frps 搭建 这里直接使用 docker,方便,使用的版本与 OpenWrt 的 Frp 客户端版本一致 0.42.0。 创建文件目录 ```shell mkdir -p /home/frp cd /home/frp ``` 容器构建 ```yaml version: '3' services: frps: image: snowdreamtech/frps:0.42.0 container_name: frps ports: - "7000:7000" # frps 服务端监听端口 - "7500:7500" # 仪表板端口 - "8080:8080" # HTTP 虚拟主机端口 - "4433:4433" # HTTPS 虚拟主机端口 - "13306:13306" volumes: - "./frps.ini:/etc/frp/frps.ini" # 挂载 frps.ini 配置文件 environment: - TZ=Asia/Shanghai # 设置时区为亚洲/上海 restart: unless-stopped ``` 同级目录下,创建配置文件 ```ini # frps.ini [common] bind_addr = 0.0.0.0 bind_port = 7000 dashboard_addr = 0.0.0.0 dashboard_port = 7500 dashboard_user = admin dashboard_pwd = XXXXXXX vhost_http_port = 8080 vhost_https_port = 4433 log_file = ./frps.log log_level = info log_max_days = 3 token = XXXXX ``` 配置说明 - `bind_addr = 0.0.0.0`:这是frps监听的地址。0.0.0.0表示它将监听所有的网络接口。 - `bind_port = 7000`:这是frps监听的端口。在这个例子中,它监听7000端口。 - `dashboard_addr = 0.0.0.0`:这是frps的仪表板地址。0.0.0.0表示仪表板将在所有网络接口上可用。 - `dashboard_port = 7500`:这是frps的仪表板端口。在这个例子中,仪表板在7500端口上可用。 - `dashboard_user = admin`:这是用于登录frps仪表板的用户名。 - `dashboard_pwd = XXXXXXX`:这是用于登录frps仪表板的密码。 - `vhost_http_port = 8080`:这是frps用于HTTP虚拟主机的端口。 - `vhost_https_port = 4433`:这是frps用于HTTPS虚拟主机的端口。 - `log_file = ./frps.log`:这是frps的日志文件路径。 - `log_level = info`:这是frps的日志级别。在这个例子中,级别设置为info,这意味着它将记录信息级别的日志。 - `log_max_days = 3`:这是frps保留日志文件的最大天数。 - `token = XXXXX`:这是用于客户端和服务器之间进行身份验证的令牌。 执行命令构建容器 ```shell docker-compose up -d ``` http://ip:7500 如果能登录说明构建成功。 ![image-20240519082239615](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20240519082239615.png) ### Frpc 的配置 OpenWrt 已经集成了客户端,只需要配置即可。按照服务器的配置参数配置: ![image-20240519082350330](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20240519082350330.png) 服务器这里我直接填的是 ip,如果可以也能使用域名 ### 添加服务列表 给不同的内网服务分发子域名,自定义域名可以在 DNS 解析到 Frps 服务器,然后使用 Nginx 进行转发。 ![image-20240519082702344](https://mufeng-blog.oss-cn-beijing.aliyuncs.com/typecho/image-20240519082702344.png) 使用服务器的 Nginx 实现基于子域名将HTTPS请求分发到不同的内部应用 ```properties server { listen 443 ssl http2; server_name xxx.badguy.top; charset utf-8; ssl_certificate_key /root/.acme.sh/*.badguy.top_ecc/*.badguy.top.key; ssl_certificate /root/.acme.sh/*.badguy.top_ecc/fullchain.cer; ssl_protocols TLSv1.2 TLSv1.3; ssl_ciphers 'HIGH:!aNULL:!MD5'; ssl_prefer_server_ciphers on; location / { proxy_pass http://localhost: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; } } ``` 配置中的 server_name xxx.badguy.top; 是对应内网的域名,根据需要进行填写,这里使用的 ssl 证书是通配符,适用于所有的子域名。 ```shell nginx -t nginx -s reload ``` 完成配置 ### 问题记录 在数据库和 nextcloud 的内网穿透的时候遇到些许问题。 数据库直接使用 TCP 协议,开一个端口进行映射,不走 Http 协议。 nextcloud 需要添加域名信任和重写 https 协议。在配置文件 conf.php 中添加两项: - 'trusted_domains' => 添加 Frps 的 ip - 'overwriteprotocol' => 'https', 第一项是用于登录信任服务器,第二项用于手机端 https 登录时候出现的格模式不允许http 打赏: 微信, 支付宝 标签: nginx, docker, nextcloud, mysql, OpenWrt, Frp 本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。