菜单

使用 frp 实现内网穿透

liuliu
发布于 2024-01-15 / 81 阅读
1
0

使用 frp 实现内网穿透

为什么需要内网穿透

主要的目的就是从公网/外网来访问自己本地私有设备或安装在设备上的服务,比如最近很火的 AI 绘画工具:Stable Diffusion web UI

但是一般来说我们的设备一般都是处于自己家庭内部的局域网内,并没有公网 IP。如果我们想直接访问到这些设备(远程桌面、SSH 等),一般来说要通过转发或者组网软件的帮助。我试过以下几种方法:

  1. 远程桌面使用向日葵、RayLink 等工具。可用,但需要访问端安装同样的软件,不是很方便,而且免费版用起来带宽不是很够,会有轻微的卡顿,影响持续使用的体验;

  2. 使用花生壳等软件进行 DDNS 解析,可用,但免费版本同样有带宽限制,无法实际使用;

  3. 搭建 frp 服务器进行内网穿透,推荐,可以实现远程访问软件等无法做到的功能,如:在公网访问Stable Diffusion web UI。

后续的教程也主要针对的是放开Stable Diffusion web UI 服务。

frp 是什么?

frp 是一款高性能的反向代理应用,专注于内网穿透。它支持多种协议,包括 TCP、UDP、HTTP、HTTPS 等,并且具备 P2P 通信功能。使用 frp,您可以安全、便捷地将内网服务暴露到公网,通过拥有公网 IP 的节点进行中转。

前期准备

  1. 阿里云 ECS一台(也可以是 VPS 等,作为服务端)

  2. 需要访问的本地设备(我这里是一台 windows 主机)

  3. 简单的 Linux 基础

服务端设置

  1. 通过 SSH连接到 ECS

  2. 下载相应版本的 frp

wget https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz

不过阿里云一般不能直接访问 GitHub,可通过 https://mirror.ghproxy.com/ 代理进行下载

wget https://mirror.ghproxy.com/https://github.com/fatedier/frp/releases/download/v0.53.2/frp_0.53.2_linux_amd64.tar.gz
  1. 进行解压

tar -zxvf frp_0.53.2_linux_amd64.tar.gz
  1. 进入解压后的文件夹

cd frp_0.53.2_linux_amd64
# 查看一下文件
ls -a

我们只需关注以下几个文件:

  • frps

  • frps.toml

  • frpc

  • frpc.toml

前两个文件(s结尾,s代表 server)分别是服务端程序和服务端的配置文件,后两个文件(c 代表 client)分别是客户端程序和客户端配置文件。我们可以选择删除客户端相关的文件,因为我们现在配置的是服务端。

  1. 修改配置文件

vim frps.toml

文件默认内容如下:

bindPort = 7000

bindPort 表示用于客户端和服务端连接的端口,这个端口号之后在配置客户端的时候需要用到,可修改为其他的端口号:如 7766。

编辑之后保存(vim的基本操作),之后我们就可以开始运行 frps 的服务端了。

./frps -c frps.toml

如果看到输出这样的一段内容,说明运行成功了:

Jan 15 11:27:50 moss systemd[1]: Started frp server.
Jan 15 11:27:50 moss frps[407937]: 2024/01/15 11:27:50 [I] [root.go:104] frps uses config file: /root/frp_0.53.>
Jan 15 11:27:50 moss frps[407937]: 2024/01/15 11:27:50 [I] [service.go:225] frps tcp listen on 0.0.0.0:7766
Jan 15 11:27:50 moss frps[407937]: 2024/01/15 11:27:50 [I] [root.go:113] frps started successfully

服务端后台运行

之前的运行方式服务端仅运行在前台,关闭 ssh 窗口或者 Ctrl+C 停止后就会停止运行,因此我们需要使其运行在后台。这里推荐使用 systemd 来管理 frps服务,包括启动、停止、配置后台运行和设置开机自启。

以下是具体的操作步骤:

  1. 安装 systemd

    如果您的 Linux 服务器上尚未安装 systemd,可以使用包管理器如 yum(适用于 CentOS/RHEL)或 apt(适用于 Debian/Ubuntu)来安装它:

    # 使用 yum 安装 systemd(CentOS/RHEL)
    yum install systemd
    
    # 使用 apt 安装 systemd(Debian/Ubuntu)
    apt install systemd
    
  2. 创建 frps.service 文件

    使用文本编辑器 (如 vim) 在 /etc/systemd/system 目录下创建一个 frps.service 文件,用于配置 frps 服务。

    $ sudo vim /etc/systemd/system/frps.service

    写入内容

    [Unit]
    # 服务名称,可自定义
    Description = frp server
    After = network.target syslog.target
    Wants = network.target
    
    [Service]
    Type = simple
    # 启动frps的命令,需修改为您的frps的安装路径
    ExecStart = /path/to/frps -c /path/to/frps.toml
    
    [Install]
    WantedBy = multi-user.target
    
  3. 使用 systemd 命令管理 frps 服务

    # 启动frp
    sudo systemctl start frps
    # 停止frp
    sudo systemctl stop frps
    # 重启frp
    sudo systemctl restart frps
    # 查看frp状态
    sudo systemctl status frps
    
  4. 设置 frps 开机自启动

    sudo systemctl enable frps
    

通过遵循上述步骤,您可以轻松地使用 systemd 来管理 frps 服务,实现启动、停止、自动运行和开机自启动。确保替换路径和配置文件名称以匹配您的实际安装。

客户端设置

frp的客户端指的是我们想要访问的那台本地设备,这里我以 Windows 主机举例。

先根据客户端的情况选择相应的软件进行下载解压,解压后可将文件夹重命名为 frp,解压位置可以根据自己的实际情况选择。

选一个文本编辑器打开客户端的配置文件 frpc.toml,内容如下:

serverAddr = "127.0.0.1" #修改为自己服务端的 IP 地址
serverPort = 7000 # 服务端端口,默认为7000,如果做了服务端配置的时候做了修改,填入自己设置的端口号即可,如我的就是 7766

[[proxies]]
name = "test-tcp"
type = "tcp"
localIP = "127.0.0.1"
localPort = 22  # 本地服务对应的端口,如我的就是sd webui的端口:7860
remotePort = 6000 #公网访问时的端口,可根据自己需要修改,如我的就是:7861

配置完成后就可以运行frpc 了。

frpc.exe 不能直接双击运行,需要通过命令行运行,但是每次都通过命令行运行太繁琐了,下面提供一个简便的方案:

  1. 在 frpc.exe 目录下创建一个 bat文件(windows 批处理文件),名称可为:frpc_start.bat

  2. 用文本编辑器打开该文件,填入 以下内容:

@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit

:begin
frpc.exe -c frpc.toml
goto begin

其中的 frpc.exe -c frpc.toml 就是之前要手输的命令。

这样一来就可以直接通过双击 frpc_start.bat 文件运行客户端了(启动后会自动隐藏窗口)。

如果想要开机启动,把这个.bat 文件直接扔进 Windows 的开机启动文件夹就行了。

⚠️注意事项:上文中提到的端口需要在阿里云 ECS 控制台安全组中放开,否则无法连接,其他的服务器应该大同小异。


评论