使用frp实现内网穿透(含SSH、远程桌面、文件访问等)

一、遇到的问题

  1. 有一台闲置的阿里云服务器,想折♂腾Ta一下。
  2. 老家(有IPv6地址但懒得申请公网IP)有一台捡来的、在跑Windows Server的NAS,想拿来跟爱人一起当个网盘用,需要能够远程桌面连接,且异地访问存在上面的文件,同时最好能分用户访问,毕竟有些东西不方便爱人看到(不是。此为需求1
  3. 大佬@lny161224需要在移动端设备上通过SSH访问位于家里(无IPv6且不方便申请公网IP)电脑上的Ubuntu虚拟机。此为需求2

二、材料

  • 拥有公网IP的服务器一台(运行在CentOS 7.6下)。
  • 内网中的电脑,下称客户机α(需求1)和客户机β(需求2)。
  • 想要访问内网的电脑/移动设备,下称访问端

三、步骤

1. 服务器配置

A. 部署Go语言环境

  1. 下载安装包
    进入Go官方网站,选择Linux标签,单击“Download Go for Linux”按钮下载安装包。

  2. 上传安装包
    将安装包上传至服务器。此处我使用了Xshell附带的Xftp插件将安装包上传至/usr/local/下。

  3. 安装Golang组件
    清除先前安装的Golang组件,并在root用户解压安装包。此处我解压到了/usr/local/go/目录。

    rm -rf /usr/local/go
    cd /usr/local
    tar -xzf go1.16.2.linux-amd64.tar.gz
    
  4. 添加环境变量
    添加/usr/local/go/bin至PATH环境变量。在/etc/profile的最后一行添加以下内容:

    export PATH=$PATH:/usr/local/go/bin
    

    使用以下命令应用环境变量更改:

    . /etc/profile
    
  5. 查看Go版本号
    使用以下命令验证安装情况:

    go version
    

    若成功显示Go当前版本,则部署成功。

    go version go1.16.2 linux/amd64
    

B. 安装frp

  1. 下载安装包
    进入frp的Release页面,下载与服务器处理器架构对应的安装包并解压。此处我选择了frp_0.36.2_linux_amd64.tar.gz

  2. 修改配置文件
    安装包中同时包含了Linux下frp的服务端文件(frpsfrps.inifrps.service等)和客户端文件(frpcfrpc.inifrpc.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服务端详细配置说明

  3. 上传frp服务端文件
    frpsfrps.ini文件上传至服务器。此处我上传到了/usr/local/frp/下。

  4. 启动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
    
  5. 设置自启动
    将安装包解压后还会生成一个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. 开端口

配置完毕后,要记得到服务器的管理控制台开启以下端口:

  1. TCP 7000:用于接收frp客户端的连接(与frps.ini中对应)。
  2. UDP 7000:用于辅助创建 P2P 连接(与frps.ini中对应)。
  3. TCP 7500:用于访问Dashboard(与frps.ini中对应)。
  4. 连接客户机时其他需要用到的端口,根据客户端frpc.ini中的配置情况而定。此处我开了TCP 6001600222001

D. 通过Dashboard查看服务端连接情况

访问

http://服务器公网IP地址:7500

并输入在frps.ini中设定的用户名和密码后即可查看服务端的运行情况

右侧上方显示了今日的上下行流量情况,下方显示了不同协议代理的占比情况。点击左侧列表中的Proxies还可以按连接协议查看各个代理的详细信息和流量情况。

2. 客户机α配置(需求1)

A. 部署Go语言环境

  1. 下载安装包
    通过客户机α进入Go官方网站,选择Windows标签,单击“Download Go for Windows”按钮下载安装包并安装。

  2. 查看Go版本号
    打开命令提示符或PowerShell,使用以下命令验证安装情况:

    go version
    

    若成功显示Go当前版本,则部署成功。

    go version go1.16.2 windows/amd64
    

B. 安装frp

  1. 下载安装包
    通过客户机α进入frp的Release页面,下载与处理器架构对应的安装包并解压。此处我选择了frp_0.36.2_windows_amd64.zip

  2. 修改配置文件
    安装包中同时包含了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客户端详细配置说明

  3. 部署frp客户端文件
    frpc.exefrpc.ini文件置于客户机α上的相同目录下。由于frpc.exe需要使用cmd运行,为了方便运行和设置自启动,可创建frpc.bat文件,内容如下:

    当前目录名\frpc.exe
    
  4. 启动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
    
  5. 设置自启动
    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)

写在前面:

  1. 由于客户机β是基于VMware建立的Ubuntu虚拟机,所以需要在VMware的虚拟网络管理器中对网络进行配置(此处我用了NAT模式),确保客户机能够连通网络。
  2. 对新安装的Ubuntu系统,如果需要,记得设置允许root用户SSH登录

整体流程与在服务器上配置的步骤基本相同,只是配置和上传的文件改为了frp的客户端文件frpc.inifrpcfrpc.servicefrpc.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与客户机β建立连接。

四、一些心得

  1. frp的部署的核心是编辑配置文件frpc.ini,可以根据需要任意增减代理的数量或修改代理的配置。
  2. frp拥有通过xTCP实现点对点内网穿透的功能,穿透传输不会受限于服务器带宽,但由于部署后我未能成功连接,所以没写进来,等更换网络环境后有机会再测试。
  3. 需求1的解决方案并不完美,比如不能上传文件、在线看NAS上的电影视频会受限于服务器带宽而卡顿等,这些问题后续打算通过结合FTPFFmpeg等实现。
  4. 我有使用手机访问远程桌面的需求,且手机部署frp不太方便,所以最终实装版本将远程桌面的连接方式改为了TCP。

猜你喜欢

转载自blog.csdn.net/a987615123g/article/details/115405435