关于ZAKER 融媒体解决方案 合作 加入
51CTO 10-26

FRP 指定访问者:安全地暴露内网服务

之前的教程介绍的 frp 内网穿透都是用 tcp 模式,但是 tcp 模式是直接把端口映射到公网 IP 上,很容易被扫描爆破,还是存在一定的风险。我们可以使用 frp 提供的 stcp 模式来避免公开暴露端口,要求访问者运行一个 frpc 作为身份认证和流量转发,把访问者的本地端口绑定到内网 frpc 服务上。不再公开映射内网 frpc 端口。

frps 配置

作为中间传输的服务器端的 frps 配置不变,参考之前的文章,如果想自定义其他端口,注意两端的 frpc 中的 "server_addr"、"server_port" 参数要一致。frps 用到的端口要在防火墙或者宝塔那里放行。

frps.ini

[ common ]

bind_port = 7100

token=12310086N

dashboard_port = 7501

dashboard_user = admin

dashboard_pwd = admin123

客户端

stcp 模式的演示,我们以 windwos 的远程桌面为例,不再直接把内网的 3389 端口映射到公网 IP 的端口上,而是通过 stcp 模式指定验明访问者分身,要求访问者也要运行一个 frpc 作为身份校验和流量转发,让访问者把访问本地端口的请求转发到内网机器上。

frpc 两端分为外部的 " 控制端 " 和处于内网中的 " 受控端 "。

内网中的受控端

编辑 fcpc.ini 文件。服务 [ secret_rdp ] 之类的服务名可以自定义,见名知意即可。

[ common ]

server_addr = 服务器 ip

server_port = 7100

token=12310086N

[ secret_rdp ]

type = stcp

sk = 58iD9tfjPIHQ0dWO

local_ip = 127.0.0.1

local_port = 3389

frpc.exe -c frpc.ini

外网的控制端

编辑 fcpc.ini 文件,服务 [ secret_rdp_visitor ] 之类的服务名可以自定义,见名知意即可。

[ common ]

server_addr = 服务器 ip

server_port = 7100

token=12310086N

[ secret_rdp_visitor ]

type = stcp

role = visitor

sk = 58iD9tfjPIHQ0dWO

server_name = secret_rdp

bind_addr = 127.0.0.1

bind_port = 30009

frpc.exe -c frpc.ini

牵线成功

两端都显示连接成功了,frp 的在线面板里也看到 stcp 中多了 "secret_rdp" 一个连接记录。

控制端启动连接成功时候也会看到 frps 出现连接成功的日志。

连接

我们在外网的控制端,打开远程桌面,输入 "127.0.0.1:30009", 就弹出来连接成功的登录界面了。

原 理

原理两端的 frpc 启用的 stcp 模式,就是要求 frps 把一端访问本地端口的请求转发到内网 frpc 上。一端必须运行访客模式的 frpc 表明身份才会被 frps 接纳再转发。

受控端

受控端中 frpc 读取配置文件:

" [ secret_rdp ] " 服务中,以 stcp 模式,把受控端本地的 3389 转发到服务器的 frps 上。

"sk" 是 stcp 服务的密钥,两端中的 "sk" 不匹配,不允许连接。

受控端 stcp 模式以服务名的形式匹配连接,不需要映射到公网 IP 的端口上,也不再需要 remote_port。

控制端

控制端中的配置:

[ secret_rdp_visitor ] 服务中 "role=visitor" 是指定本机的服务为 " 访问者 " 的 stcp 模式。

"sk" 密钥。

控制端中的 "server_name" 是指定要连接的受控端中的服务名,服务名必须一致。

控制端中的 "bind_addr" 必须是 "127.0.0.1"。

"bind_addr"、"bind_port" 这两个参数是指本地端口。指定本地 frpc 转发要通过 frps 和受控端连接的本地端口。

流程

frps 启动,等着两端 frpc 的 stcp 转发配置。

受控端 frpc 启动,读取配置文件 : 服务名 [ secret_rdp ] 以 stcp 模式,将本地的 3389 端口转发到 frps 上。

控制端 frpc 读取配置文件和 frps 连接。

控制端 frpc 的配置指定 "sk" 密钥和受控端的服务名,要 frps 把控制端本地 30009 端口和受控端的 [ secret_rdp ] 服务绑定上。

控制端访问本地 30009 端口,请求被控制端的 frpc 转发到 frps 上,frps 再将请求转发到受控端的 [ secret_rdp ] 服务上。

受控端 [ secret_rdp ] 服务里也指明了受控端哪些端口来接收响应处理被转发请求。

总 结

流程就是 frpc 指定使用 stcp 访问,要求校验正确身份和服务名后再转发请求,把访问者的本地端口绑定到内网 frpc 服务上。不再直接把受控端映射到公网端口上,也避免因为公开被扫描爆破的风险,安全的暴露内网服务。表达水平有限,多读几遍上面的步骤,就是把访问者的本地端口绑定到内网 frpc 服务上,这一套下来比较绕,如果没看懂,照着教程操作一次,理解了就豁然开朗了。同时也可以着手实践安全的暴露其他的内网服务,比如 MySQL:指定控制端访问本地的 33306 端口的响应由内网的 MySQL 3306 响应。

本文转载自微信公众号「Linux 就该这么学」,可以通过以下二维码关注。转载本文请联系 Linux 就该这么学公众号。

【编辑推荐】

北京市民超过 1000 项服务可在 " 北京政务服务 " 小程序上办理

利器分享:实时监控 Linux 服务器性能的工具

如何使用 Docker 内的 Kafka 服务?消息服务测试实践篇

如何进行内网信息收集

数据保护即服务如何为组织业务提供帮助

【责任编辑:武晓燕 TEL:(010)68476606】

点赞 0

以上内容由"51CTO"上传发布 查看原文
相关标签

觉得文章不错,微信扫描分享好友

扫码分享