Frp 内网穿透

Frp 内网穿透

文档 | frp (gofrp.org)

使用Frp进行内网穿透

为什么需要内网穿透功能

从公网中访问自己的私有设备向来是一件难事儿。
自己的主力台式机、NAS等等设备,它们可能处于路由器后,或者运营商因为IP地址短缺不给你分配公网IP地址。如果我们想直接访问到这些设备(远程桌面,远程文件,SSH等等),一般来说要通过一些转发或者P2P组网软件的帮助。
我有一台计算机位于一个很复杂的局域网中,我想要实现远程桌面和文件访问,目前来看其所处的网络环境很难通过简单的端口映射将其暴露在公网之中,我试过这么几种方法:

  1. 远程桌面使用TeamViewer。可用,但需要访问端也拥有TeamViewer软件,不是很方便,希望能使用Windows自带的远程桌面。且TeamViewer不易实现远程文件访问。
  2. 使用蒲公英VPN软件进行组网,可用,但免费版本网络速度极慢,体验不佳,几乎无法正常使用。
  3. 使用花生壳软件进行DDNS解析,可用,但同第二点所述,免费版本有带宽限制,无法实际使用。
  4. 搭建frp服务器进行内网穿透,可用且推荐,可以达到不错的速度,且理论上可以开放任何想要的端口,可以实现的功能远不止远程桌面或者文件共享。

Frp 是什么

简单地说,Frp就是一个反向代理软件,它体积轻量但功能很强大,可以使处于内网或防火墙后的设备对外界提供服务,它支持HTTPTCPUDP等众多协议。我们今天仅讨论TCPUDP相关的内容。

准备工作

搭建一个完整的Frp服务链,我们需要

  1. VPS一台(也可以是具有公网IP的实体机)
  2. 访问目标设备(就是你最终要访问的设备)
  3. 简单的Linux基础

服务端设置

SSH连接到VPS之后运行如下命令查看处理器架构,根据架构下载不同版本的frp

1
2
3
4
5
#查看服务器架构
[root@www frp]# uname -r
4.10.4-1.el7.elrepo.x86_64
[root@www frp]# uname -a
Linux www.heihei.tech 4.10.4-1.el7.elrepo.x86_64 #1 SMP Sat Mar 18 12:50:10 EDT 2017 x86_64 x86_64 x86_64 GNU/Linux

查看结果,如果是X86_64即可选择amd64

下载地址:https://github.com/fatedier/frp/release

然后解压

1
tar -zxvf frp_0.22.0_linux_amd64.tar.gz

把解压出来的文件夹复制到你想要的目录下,进入该目录

1
2
3
cd frp
#查看一下文件
ls -a #或者 ll

我们只需要关注如下几个文件

  • frps
  • frps.ini
  • frpc
  • frpc.ini

前两个文件(s结尾代表server)分别是服务端程序和服务端配置文件,后两个文件(c结尾代表client)分别是客户端程序和客户端配置文件。

修改frps.ini文件

1
2
3
4
5
6
7
8
9
10
11
# 输入命令 vi frps.ini

# 这个文件应有如下格式
[common]
bind_port = 7000
dashboard_port = 7500
token = 12345678
dashboard_user = admin
dashboard_pwd = admin
vhost_http_port = 10080
vhost_https_port = 10443
  • bind_port表示用于客户端和服务端连接的端口,这个端口号我们之后在配置客户端的时候要用到。
  • dashboard_port是服务端仪表板的端口,若使用7500端口,在配置完成服务启动后可以通过浏览器访问 x.x.x.x:7500 (其中x.x.x.xVPSIP)查看frp服务运行信息。
  • token是用于客户端和服务端连接的口令,请自行设置并记录,稍后会用到。
  • dashboard_userdashboard_pwd表示打开仪表板页面登录的用户名和密码,自行设置即可。
  • vhost_http_portvhost_https_port用于反向代理HTTP主机时使用,本文不涉及HTTP协议,因而照抄或者删除这两条均可。

运行frps的服务端

1
./frps -c frps.ini

也可以建立软连接,方便启动

1
ln -s /opt/frp/frps /usr/local/bin/frps

如果看到屏幕输出这样一段内容,即表示运行正常,如果出现错误提示,请检查上面的步骤。

1
2
3
4
5
6
2023/09/15 02:45:10 [I] [root.go:204] frps uses config file: /opt/frp/frps.ini
2023/09/15 02:45:11 [I] [service.go:206] frps tcp listen on 0.0.0.0:7000
2023/09/15 02:45:11 [I] [service.go:267] http service listen on 0.0.0.0:10080
2023/09/15 02:45:11 [I] [service.go:282] https service listen on 0.0.0.0:10443
2023/09/15 02:45:11 [I] [service.go:318] Dashboard listen on 0.0.0.0:7500
2023/09/15 02:45:11 [I] [root.go:213] frps started successfully

此时访问 x.x.x.x:7500 并使用自己设置的用户名密码登录,即可看到仪表板界面

image-20230915150600043

服务端后台运行

至此,我们的服务端仅运行在前台,如果Ctrl+C停止或者关闭SSH窗口后,frps均会停止运行,因而我们使用 nohup命令将其运行在后台。

1
2
3
4
5
6
7
8
9
#默认输出在当前目录的 nohup.out 文件
nohup ./frps -c frps.ini &
# 输出如下内容即表示正常运行
# nohup: ignoring input and appending output to 'nohup.out'

