差别
这里会显示出您选择的修订版和当前版本之间的差别。
两侧同时换到之前的修订记录 前一修订版 后一修订版 | 前一修订版 | ||
is:cos:centos服务搭建-04-运用frps服务搭建黑群晖nas的frpc [2025/02/17 04:02] – 移除 - 外部编辑 (未知日期) 127.0.0.1 | is:cos:centos服务搭建-04-运用frps服务搭建黑群晖nas的frpc [2025/03/07 12:30] (当前版本) – [搭建手记] A.L | ||
---|---|---|---|
行 1: | 行 1: | ||
+ | 概述: | ||
+ | * FRP (Fast Reservation Protocol高性能反向代理应用):内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。 | ||
+ | * 作用 | ||
+ | * 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。 | ||
+ | * 对于 http 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。 | ||
+ | * 利用处于内网或防火墙后的机器,对外网环境提供 tcp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。 | ||
+ | * 可查看通过代理的所有 http 请求和响应的详细信息。(待开发) | ||
+ | ====== CentOS 7安装frps端 ====== | ||
+ | * 本次安装服务应用于群晖系统,客户端为frpc0.26.0,因此,frps端使用同版本 | ||
+ | < | ||
+ | # su获取root | ||
+ | # wget https:// | ||
+ | # wget https:// | ||
+ | # wget https:// | ||
+ | # 解压:tar xf frp_0.26.0_linux_amd64.tar.gz | ||
+ | # 改名:mv frp_0.26.0_linux_amd64 frp | ||
+ | # 进入目录:cd frp | ||
+ | # 删除没用的客户端文件:rm -f frpc* | ||
+ | # 配置文件:vim frps.ini | ||
+ | # 编辑ini文件 按ins进入编辑(精简) | ||
+ | </ | ||
+ | |||
+ | ===== 《frps.ini》文档 ===== | ||
+ | < | ||
+ | [common] | ||
+ | bind_addr = xxx.xxx.xxx.xxx # frps内网服务器地址,如果有防火墙的话,设置下述端口映射 | ||
+ | bind_port = xxxxx # frps服务端口 | ||
+ | bind_udp_port = xxxx # udp服务端口 | ||
+ | vhost_http_port = xxxxx # http服务端口 | ||
+ | vhost_https_port = xxxxx # https服务端口 | ||
+ | privilege_token = xxxxxxxx # 握手密钥 | ||
+ | subdomain_host = xxxx.xxx # 填写顶级域名,意味着对应frpc的2级域名代理启用 | ||
+ | dashboard_port = xxxx # 服务器面板端口 | ||
+ | dashboard_user = xxxxx # 服务器面板用户 | ||
+ | dashboard_pwd = xxxxxxx # 服务器面板密码 | ||
+ | log_file = ./ | ||
+ | log_level = info | ||
+ | log_max_days = 3 | ||
+ | </ | ||
+ | |||
+ | ===== frps的调试 ===== | ||
+ | * 临时运行: | ||
+ | < | ||
+ | * 一次性开机运行: | ||
+ | < | ||
+ | * 命令启动之后如果不重启VPS就会一直运行,以下操作可以省略。只需要在服务器重启之后,重新cd到程序目录,输入一次nohup ./frps -c ./frps.ini & | ||
+ | * 停止:先找到这个进程,使用ps -ef 查看进程ID | ||
+ | < | ||
+ | * 然后: | ||
+ | < | ||
+ | |||
+ | ===== frps.service自启动文档 ===== | ||
+ | * 新建frps目录: | ||
+ | < | ||
+ | * 拷贝frps.ini 到/ | ||
+ | < | ||
+ | * 拷贝frps到/ | ||
+ | < | ||
+ | * frps.service文档保存于: | ||
+ | < | ||
+ | * 使用systemd配置开机自启(适用于 centos7 Ubuntu 16 或 debian 8) | ||
+ | < | ||
+ | |||
+ | ==== 《frps.service》文档 ==== | ||
+ | * 注意点:/ | ||
+ | * 注意点:/ | ||
+ | < | ||
+ | [Unit] | ||
+ | Description=frps Dgn | ||
+ | After=network.target | ||
+ | |||
+ | [Service] | ||
+ | Type=simple | ||
+ | # User=root | ||
+ | ExecStart=/ | ||
+ | # / | ||
+ | # / | ||
+ | |||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | </ | ||
+ | |||
+ | ===== frps.service自启动 ===== | ||
+ | * vim编辑退出:Esc,# | ||
+ | * 启动并设为开机自启。 | ||
+ | < | ||
+ | sudo systemctl start frps | ||
+ | # (把start改为stop即终止frps) | ||
+ | sudo systemctl enable frps | ||
+ | systemctl status frps | ||
+ | # 查看frps状态 | ||
+ | </ | ||
+ | * Centos6.5及以下版本frps自启动 | ||
+ | < | ||
+ | vi / | ||
+ | # 在最下面加一行/ | ||
+ | # 其中 / | ||
+ | </ | ||
+ | |||
+ | ==== frps.service自启动进程查看 ==== | ||
+ | * 查看frp是否启动: | ||
+ | < | ||
+ | * 查看frp启动状态 | ||
+ | < | ||
+ | |||
+ | ===== frps服务下的防火墙端口开启 ===== | ||
+ | * 开启端口 | ||
+ | < | ||
+ | firewall-cmd --permanent --add-port=xxxx/ | ||
+ | firewall-cmd --permanent --add-port=xxxx/ | ||
+ | firewall-cmd --permanent --add-port=xxxx/ | ||
+ | firewall-cmd --permanent --add-port=xxxx/ | ||
+ | firewall-cmd --permanent --add-port=xxxx/ | ||
+ | firewall-cmd --permanent --add-port=xxxx/ | ||
+ | firewall-cmd --reload # | ||
+ | firewall-cmd --list-all # 查看防火墙规则 | ||
+ | </ | ||
+ | * ssh端口开启(按需):公网服务器防火墙允许对应端口的流量通过,所以需要配置防火墙: | ||
+ | < | ||
+ | firewall-cmd --zone=public --add-port=10067/ | ||
+ | firewall-cmd --reload | ||
+ | </ | ||
+ | * 内网机器上面执行 tail -f nohup.out 查看启动命令的执行结果akerlu | ||
+ | |||
+ | ==== firewall常用命令 ==== | ||
+ | * 安装firewall命令 | ||
+ | < | ||
+ | * Firewall开启常见端口命令 | ||
+ | < | ||
+ | firewall-cmd --zone=public --add-port=80/ | ||
+ | firewall-cmd --zone=public --add-port=443/ | ||
+ | firewall-cmd --zone=public --add-port=22/ | ||
+ | firewall-cmd --zone=public --add-port=53/ | ||
+ | </ | ||
+ | * Firewall关闭常见端口命令 | ||
+ | < | ||
+ | firewall-cmd --zone=public --remove-port=80/ | ||
+ | firewall-cmd --zone=public --remove-port=443/ | ||
+ | firewall-cmd --zone=public --remove-port=22/ | ||
+ | firewall-cmd --zone=public --remove-port=53/ | ||
+ | </ | ||
+ | * 指定特定源IP访问某端口 | ||
+ | < | ||
+ | firewall-cmd --permanent --add-rich-rule=" | ||
+ | # | ||
+ | firewall-cmd --permanent --add-rich-rule=" | ||
+ | # | ||
+ | firewall-cmd --permanent --remove-rich-rule=" | ||
+ | # | ||
+ | </ | ||
+ | * 指定特定源IP开放所有端口 | ||
+ | < | ||
+ | firewall-cmd --permanent --add-rich-rule=" | ||
+ | firewall-cmd --reload | ||
+ | </ | ||
+ | * 批量添加区间端口 | ||
+ | < | ||
+ | firewall-cmd --zone=public --add-port=4400-4600/ | ||
+ | firewall-cmd --zone=public --add-port=4400-4600/ | ||
+ | </ | ||
+ | * 查看端口列表: | ||
+ | < | ||
+ | firewall-cmd --permanent --list-ports | ||
+ | firewall-cmd --permanent --list-all | ||
+ | firewall-cmd --permanent --list-rich-rules | ||
+ | </ | ||
+ | * 其他常用命令 | ||
+ | * 启动服务:systemctl start firewalld | ||
+ | * 关闭服务:systemctl stop firewalld | ||
+ | * 重启服务:systemctl restart firewalld、firewall-cmd --reload | ||
+ | * 查看服务状态:systemctl status firewalld、firewall-cmd --state | ||
+ | * 开机自启服务:systemctl enable firewalld | ||
+ | * 开机禁用服务:systemctl disable firewalld | ||
+ | * 查看是否开机自启:systemctl is-enable firewalld | ||
+ | |||
+ | ====== NAS端安装FRPC ====== | ||
+ | * 下载安装docker | ||
+ | * docker注册表,选用frpc 0.26.0版本(可自行选择容易下载的版本,但服务端frps必须对应同版本或者同大版本号的,如:0.34.1的话,可以用0.34.2) | ||
+ | * docker注册表下载后,在映像中可以看到。选择映像中的frpc进行启动编辑,启动编辑省略,可以参考github中的导航说明。 | ||
+ | * 配置frpc.ini,本次基于frpc 0.26.0版本 | ||
+ | |||
+ | |||
+ | ===== 《frpc.ini》文档 ===== | ||
+ | < | ||
+ | [common] | ||
+ | server_addr = xxx.xxx.xxx.xxx | ||
+ | # 服务器地址 | ||
+ | server_port = xxxx | ||
+ | # 服务器端口 | ||
+ | privilege_token = xxxxxx | ||
+ | # token = xxxxxx 有些服务端版本采用这个字节,多数采用“privilege_token”字节,token理解为密码 | ||
+ | protocol = tcp | ||
+ | |||
+ | [http] | ||
+ | type = http | ||
+ | # http协议orhttps协议,如果两个都要的话就单独复制一段[https] | ||
+ | local_ip = 192.168.x.xx | ||
+ | # 群晖的内网IP | ||
+ | local_port = xxxxx | ||
+ | # 你自己的web服务器端口 | ||
+ | custom_domains = xxxxxxx.xxx | ||
+ | # 如果你有自己的域名,可以设置你自己的域名,先将自己的顶级域名解析到frp服务器域名(如二级域名的话用CNAME记录,不要用A记录) | ||
+ | #subdomain = nas | ||
+ | # 全局下唯一的子域名,你的访问地址将会是http:// | ||
+ | # 此外,顶级域名需要在域名系统上做好CNAME的泛解析,否则不可用。HOST:*.xxx.xxx;Value:xxx.xxx。 | ||
+ | |||
+ | [ssh] | ||
+ | type = tcp | ||
+ | local_ip = 192.168.x.xxx | ||
+ | local_port = xxxxxx | ||
+ | # 需要转发到的端口,ssh端口默认是22 | ||
+ | remote_port = xxxxxx | ||
+ | # frp服务端的远程监听端口,即你访问服务端的remote_port就相当于访问客户端的 local_port,如果填0则会随机分配一个端口 | ||
+ | |||
+ | #[DSM] | ||
+ | # type = tcp # tcp协议 | ||
+ | # local_ip = 192.168.x.xxx | ||
+ | # 127.0.0.1指穿透本机, | ||
+ | # local_port = xxxxxx | ||
+ | # 群晖内网HTTP端口, | ||
+ | # remote_port = xxxx | ||
+ | # 映射到外网端口,暴露给服务器,这个客户端必须唯一 | ||
+ | # subdomain = nas | ||
+ | # 全局下唯一的子域名,你的访问地址将会是http:// | ||
+ | # 此外,顶级域名需要在域名系统上做好CNAME的泛解析,否则不可用。HOST:*.xxx.xxx;Value:xxx.xxx。 | ||
+ | </ | ||
+ | |||
+ | ====== FRPC配置文件frpc.ini详解 ====== | ||
+ | frpc 是一款轻量级的反向代理客户端,用于实现内网穿透功能。它需要与 frps 服务端配合使用。以下是 frpc 的配置文件格式和示例。 | ||
+ | ==== 1. 配置文件格式 ==== | ||
+ | 从 frp 0.52.0 版本开始,支持 TOML、YAML 和 JSON 配置文件格式,并逐渐弃用 INI 格式。以下以 **TOML 格式** 为例进行说明。 | ||
+ | ==== 2. 配置文件示例 ==== | ||
+ | 以下是 frpc 的基本配置文件示例,用于将本地的 SSH 服务(端口 22)映射到公网: | ||
+ | <code toml> | ||
+ | # frpc.toml 配置文件示例 | ||
+ | # 服务端基本信息 | ||
+ | serverAddr = " | ||
+ | serverPort = 7000 # frps 服务端监听的端口 | ||
+ | auth.method = " | ||
+ | auth.token = " | ||
+ | # 是否启用 TLS 加密 | ||
+ | transport.tls.enable = false | ||
+ | # 定义一个隧道 | ||
+ | [[proxies]] | ||
+ | name = " | ||
+ | type = " | ||
+ | localIP = " | ||
+ | localPort = 22 # 本地服务的端口 | ||
+ | remotePort = 20022 # 远程映射的端口 | ||
+ | </ | ||
+ | ==== 3. 配置文件说明 ==== | ||
+ | - **serverAddr 和 serverPort**:指定 frps 服务端的地址和端口[^39^]。 | ||
+ | - **auth.token**:用于与服务端进行身份验证,确保连接的安全性[^39^]。 | ||
+ | - **[[proxies]]**:定义一个或多个隧道,每个隧道可以配置不同的服务类型和端口[^39^]。 | ||
+ | - **type**:支持多种协议类型,如 tcp、http、https 等[^39^]。 | ||
+ | - **localIP 和 localPort**:指定本地服务的 IP 和端口[^39^]。 | ||
+ | - **remotePort**:指定远程映射的端口,用于从公网访问本地服务[^39^]。 | ||
+ | ==== 4. 配置文件路径 ==== | ||
+ | 通常,frpc 的配置文件(如 `frpc.toml`)放置在 `/ | ||
+ | <code bash> | ||
+ | mkdir -p / | ||
+ | cd / | ||
+ | vim frpc.toml | ||
+ | </ | ||
+ | ==== 5. 启动 frpc ==== | ||
+ | 配置完成后,使用以下命令启动 frpc: | ||
+ | <code bash> | ||
+ | ./frpc -c frpc.toml | ||
+ | </ | ||
+ | 或者使用 systemd 管理服务[^41^]: | ||
+ | <code bash> | ||
+ | # 创建 systemd 服务文件 | ||
+ | vi / | ||
+ | # 添加以下内容 | ||
+ | [Unit] | ||
+ | Description=frpc service | ||
+ | After=network.target | ||
+ | [Service] | ||
+ | Type=simple | ||
+ | ExecStart=/ | ||
+ | [Install] | ||
+ | WantedBy=multi-user.target | ||
+ | # 启动服务 | ||
+ | systemctl start frpc | ||
+ | systemctl enable frpc | ||
+ | </ | ||
+ | 通过以上步骤,你可以在 CentOS 中完成 frpc 的配置,实现内网服务的外网访问[^41^]。 | ||
+ | |||
+ | |||
+ | |||
+ | ====== 搭建手记 ====== | ||
+ | 大鹿搭建frp反向代理服务的背景: | ||
+ | * 一台私有nas需要安装在农村老家的东方有线光纤宽带下,而经过确认和尝试,获取的DDNS是111.214的,也就是东方有线的私网,无法穿透。 | ||
+ | * 和东方有线在自家院子里冒着12月的寒风电话沟通三巡,无法提供公网IP,哪怕是动态的,似乎他们的客服完全不懂,此处万马奔腾…… | ||
+ | * 晚上在网上查询了多种方法,其中花生壳的付费和硬件模式(花生棒、花生盒子)想过尝试,但是最终还是不能接受这种太过受制于人的方式。 | ||
+ | * 最终发现了frp这个从不知道的事物。初步构想是在晚上躺在农村的床上想到的:企业固定IP + 自建的CentOS,或者上海市区的电信公网IP(市区里装的早,刚发现提供了公网IP,良心!)两套方案,最终决定第一种。 | ||
+ | * 周末后周一到公司,利用非工作的午休和晚间时间,启动了安装和搭建调试: | ||
+ | * NAS搭建docker以及docker容器的frpc; | ||
+ | * CentOS本来是当热备机和bbs服务器的,负载几乎是0.x%级别的,所以通过内网ssh搭建了frps; | ||
+ | * CentOS开放firewall; | ||
+ | * AF开放frps端口; | ||
+ | * 当晚宿舍调试握手,成功! | ||
+ | * 第二日,记录了本次搭建和调试的笔记,或许哪一天我的孩子或者朋友需要参考。 | ||
+ | |||
+ | ===== 2025/3/7 复习群晖nas中的设置步骤 ===== | ||
+ | - 高级设置 | ||
+ | - 使用高权限执行容器 | ||
+ | - 容器名称 oldiy-frpc1 | ||
+ | - CPU优先顺序 自动 | ||
+ | - 内存限制 无限制 | ||
+ | - 存储空间 | ||
+ | - 添加frpc配置文件的路径 | ||
+ | - 但是需要注意的是,装载路径:/ | ||
+ | - 网络 | ||
+ | - 端口设置 | ||
+ | - 链接 | ||
+ | - 环境 | ||
+ | - 可变 | ||
+ | - PATH / | ||
+ | - FRP_VERSION 0.26.0 | ||
+ | - entrypoint:的执行命令 | ||
+ | - /bin/sh -c /frpc -c / | ||
+ | |||
+ | |||
+ | ===== 2025/02/18 frps服务器搬迁到阿里云ECS ===== | ||
+ | |||
+ | FRPS使用0.53.2版本,FRPC依旧采用0.26.0 | ||
+ | - 注意点: | ||
+ | - FRPS端使用toml文件,文字类加“"" | ||
+ | - FRPC端重新配置,修改域名 | ||
+ | - 注意域名要有泛解析:CNAME | ||
+ | - 注意如果保留原本frpc.ini的话,首先移出docker位置,启动成功后再保存回来,或者备份到别的地址,不要放两个*.ini在一个位置,哪怕名字不一样,什么原因不清楚。 | ||
+ | |||
+ | ===== 2021/12/6 多http及ssh服务的问题解决 ===== | ||
+ | * 上周将第二台接入后,第一台无法联机,怀疑还是配置问题。回家后还发现NAS的电源出问题了,似乎是损毁了。 | ||
+ | * 重新购买电源,更换后还是无法使用subdomain登陆。 | ||
+ | * 经过多轮调试和查询FRPS服务说明文档,今天问题发现并解决,属于多台客户端的frpc配置重定义问题: | ||
+ | * 多台frpc中[common]定义不用变化; | ||
+ | * 多台客户机frpc中[http]、[https]、[ssh]等协议代理请求中不能使用重名。比如使用http和ssh的: | ||
+ | * [http-1]、[http-2]、[https-1]、[https-2]; | ||
+ | * [ssh-1]、[ssh-2]。 | ||
+ | * 以上修正后,所有访问正常,其他协议类定义可以推断同样依次类推。 | ||
+ | * 注意:务必要在FRPS和FRP中定义:< | ||
+ | * 其实从理论上也可以理解,如果协议的代理请求是同样[ID],FRPS服务器确实如何去识别这是谁的要求呢? | ||
+ | * 自此,多台frpc的代理服务配置完成,结案。 | ||
+ | * 总结:所有的开发源代码的应用,多参照说明文档,少看网络上那些假大神的瞎捣鼓,看还是要看看,走走弯路也可以学到知识。 | ||
+ | |||
+ | ===== 2021/ | ||
+ | * 将自家一台闲置的G41主板GAMEMAX机箱的主机做成了群晖NAS,需要同时请求Centos的FRP代理. | ||
+ | * 产生的问题就是FRPS的http类监听端口只有各一个(http、https),而处于app需求,每台nas都需要占用http两个端口。 | ||
+ | * 如何实现两台nas的代理需求困扰了两天,尝试了网上数个谬误的推荐,本人也不清楚博主最后是否运行稳定了多久…… | ||
+ | * 谬误1:取消frps端vhost监听,使用frpc的remote_host访问……,其实从原理上就是不可能的;当然,大鹿在当时无计可施情况下也试了几次,失败; | ||
+ | * 谬误2:不使用type=http,改为type=tcp……,协议上来讲tcp和http协议是有区别的,如果偶尔成功了也只能说是基础协议层面的bug类问题,我尝试过,但是最后还是不稳定放弃了。 | ||
+ | * 最终使用了如下方案: | ||
+ | * 域名服务启用CNAME泛解析,HOST:*.xxx.xxx;Value: | ||
+ | * FRPS启用:subdomain_host; | ||
+ | * FRPC启用:subdomain。 | ||
+ | * 目前为止其中一台nas成功启用frp服务,另外一台在本周更新frpc和docker,因为设备在100多公里外:) | ||
+ | |||
+ | ===== 关于nas也可以借助FRPS运用远程ssh进行完全管理 ===== | ||
+ | * 可参考[[centos服务搭建-03-开启ssh服务]] |