问小白 wenxiaobai
资讯
历史
科技
环境与自然
成长
游戏
财经
文学与艺术
美食
健康
家居
文化
情感
汽车
三农
军事
旅行
运动
教育
生活
星座命理

新版frp进行内网穿透/反向代理及原理解析

创作时间:
作者:
@小白创作中心

新版frp进行内网穿透/反向代理及原理解析

引用
1
来源
1.
https://www.ikunl.com/53.html

frp(Fast Reverse Proxy)是一款由Go语言开发的高性能内网穿透工具,支持TCP、UDP、HTTP等多种协议的代理。它可以帮助用户在没有公网IP的情况下,通过一台具有公网IP的服务器,实现对内网资源的访问。本文将详细介绍frp的基本原理、配置方法以及在不同环境下的具体实现步骤。

一、前言

  • 由于frp 0.52.0版本后支持TOML、YAML和JSON配置文件,并弃用INI配置文件,未来版本将不再支持INI配置。因此,本文将全部采用TOML配置文件进行演示。
  • 本文的目的是为了访问处于局域网环境、不具备公网IP的NAS系统。通过配置frp内网穿透,可以实现在外网访问内网资源。

在实现内网穿透之前,需要确保具备以下条件:

  • 1台具有公网IP的服务器
  • 1台在内网的服务器(可以是虚拟机)

二、原理解析

1、问题

由于NAT机制的原因,外网主机无法直接访问内网资源。为了解决这个问题,需要使用反向代理,将内网某端口转发到公网VPS上,这样对外网VPS监听端口的访问就等同于对内网服务器转发出来的端口的访问。

2、frp流程图

3、Frp请求原理

  1. frpc启动后向frps请求建立长连接并保持,若连接失败,则重新尝试建立连接
  2. frps收到请求后,建立一个listener监听公网的请求
  3. 客户端向frps发送请求,frps接受到请求后,发送给frpc
  4. frpc收到之后向frps发送请求,并且在请求开头指明连接去向
  5. frps接收到frpc的连接请求把新建立的连接和来自公网的连接进行流量相互转发

三、frps服务端配置

1、Linux环境

(1)下载并解压

wget -c https://github.com/fatedier/frp/releases/download/v0.53.0/frp_0.53.0_linux_amd64.tar.gz
tar -zxvf frp_0.53.0_linux_amd64.tar.gz   #解压文件
mv frp_0.53.0_linux_amd64 /usr/local   #将frp目录移动到/usr/local下
mv /usr/local/frp_0.53.0_linux_amd64 /usr/local/frps   #将frp目录改名成frps

(2)配置frps.toml

bindPort = 7000   #服务端监听端口,用于和client端通信的 
bindAddr = "0.0.0.0" #服务端监听地址,用于接收 frpc 的连接,默认监听 0.0.0.0。
kcpBindPort = 5443 #服务端监听 KCP 协议端口,用于接收配置了使用 KCP 协议的 frpc 连接。
vhostHTTPPort = 80 #HTTP 类型代理监听的端口,启用后才能支持 HTTP 类型的代理。
vhostHTTPSPort = 443 #HTTPS 类型代理监听的端口,启用后才能支持 HTTPS 类型的代理。
maxPoolCount = 50 #允许客户端设置的最大连接池大小,如果客户端配置的值大于此值,会被强制修改为最大值,默认为 5。
tcpmuxHTTPConnectPort = 16337 #	tcpmux 类型且复用器为 httpconnect 的代理监听的端口。
transport.tls.force = false   #是否只接受启用了TLS的客户端连接
transport.maxPortsPerClient = 20   #限制单个客户端最大同时存在的代理数,默认无限制。
[webServer]
addr = "0.0.0.0"
user = "admin"
password = "frp990103"
port = 6443
[log]
file = "/var/log/frps.log"
level = "info"
maxDays = 30
[auth]
token = "frp990103"
allowPorts = [
    { start = 10000, end = 15000 },   #端口范围设置为10000-15000可用
    { start = 30000, end = 40000 },   #同理,可设置多个端口范围开放
    { single = 25565 },   #单端口设置,指定25565端口可用
    { single = 25566 }    #同理,可以设置多个单端口开放
]

(3)启动

./frps -c frps.toml

(4)验证是否启动成功

访问:http://服务器IP:后台管理端口,输入用户名和密码可以查看连接状态

(5)配置 systemctl 服务设置开机自启

vi /etc/systemd/system/frps.service
#填入以下内容
[Unit]
Description=frps
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frps/frps -c /usr/local/frps/frps.toml   #填写frps的安装目录
Restart=always
[Install]
WantedBy=multi-user.target

使用以下命令控制frps服务

systemctl enable frps   #开启开机自启动frps服务
systemctl disable frps   #关闭开机自启动frps服务
systemctl start frps   #启动frps服务
systemctl stop frps   #停止frps服务
systemctl status frps   #查看frps服务状态

