目录
一、遇到的问题
- 有一台闲置的阿里云服务器,想折♂腾Ta一下。
- 老家(有IPv6地址但懒得申请公网IP)有一台捡来的、在跑Windows Server的NAS,想拿来跟爱人一起当个网盘用,需要能够远程桌面连接,且异地访问存在上面的文件,同时最好能分用户访问,毕竟有些东西不方便爱人看到(不是。此为需求1。
- 大佬@lny161224需要在移动端设备上通过SSH访问位于家里(无IPv6且不方便申请公网IP)电脑上的Ubuntu虚拟机。此为需求2。
二、材料
- 拥有公网IP的服务器一台(运行在CentOS 7.6下)。
- 内网中的电脑,下称客户机α(需求1)和客户机β(需求2)。
- 想要访问内网的电脑/移动设备,下称访问端。
三、步骤
1. 服务器配置
A. 部署Go语言环境
-
下载安装包
进入Go官方网站,选择Linux标签,单击“Download Go for Linux”按钮下载安装包。 -
上传安装包
将安装包上传至服务器。此处我使用了Xshell附带的Xftp插件将安装包上传至/usr/local/
下。 -
安装Golang组件
清除先前安装的Golang组件,并在root用户解压安装包。此处我解压到了/usr/local/go/
目录。rm -rf /usr/local/go cd /usr/local tar -xzf go1.16.2.linux-amd64.tar.gz
-
添加环境变量
添加/usr/local/go/bin
至PATH环境变量。在/etc/profile
的最后一行添加以下内容:export PATH=$PATH:/usr/local/go/bin
使用以下命令应用环境变量更改:
. /etc/profile
-
查看Go版本号
使用以下命令验证安装情况:go version
若成功显示Go当前版本,则部署成功。
go version go1.16.2 linux/amd64
B. 安装frp
-
下载安装包
进入frp的Release页面,下载与服务器处理器架构对应的安装包并解压。此处我选择了frp_0.36.2_linux_amd64.tar.gz
。 -
修改配置文件
安装包中同时包含了Linux下frp的服务端文件(frps
、frps.ini
、frps.service
等)和客户端文件(frpc
、frpc.ini
、frpc.service
等)。通过修改frps.ini
文件可以对frp服务端进行配置。此次配置,我开启了如下功能:
① token权限认证,防止未被授权的客户端连接至服务端;
② 设置服务端监听UDP端口,用于辅助创建P2P连接;
③ 启用Dashboard,用于监测服务端连接状态。为此,我将
frps.ini
的内容修改如下:[common] # 服务器监听端口 bind_port = 7000 # 权限认证的token值,可自定义 token = HaoziJerry # 服务端监听UDP端口,用于辅助创建P2P连接 bind_udp_port = 7000 # 启用Dashboard监听的本地端口 dashboard_port = 7500 # dashboard 用户名密码,可自定义,如果不用需要主动设置为空 dashboard_user = admin dashboard_pwd = admin
另外,frp的官方文档中给出了多个示例,可以根据具体需求修改
frps.ini
文件。如果需要实现其他功能,可以参考frp服务端详细配置说明。 -
上传frp服务端文件
将frps
和frps.ini
文件上传至服务器。此处我上传到了/usr/local/frp/
下。 -
启动frp服务端
通过以下命令启动frp服务端:/usr/local/frp/frps -c /usr/local/frp/frps.ini
显示
2021/04/03 19:40:00 [I] [root.go:200] frps uses config file: /usr/local/frp/frps.ini 2021/04/03 19:40:01 [I] [service.go:192] frps tcp listen on 0.0.0.0:7000 2021/04/03 19:40:01 [I] [service.go:275] nat hole udp service listen on 0.0.0.0:7000 2021/04/03 19:40:01 [I] [service.go:294] Dashboard listen on 0.0.0.0:7500 2021/04/03 19:40:01 [I] [root.go:209] frps started successfully
即为启动成功。
若出现权限不足
Permission denied
可使用以下命令赋予文件夹执行权限:
chmod -R 744 /usr/local/frp
-
设置自启动
将安装包解压后还会生成一个systemd
目录。修改其中frps.service
文件[Service]下的ExecStart项,将其指向frps的实际上传目录:ExecStart=/usr/local/frp/frps -c /usr/local/frp/frps.ini
注意:如果使用此方法启动 frps 服务,vhost_http_port 又想用 80 端口,需要将配置文件中的 User=nobody 注释或删除。
将
frps.service
文件上传至服务器/etc/systemd/system/
下,并设置frps服务开机启动:sudo systemctl enable frps
其他命令:
启动frps服务:
sudo systemctl start frps
重启frps服务:
sudo systemctl restart frps
停止frps服务:
sudo systemctl stop frps
C. 开端口
配置完毕后,要记得到服务器的管理控制台开启以下端口:
- TCP 7000:用于接收frp客户端的连接(与
frps.ini
中对应)。 - UDP 7000:用于辅助创建 P2P 连接(与
frps.ini
中对应)。 - TCP 7500:用于访问Dashboard(与
frps.ini
中对应)。 - 连接客户机时其他需要用到的端口,根据客户端
frpc.ini
中的配置情况而定。此处我开了TCP 6001、6002和22001。
D. 通过Dashboard查看服务端连接情况
访问
http://服务器公网IP地址:7500
并输入在frps.ini
中设定的用户名和密码后即可查看服务端的运行情况
右侧上方显示了今日的上下行流量情况,下方显示了不同协议代理的占比情况。点击左侧列表中的Proxies还可以按连接协议查看各个代理的详细信息和流量情况。
2. 客户机α配置(需求1)
A. 部署Go语言环境
-
下载安装包
通过客户机α进入Go官方网站,选择Windows标签,单击“Download Go for Windows”按钮下载安装包并安装。 -
查看Go版本号
打开命令提示符或PowerShell,使用以下命令验证安装情况:go version
若成功显示Go当前版本,则部署成功。
go version go1.16.2 windows/amd64
B. 安装frp
-
下载安装包
通过客户机α进入frp的Release页面,下载与处理器架构对应的安装包并解压。此处我选择了frp_0.36.2_windows_amd64.zip
。 -
修改配置文件
安装包中同时包含了Windows下frp的服务端和客户端文件。通过修改frpc.ini
文件可以对frp客户端进行配置。针对需求1,我开启了如下功能:
① 使用sTCP协议的远程桌面连接(需要在客户机α上开启远程桌面);
② static_file插件提供的文件访问服务;为此,我将
frpc.ini
的内容修改如下:[common] # 服务器的公网IP地址 server_addr = xxx.xxx.xxx.xxx # 服务器监听端口 server_port = 7000 # 权限认证的token值,与frps.ini中相同 token = HaoziJerry # 使用sTCP协议的远程桌面连接 [secret_RD] type = stcp # 只有sk一致的用户才能访问到此服务,可以与token不同 sk = HaoziJerry # 本地IP地址和对应服务端口 local_ip = 127.0.0.1 local_port = 3389 # 文件访问服务1 [static_file_Super] type = tcp # 要用到的服务器端口,记得去服务器管理控制台开启 remote_port = 6001 plugin = static_file # 要对外暴露的文件目录,需自定义 plugin_local_path = D:\Share\Super # 访问路径名,此处即http://x.x.x.x:6001/super/ plugin_strip_prefix = super # 用户名和密码 plugin_http_user = super plugin_http_passwd = super # 文件访问服务2 [static_file_Jerry] type = tcp # 要用到的服务器端口,记得去服务器管理控制台开启 remote_port = 6002 plugin = static_file # 要对外暴露的文件目录,需自定义 plugin_local_path = D:\Share\Jerry # 访问路径名,此处即http://x.x.x.x:6001/jerry/ plugin_strip_prefix = jerry # 用户名和密码 plugin_http_user = jerry plugin_http_passwd = jerry
另外,frp的官方文档中给出了多个示例,可以根据具体需求修改
frpc.ini
文件。若要实现其他功能,可以参考frp客户端详细配置说明。 -
部署frp客户端文件
将frpc.exe
和frpc.ini
文件置于客户机α上的相同目录下。由于frpc.exe
需要使用cmd运行,为了方便运行和设置自启动,可创建frpc.bat
文件,内容如下:当前目录名\frpc.exe
-
启动frp服务端
运行frpc.bat
即可开启frp的客户端,会显示登录信息、代理名称和开启状态。2021/04/03 19:57:05 [I] [service.go:304] [12417708010235e8] login to server success, get run id [12417708010235e8], server udp port [7000] 2021/04/03 19:57:05 [I] [proxy_manager.go:144] [12417708010235e8] proxy added: [secret_RD static_file_Super static_file_Jerry] 2021/04/03 19:57:05 [I] [control.go:180] [12417708010235e8] [static_file_Super] start proxy success 2021/04/03 19:57:05 [I] [control.go:180] [12417708010235e8] [static_file_Jerry] start proxy success 2021/04/03 19:57:05 [I] [control.go:180] [12417708010235e8] [secret_RD] start proxy success
-
设置自启动
将frpc.bat
放在如下目录%ProgramData%\Microsoft\Windows\Start Menu\Programs\Startup
即可实现开机自动启动。
3. 访问端配置(需求1)
A. 文件访问
客户端A的文件访问服务使用了TCP协议,在此例中我只需直接访问
http://服务器公网IP地址:6001
并输入客户端A上frpc.ini
里设置的用户名密码即可访问客户端A中D:\Share\Super
目录下的文件了。访问另一位用户的目录同理,修改访问端口并输入对应的用户名密码即可。
B. 远程桌面连接
由于客户端A的远程桌面连接使用了sTCP协议,所以需要访问端安装frp客户端以使用远程桌面连接。总体步骤与客户机α配置基本相同(部署Go语言环境、安装frp),只需编辑访问端的frpc.ini
即可:
[common]
# 服务器的公网IP地址
server_addr = xxx.xxx.xxx.xxx
# 服务器监听端口
server_port = 7000
# 权限认证的token值,与frps.ini中相同
token = HaoziJerry
[secret_RD_visitor]
type = stcp
# sTCP的访问者
role = visitor
# 要访问的sTCP代理的名字和对应sk,需要与客户端A的frpc.ini中相同
server_name = secret_RD
sk = HaoziJerry
# 绑定本地端口用于访问远程桌面服务,端口可自定义
bind_addr = 127.0.0.1
bind_port = 6000
之后运行frpc.bat
。显示
2021/04/04 02:30:08 [I] [service.go:304] [5a090a52981acef7] login to server success, get run id [5a090a52981acef7], server udp port [7000]
2021/04/04 02:30:08 [I] [visitor_manager.go:86] [5a090a52981acef7] start visitor success
2021/04/04 02:30:08 [I] [visitor_manager.go:130] [5a090a52981acef7] visitor added: [secret_RD_visitor]
即为运行成功。此时,打开远程桌面连接,在“计算机”栏输入
127.0.0.1:6000
并点击连接,之后输入客户机α上的Windows账户名和密码即可建立远程桌面连接。
4. 客户机β配置(需求2)
写在前面:
- 由于客户机β是基于VMware建立的Ubuntu虚拟机,所以需要在VMware的虚拟网络管理器中对网络进行配置(此处我用了NAT模式),确保客户机能够连通网络。
- 对新安装的Ubuntu系统,如果需要,记得设置允许root用户SSH登录。
整体流程与在服务器上配置的步骤基本相同,只是配置和上传的文件改为了frp的客户端文件frpc.ini
、frpc
和frpc.service
。frpc.ini
配置如下:
[common]
# 服务器的公网IP地址
server_addr = xxx.xxx.xxx.xxx
# 服务器监听端口
server_port = 7000
# 权限认证的token值,与frps.ini中相同
token = HaoziJerry
# 使用TCP协议的SSH连接
[SSH]
type = tcp
# 本地IP地址和对应服务端口
local_ip = 127.0.0.1
local_port = 22
# 要用到的服务器端口,记得去服务器管理控制台开启
remote_port = 22001
另外,对Ubuntu系统(CentOS没遇到这个情况),在设置自启动时需要修改frpc.service
的User项如下,否则无法开启自启动:
User=root
5. 访问端配置(需求2)
直接在各平台的SSH工具上访问
ssh -oPort=22001 root@服务器公网IP地址
即可通过SSH与客户机β建立连接。
四、一些心得
- frp的部署的核心是编辑配置文件
frpc.ini
,可以根据需要任意增减代理的数量或修改代理的配置。 - frp拥有通过xTCP实现点对点内网穿透的功能,穿透传输不会受限于服务器带宽,但由于部署后我未能成功连接,所以没写进来,等更换网络环境后有机会再测试。
- 需求1的解决方案并不完美,比如不能上传文件、在线看NAS上的电影视频会受限于服务器带宽而卡顿等,这些问题后续打算通过结合FTP、FFmpeg等实现。
- 我有使用手机访问远程桌面的需求,且手机部署frp不太方便,所以最终实装版本将远程桌面的连接方式改为了TCP。