#重定向输出
nohup ./frps -c frps.ini > frps.log 2>&1 &
# 此时可先使用Ctrl+C关闭nohup,frps依然会在后台运行,使用jobs命令查看后台运行的程序
# [1]+ Running nohup ./frps -c frps.ini &

使用systemd运行

使用 systemd | frp (gofrp.org)

在 Linux 系统下,使用systemd 可以方便地控制 frp 服务端 frps 的启动和停止、配置后台运行和开启自启。

要使用 systemd 来控制 frps,需要先安装 systemd,然后在 /etc/systemd/system 目录下创建一个 frps.service 文件。

  1. 如Linux服务端上没有安装 systemd,可以使用 yumapt 等命令安装 systemd

    1
    2
    3
    4
    # yum
    yum install systemd
    # apt
    apt install systemd
  2. 使用文本编辑器,如 vim 创建并编辑 frps.service 文件。

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

    写入内容

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    [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.ini

    [Install]
    WantedBy = multi-user.target
  3. 使用 systemd 命令,管理 frps

    1
    2
    3
    4
    5
    6
    7
    8
    # 启动frp
    systemctl start frps
    # 停止frp
    systemctl stop frps
    # 重启frp
    systemctl restart frps
    # 查看frp状态
    systemctl status frps
  4. 配置 frps 开机自启。

    1
    systemctl enable frps

客户端设置

Frp的客户端就是我们想要真正进行访问的那台设备,大多数情况下应该会是一台Windows主机,因而本文使用Windows主机做例子;

同样地,根据客户端设备的情况选择相应的frp程序进行下载,Windows下下载和解压等步骤不再描述。

假定你下载了frp_0.22.0_windows_amd64.zip,将其解压在了C盘根目录下,并且将文件夹重命名为frp,可以删除其中的frpsfrps.ini文件。

用文本编辑器打开frpc.ini,与服务端类似,内容如下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[common]
server_addr = x.x.x.x
server_port = 7000
token = won517574356
[rdp]
type = tcp
local_ip = 127.0.0.1
local_port = 3389
remote_port = 7001
[smb]
type = tcp
local_ip = 127.0.0.1
local_port = 445
remote_port = 7002

其中common字段下的三项即为服务端的设置。

  • server_addr为服务端IP地址,填入即可。
  • server_port为服务器端口,填入你设置的端口号即可,如果未改变就是7000
  • token是你在服务器上设置的连接口令,原样填入即可。

自定义规则

Frp实际使用时,会按照端口号进行对应的转发,原理如下图所示。

image-20230915152052575

上面frpc.inirdpsmb字段都是自己定义的规则,自定义端口对应时格式如下。

  • [xxx]表示一个规则名称,自己定义,便于查询即可。
  • type表示转发的协议类型,有TCPUDP等选项可以选择,如有需要请自行查询frp手册。
  • local_port是本地应用的端口号,按照实际应用工作在本机的端口号填写即可。
  • remote_port是该条规则在服务端开放的端口号,自己填写并记录即可。

RDP,即Remote Desktop 远程桌面,Windows的RDP默认端口是3389,协议为TCP,建议使用frp远程连接前,在局域网中测试好,能够成功连接后再使用frp穿透连接。

SMB,即Windows文件共享所使用的协议,默认端口号445,协议TCP,本条规则可实现远程文件访问。

配置完成frpc.ini后,就可以运行frpc

frpc程序不能直接双击运行!

使用命令提示符或Powershell进入该目录下

1
2
3
4
cd C:\frp

# 执行
./frpc -c frpc.ini

运行frpc程序,窗口中输出如下内容表示运行正常。

1
2
3
4
2019/01/12 16:14:56 [I] [service.go:205] login to server success, get run id [2b65b4e58a5917ac], server udp port [0]
2019/01/12 16:14:56 [I] [proxy_manager.go:136] [2b65b4e58a5917ac] proxy added: [rdp smb]
2019/01/12 16:14:56 [I] [control.go:143] [smb] start proxy success
2019/01/12 16:14:56 [I] [control.go:143] [rdp] start proxy success

不要关闭命令行窗口,此时可以在局域网外使用相应程序访问 x.x.x.x:xxxxIPVPSIP,端口为自定义的remote_port)即可访问到相应服务。

客户端后台运行及开机自启

frpc运行时始终有一个命令行窗口运行在前台,影响美观,我们可以使用一个批处理文件来将其运行在后台,而且可以双击执行,每次打开frpc不用再自己输命令了。

在任何一个目录下新建一个文本文件并将其重命名为frpc.bat,编辑,粘贴如下内容并保存。

1
2
3
4
5
6
7
8
@echo off
if "%1" == "h" goto begin
mshta vbscript:createobject("wscript.shell").run("""%~nx0"" h",0)(window.close)&&exit
:begin
REM
cd C:\frp
frpc -c frpc.ini
exit

cd后的路径更改为你的frpc实际存放的目录。

之后直接运行这个 .bat 文件即可启动frpc并隐藏窗口(可在任务管理器中退出)。
至于开机启动,把这个 .bat 文件直接扔进Windows的开机启动文件夹就好了

windows开机启动文件夹路径:

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

至此,客户端配置完成,之后就是你自己根据需要在frpc.ini后追加规则即可。
强烈建议你在使用frp直接测试内网穿透前,先在局域网内测试好相关功能的正常使用,并配置好可能会影响的Windows防火墙等内容,在内网调试通过后再使用frp进行内网穿透测试。