2、Windows环境

  • 前往GitHub下载frps
  • arm/arm64对应arm架构(不会有人用Windows on ARM吧),amd64对应x86架构
  • 如果遇到GitHub无法打开的情况下可以使用本站提供的123Pan下载

(1)配置frps.toml文件

bindPort = 7000   #服务端监听端口
auth.method = "token"   #服务端连接身份认证,默认token
auth.token = "mint"   #服务端token密码
vhostHTTPPort = 80
vhostHTTPSPort = 443
transport.tls.force = false   #是否只接受启用了TLS的客户端连接
transport.maxPortsPerClient = 20   #每个客户端可以创建多少隧道
allowPorts = [
    { start = 10000, end = 15000 },   #端口范围设置为10000-15000可用
    { start = 30000, end = 40000 },   #同理,可设置多个端口范围开放
    { single = 25565 },   #单端口设置,指定25565端口可用
    { single = 25566 }    #同理,可以设置多个单端口开放
]

(2)配置启动文件

这里有两种方法,一种是配置好xxx.bat后放在
C:\Users<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
目录下,这样可以在用户登录后自动启动xxx.bat这种方法简单直接
还有一种方法,直接使用nssm.exe配置frps为系统服务,这种方法可以无需登录用户账号后台运行
建议第二种方法,为了稳妥,两种方法都演示一遍

方式一: 在frps目录下新建xxx.bat文件,把下方内容填进去

frps -c frps.toml

右键创建快捷方式后将快捷方式扔进下方目录即可
C:\Users<user>\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup
如果之后要更新frps.toml配置文件,把cmd窗口关闭重启xxx.bat就没问题了

方式二:打开nssm官网下载nssm.exe,国内访问较慢可使用本站提供的123Pan下载
解压后在win64/32找到nssm.exe放在a目录里,打开cmd后cd到a目录下运行

nssm install frpsCMD

输完命令回车后会弹个窗口,根据实际情况按下图填后按Install service即可
之后到任务管理器→服务中找到frpc服务后右键开始就没问题了。如果之后要更新frps.toml配置文件,再次找到此处右键重新启动就没问题了

四、frpc客户端配置

1、Linux环境

(1)配置frpc.toml

serverAddr = "1.1.1.1"   #服务器地址
serverPort = 7000   #服务器端口
auth.method = "token"   #服务端连接身份认证,默认token
auth.token = "test123"   #服务端token密码,密码不正确将无法连接服务器
transport.tls.enable = false   #是否和服务端之间启用TLS连接
transport.tls.disableCustomTLSFirstByte = false
#默认为true,当配置为true时,无法和vhostHTTPSPort端口复用
[[proxies]]
name = "ssh"   #隧道名称,可自定义,不能重复
type = "tcp"   #隧道类型,可用tcp, udp, http, https, tcpmux, stcp, sudp, xtcp
localIP = "127.0.0.1"   #本地IP地址,如果是本机就127.0.0.1
localPort = 22   #本地端口,本地服务端口,比如mc服务器端口25565
remotePort = 20022    #远程端口,连接隧道时用的端口
transport.useEncryption = true   #传输加密,加密算法采用 aes-128-cfb
transport.useCompression = true   #传输压缩,压缩算法采用 snappy

(2)配置systemctl服务设置开机自启

vi /etc/systemd/system/frpc.service
#填入以下内容
[Unit]
Description=frpc
After=network.target syslog.target
Wants=network.target
[Service]
Type=simple
ExecStart=/usr/local/frpc/frpc -c /usr/local/frpc/frpc.toml   #填写frpc的安装目录
Restart=always
[Install]
WantedBy=multi-user.target

使用以下命令控制frpc服务

systemctl enable frpc   #开启开机自启动frpc服务
systemctl disable frpc   #关闭开机自启动frpc服务
systemctl start frpc   #启动frpc服务
systemctl stop frpc   #停止frpc服务
systemctl status frpc   #查看frpc服务状态

2、Windows环境

(1)配置frpc.toml

serverAddr = "1.1.1.1"   #服务器地址
serverPort = 7000   #服务器端口
auth.method = "token"   #服务端连接身份认证,默认token
auth.token = "test123"   #服务端token密码,密码不正确将无法连接服务器
transport.tls.enable = false   #是否和服务端之间启用TLS连接
transport.tls.disableCustomTLSFirstByte = false
#默认为true,当配置为true时,无法和vhostHTTPSPort端口复用
[[proxies]]
name = "rdp"   #隧道名称,可自定义,不能重复
type = "tcp"   #隧道类型,可用tcp, udp, http, https, tcpmux, stcp, sudp, xtcp
localIP = "127.0.0.1"   #本地IP地址,如果是本机就127.0.0.1
localPort = 3389   #本地端口,本地服务端口
remotePort = 23389    #远程端口,连接隧道时用的端口
transport.useEncryption = true   #传输加密,加密算法采用 aes-128-cfb
transport.useCompression = true   #传输压缩,压缩算法采用 snappy

2、配置启动文件

参考frps启动文件配置方法

© 2023 北京元石科技有限公司 ◎ 京公网安备 11010802042949号