FRP内网穿透实现公网访问内网群晖
FRP内网穿透实现公网访问内网群晖
前言
frp是一个可用于内网穿透的高性能的反向代理应用,其支持 tcp, udp 协议。自从了解到NAS市场中存在有群晖这种东西后就非常想要体验一番,但无奈贫穷让我无法实现这个愿望。后来偶然间从马路上收废品的人手里几十元收了一台N230工控机,然后就开始了黑群晖的折腾之路。我在上面安装了DSM5.2系统,因为没有洗白,也就用不了群晖官方的工具外网访问;虽然路由器有公网IP,但是因为路由器不太稳,还在调整中,于是便决定先用frp实现内网穿透的方式实现外网访问。另一方面,此方法后期也可做为一种备用方式,以此避免单点故障。因本人水平有限,如有错漏,欢迎大家指出。
读懂实践本文,你可能需要在技能树中点亮以下技能:
- 基本的网络知识;
- 基本的Windows系统与Linux系统操作;
- VPS服务器配置;
准备
- 运行Windows电脑一台(其他系统也可,但具体某些操作可能有不同)
- 一台有公网IP的Linux服务器(可以是VPS或独立服务器)
- 一台运行DSM5.2系统的机器(其他版本系统思路相同,具体操作可能会不一样)
- SSH客户端,我用的是Putty
警告
本文内容以及本人立场并不建议大家使用盗版的黑群晖系统。一方面,使用盗版直接损害厂方利益,不利于企业发展;另一方面,使用黑群晖系统稳定性较差,不利于使用者数据安全,亦不能享受群晖系统全部的功能。对群晖有需求的朋友如果有能力请购买正版设备!另,学习本文对您的各种设备造成的各种软硬件损坏,本人均不承担任何责任,请谨慎操作!
步骤:
- 规划端口
- 服务端配置
- 客户端配置
1. 规划端口
我们首先需要简单了解frp的工作方式,frp分为服务端和客户端。服务端运行于一台有公网IP的服务器上,以此实现为客户端提供公网访问的服务;客户端运行于内网的一台需要从外网穿透访问的设备上,其会向服务端建立连接。
在开始之前我们要规划端口的使用,在此需要确定如下内容:
- 服务端的侦听端口,即客户端向服务端建立连接时,服务端所提供的端口号,本文使用默认值7000;服务器做http代理时的端口号,我使用了8080;若端口与您服务器上已有服务冲突,或您希望使用其他端口,请自行修改;
- 客户端将要被内网穿透访问的服务有哪些,分别为其确认一个便于辨识的名称、原本使用的本地端口号、计划在frp服务器上暴露出的端口号,注意避免重复命名与端口冲突问题。
本例将使用frp服务器的5022端口提供SSH服务,xx.lexsion.net:8080提供管理页面http代理。 - 为防止端口滥用问题,可为服务端配置白名单,比如我计划设置5000-5050,8080为frp服务端暴露端口。
- 为保证数据安全,我们需要为其设置一个Token,本例我们将其设为:
12345678
,请自行修改为一个复杂密码。
确认以上信息后我们需访问服务器管理页面,检查服务器运行是否正常。如服务器提供商有防火墙,需为以上确认的服务端需暴露出的端口设置规则放行。若您的服务器运行的系统有开启防火墙,请登陆系统后自行配置防火墙设置。若服务器有运行宝塔面板,需要在宝塔面板中配置开放需要的端口号,或直接关闭防火墙(不推荐)。
2. 服务端配置
-
使用SSH工具连接有公网IP的服务器,按步骤0中计划的端口配置防火墙规则。
-
运行
arch
命令显示服务器架构。根据自己服务器系统架构,访问frp项目的Release页获取最新版的软件包下载地址,下载并解压备用(请注意,随着软件更新,地址与文件名可能会与本例中命令不同,请自行修改)。本人服务器使用CentOS7.6,64位架构,相关命令信息如下,其他系统可能会有不同:[root@lHost ~]# arch x86_64 [root@lHost ~]# wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz [root@lHost ~]# tar vxf frp_0.27.0_linux_amd64.tar.gz
-
进入解压出的文件夹,使用vi编辑器修改配置文件
frps.ini
并保存,内容如下:[common] # 服务端为客户端连接提供的端口号 bind_port = 7000 vhost_http_port = 8080 # 认证密钥 token = 12345678 # 用于限制哪些端口可以用,如果不使用以下语句,将没有限制。 allow_ports = 5000-5050,8080
-
使用以下命令创建相关目录,并将文件复制到对应的目录:
cp frps /usr/bin/ mkdir /etc/frp/ cp frps.ini /etc/frp/
-
使用以下命令将
frps.service
文件复制到/etc/systemd/system/
目录:cp systemd/frps.service /etc/systemd/system/
-
使用以下命令启动frps服务:
systemctl start frps
-
使用以下命令将其添加到开机自动启动:
systemctl enable frps
-
使用以下命令输出运行状态。若一切正常,应能看到
Active: active (running) ...
提示:systemctl status frps
若您后期需要某些调整,以下命令可能有用:
-
使用以下命令可删除其开机自动启动:
sudo systemctl disable frps
-
使用以下命令可检查单元是否配置为自动启动:
sudo systemctl is-enabled frps
-
使用以下命令立即停止:
sudo systemctl stop frps
-
使用以下命令立即重启:
sudo systemctl restart frps
-
使用以下命令重载配置:
sudo systemctl reload frps
-
如果修改了
frps.service
文件,需使用以下命令重载systemd 系统配置:systemctl daemon-reload
-
使用此命令显示系统状态:
systemctl status
-
使用以下命令输出激活的单元:
systemctl
-
使用以下命令输出运行失败的单元:
systemctl --failed
-
具体命令参考:systemd (简体中文)
3. 客户端配置
接下来我们在DSM系统上配置客户端。
-
打开浏览器,登陆DSM的Web管理页面。点击控制面板->高级模式->终端机和SNMP,勾选启用SSH功能,端口我这里保持默认的22端口,点击应用。
-
使用SSH客户端连接,我这里直接使用root账号和admin的密码登陆。
-
根据自己硬件与DSM系统,访问frp项目的Release页获取最新版的软件包下载地址,下载并解压备用(请注意,随着软件更新,地址与文件名可能会与本例中命令不同,请自行修改)。本人使用DSM5.2系统,64位架构,相关命令信息如下,其他系统可能会有不同:
[root@lHost ~]# wget https://github.com/fatedier/frp/releases/download/v0.27.0/frp_0.27.0_linux_amd64.tar.gz [root@lHost ~]# tar vxf frp_0.27.0_linux_amd64.tar.gz
-
进入解压出的文件夹,使用vi编辑器修改配置文件
frpc.ini
并保存,内容如下:[common] # 以下填写服务端服务器的IP地址与端口号 server_addr = XX.XX.XX.XX server_port = 7000 # 验证的密钥,与服务端设置一致 token = 12345678 # []内可理解为一个连接的标签名;type定义连接类型(tcp、udp、http等);local_ip一般设为127.0.0.1;local_port定义服务在本地使用的端口号;remote_port定义在服务端对外提供服务的端口号 [ssh] type = tcp local_ip = 127.0.0.1 local_port = 22 remote_port = 5022 # custom_domains定义访问http代理的自定义域名,自定义域名需要在服务商处设置A记录解析到服务端的 IP [web] type = http local_port = 5000 custom_domains = xx.lexsion.net
-
修改完成后通过以下命令创建工作目录,并将必要文件复制到目录中:
mkdir /root/FRP/ cp frpc /root/FRP/ cp frpc.ini /root/FRP/
- 运行以下命令尝试启动frpc测试:
./frpc -c ./frpc.ini
- 运行以下命令尝试启动frpc测试:
-
此时我们可以尝试使用SSH客户端通过frp服务端的5022端口连接SSH服务;可以使用浏览器访问
xx.lexsion.net:8080
打开服务端了(当然,你应该访问你自己的域名)。测试正常后按Ctrl+C退出程序。 -
使用以下命令备份
rc
文件,并将其通过vi编辑器打开,使用G键(Shift+g)让光标移动到最后一行:cp /etc/rc /etc/rc.back vi /etc/rc
-
在
exit 0
行前加入一行,添加以下内容并保存:./root/FRP/frpc -c ./root/FRP/frpc.ini
-
重启DSM后测试frp将正常运作。我们便可以通过预定端口访问对应的服务了。
参考:
- frp中文文档-GitHub
https://github.com/fatedier/frp/blob/master/README_zh.md