frp内网穿透的四种模式:tcp、udp、stcp、xtcp含义
frp xtcp是什么,frp stcp是什么
FRP内网映射,穿透工具,FRP内网转发
系统:Windows/Linux
软件:FRP
软件下载:frp_0.34.3_windows_amd64.zip
项目地址:https://github.com/fatedier/frp/releases
新教材:https://www.zhuguodong.com/?id=558
早期介绍教材:https://www.zhuguodong.com/?id=418
其它Linux资料:http://www.nasge.com/archives/17.html
代理类型
frp 支持多种代理类型来适配不同的使用场景。
类型 | 描述 |
---|---|
tcp | 单纯的 TCP 端口映射,服务端会根据不同的端口路由到不同的内网服务。 |
udp | 单纯的 UDP 端口映射,服务端会根据不同的端口路由到不同的内网服务。 |
http | 针对 HTTP 应用定制了一些额外的功能,例如修改 Host Header,增加鉴权。 |
https | 针对 HTTPS 应用定制了一些额外的功能。 |
stcp | 安全的 TCP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。 |
sudp | 安全的 UDP 内网代理,需要在被访问者和访问者的机器上都部署 frpc,不需要在服务端暴露端口。 |
xtcp | 点对点内网穿透代理,功能同 stcp,但是流量不需要经过服务器中转。 |
tcpmux | 支持服务端 TCP 端口的多路复用,通过同一个端口访问不同的内网服务。 |
什么是frp?
frp 是一个高性能的反向代理应用,可以帮助您轻松地进行内网穿透,对外网提供服务,支持 tcp, http, https 等协议类型,并且 web 服务支持根据域名进行路由转发。frp 是一款跨平台的内网穿透工具,支持 Windows、macOS 与 Linux,它需要你有一台拥有固定公网 IP 的电脑,VPS 最好,然后就能愉快的进行内网穿透了。还支持 https,甚至可以用它进行小程序开发。
frp 的作用
- 利用处于内网或防火墙后的机器,对外网环境提供 http 或 https 服务。
- 对于 http 服务支持基于域名的虚拟主机,支持自定义域名绑定,使多个域名可以共用一个80端口。
- 利用处于内网或防火墙后的机器,对外网环境提供 tcp 服务,例如在家里通过 ssh 访问处于公司内网环境内的主机。
- 可查看通过代理的所有 http 请求和响应的详细信息。(待开发)
使用示例
根据对应的操作系统及架构,从 frp的Release 页面下载最新版本的程序。
将 frps 及 frps.ini 放到具有公网 IP 的机器上。
将 frpc 及 frpc.ini 放到处于内网环境的机器上。
然后配置frps.ini或frpc.ini 文件中的内容。
服务器端用命令frps -c frps.ini
来启动frp。
客户端用命令frpc -c frpc.ini
来启动frp。
frp的四种模式:tcp、udp、stcp、xtcp
- tcp和udp:就是将普通的tcp端口或者udp端口映射到公网上,相当于你的设备直接向公网暴露了一个tcp端口。任何设备都可以尝试连接这个端口。这里就会有很大的安全风险。
- stcp:出于安全和防止攻击的考虑,frp提供了使用密钥验证的tcp,这就是frp的Secret TCP(stcp)模式。示意图如下:
- xtcp:目的是让两个客户具有直接相连。在正式运行时,其实并不需要服务端做什么事情。
frp客户端就好比两个相亲的对象,frp服务端是媒婆。媒婆介绍完之后,就应该让两个相亲对象自己去聊天了。
这个就是点对点模式(p2p)。在frp中,这个可以通过设置xtcp实现。
这种模式的好处是不需要消耗服务器的带宽和网速,延时也较低。
不过该模式还在继续开发完善阶段,目前使用起来并不太稳定,很多时候会出现连不上的情况。并且与两端的路由器防火墙、DMZ、UPNP设置都有一些关系。本人测试后发现直接连接不上,暂时还未解决该问题。
示意图如下:
点对点内网穿透
在传输大量数据时如果都经过服务器中转的话,这样会对服务器端带宽压力比较大。
FRP 提供了一种新的代理类型 XTCP 来解决这个问题,XTCP 模式下可以在传输大量数据时让流量不经过服务器中转。实现方式是在传输数据的两端都部署上 FRP 客户端上用于建立直接的连接。
首先在 FRP 服务端 配置上增加一个 UDP 端口用于支持该类型的客户端: bind_udp_port = 7001
其中,客户端B是需要做端口映射的电脑。Visitor是访问端的电脑,只用于stcp模式和xtcp模式。
服务器端的frps配置
frps.ini
案列:
[common]
bind_port = 7000
bind_udp_port = 7001
vhost_http_port = 88
token = 123456
dashboard_user = admin
dashboard_pwd = 123456
dashboard_port = 7500
说明:
[common]
bind_addr = 0.0.0.0
bind_port = 7000 # 客户端与服务端进行通信的端口,即frp服务端口,需与客户端server_port一致
privilege_token = 123456 # 特权模式密钥,需与客户端frpc.ini一致
vhost_http_port = 8080 # http服务端口,开启后服务端完成通过域名访问部署于内网的 Web 服务部署,这里将 HTTP 访问端口设为 8080
vhost_https_port = 443 # https服务端口
dashboard_port = 7500 # 控制台端口 通过 Dashboard 可以方便的查看 FRP 的状态以及代理统计信息展示 通过 http://[server_addr]:7500 访问 Dashboard 界面,用户名密码默认都为 admin。
bind_udp_port = 7001
服务器端用命令frps -c frps.ini
来启动frp。
启动后输入http://[服务器ip]:7500
,并输入所设置的账号(admin)和密码(admin)就可以看到以下管理界面:
客户端的配置模式:stcp
- 客户端1:配置需要将type改为stcp即可
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p123]
type = stcp
sk = 123456789
local_ip = 0.0.0.0
bind_port = 3390
说明
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p123]
type = stcp # 选择模式stcp
sk = 123456789 # 只有 sk 一致的用户才能访问到此服务
local_ip = 0.0.0.0 # 本地IP
bind_port = 3390 # 映射需要端口
然后在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
客户端2:配置
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p_ssh_visitor]
type = stcp
role = visitor
server_name = p2p123
sk = 123456789
bind_addr = 0.0.0.0
bind_port = 6006
说明:
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p_ssh_visitor]
type = stcp
role = visitor # STCP 的访问者
server_name = p2p123 # 要访问的 STCP 代理的名字,客户端1名称一样
sk = 123456789 # 只有 sk 一致的用户才能访问到此服务,与客户端1,SK一致
bind_addr = 0.0.0.0 # 本地 IP
bind_port = 6006 # 访问本地端口
客户端用命令frpc -c frpc.ini
来启动frp。
客户端的配置模式:xtcp
- 客户端1:配置需要将type改为xtcp即可
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p123]
type = xtcp
sk = 123456789
local_ip = 0.0.0.0
bind_port = 3390
说明
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p123]
type = xtcp # 选择模式xtcp
sk = 123456789 # 只有 sk 一致的用户才能访问到此服务
local_ip = 0.0.0.0 # 本地IP
bind_port = 3390 # 映射需要端口
然后在要访问这个服务的机器上启动另外一个 FRP 客户端,配置如下:
客户端2:配置
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p_ssh_visitor]
type = xtcp
role = visitor
server_name = p2p123
sk = 123456789
bind_addr = 0.0.0.0
bind_port = 6006
说明:
[common]
server_addr = 服务器公网IP或者域名
server_port = 7000
token = 123456
[p2p_ssh_visitor]
type = xtcp
role = visitor # XTCP 的访问者
server_name = p2p123 # 要访问的 XTCP 代理的名字,客户端1名称一样
sk = 123456789 # 只有 sk 一致的用户才能访问到此服务,与客户端1,SK一致
bind_addr = 0.0.0.0 # 本地 IP
bind_port = 6006 # 访问本地端口
客户端用命令frpc -c frpc.ini
来启动frp。