一、起因

因为放假,为了在家能方便的使用学校电脑,由于自己有云服务器,且想试试之前用过但是没能用好的frp内网穿透,因此有了以下的折腾。

frp官方教程  https://gofrp.org/docs

按照官方的教程来一步步很方便就能实现的,试用了默认的TCP模式一段时间,总感觉有点不安全,首先我把Windows自带的远程桌面服务端口映射到了公网,因为RDP协议微软已经很久没有更新了再加上我的电脑密码比较简单,担心会有安全隐患(虽然我的电脑不值得黑客来搞),抱着闲着没事做瞎折腾的想法开始查资料。

首先看到的是frp作者同样为了安全而加入的STCP功能,它能在平时没人用的情况下不暴露端口,当有人使用且sk验证通过以后再启用服务,安全性还是不错的。不过还是存在几个问题,一个是当我远程连接快速拖动窗口使得服务器3M的速率拉满以后,远程连接直接掉线了,而独立端口不会出现这种问题,netstat -tunlp查看服务器端口占用情况发现frp服务端新建了一个进程监听端口,和TCP模式不同的是该端口和frp服务的端口7000一致,因此怀疑是不是监听了同一个端口导致了在占满带宽的情况下直接掉线,看官方手册也并没有STCP模式下指定端口范围的配置,另一个是家里的电脑还需要运行一个frp的客户端,且frp服务的端口还是需要暴露在公网下,有一点隐患,综合考虑该方案就被否决了。

至于frp作者的另外一个XTCP功能是属于P2P点对点的,多层路由的情况下就无法完成打洞,鉴于租房的地方就是这种网络,尝试失败以后也舍弃了。

百度frp的安全性也能给出不少的建议,我觉得可用性较高的就是在frp的基础上再套一层SSL加密,这里使用的是tro{jan}-go + {v2}rayN客户端,使用和https相同的协议,安全性有保障。

内网机器流量走向:内网机器 -> frp客户端 -> {v2}rayN客户端 -> 公网服务器 -> nginx 流量分发 -> tro{jan}-go服务端 -> frp服务端 -> 映射的端口3380

在家连接时的流量走向:家里的机器 -> {v2}rayN客户端 -> 公网服务器 -> nginx 流量分发 -> tro{jan}-go服务端 ->映射的端口3380

可以看到流量在进入frp服务端之前就已经在公网服务器里了,相当于本地网络访问,因此可以用防火墙把多余的端口全部关掉,只留下一个。

二、条件

目前我已经拥有的服务:

  • 基于nginx 的https博客网站
  • 拥有公网ip的云服务器
  • 基于tro{jan}-go的socks5服务(狗头,懂的都懂)
  • acme.sh脚本自动更新ssl证书
  • 基于frp TCP模式的内网穿透服务

受限于篇幅,没介绍的部分请大家自行百度。默认以上前4项都已经部署好了。

三、frp配置

首先服务端frps.ini

 复制代码 隐藏代码
[common]
# 监听的地址,0.0.0.0监听全部地址
bind_addr = 0.0.0.0
# TCP监听的端口
bind_port = 7000
# tcken相当于密码,和客户端token不一致时不接受客户端的连接
token = **********
# log_file 日志文件保存的位置,推荐使用绝对路径,也可以用相对地址./frps.log
log_file = /home/tool/frp/frps.log
# 日志等级
log_level = info
# 日志保存天数
log_max_days = 10

客户端frpc.ini

 复制代码 隐藏代码
[common]
# 后面会配置http_proxy代{过}{滤}理,因此这里的服务端地址为127.0.0.1
server_addr = 127.0.0.1
server_port = 7000
# tcken相当于密码,和服务端token不一致时不接受客户端的连接
token = **********

# log_file 日志文件保存的位置,推荐使用绝对路径,也可以用相对地址./frpc.log
log_file = D:/tools/frp_0.38.0_windows_386/frpc.log
log_level = info
log_max_days = 10

# 使用本地的socks5,对于的本地服务需要打开并且测试能用
http_proxy = socks5://127.0.0.1:1080
# 启用 TLS 协议加密连接
tls_enable = true
# 关闭登录失败自动退出
login_fail_exit = false

dns_server = 8.8.8.8

# 名字随意
[frp_test1]
# TCP模式
type = tcp
# 本地地址,填写自己的ip,例如192.168.1.23
local_ip = 10.xxx.xx.xx
# 需要映射的端口,我需要映射远程桌面的服务对应的就是3389
local_port = 3389
# 对应公网服务器上的映射的端口
remote_port = 3380
# 使用数据压缩,消耗一部分性能
use_compression = true
# 启用数据加密,消耗一部分性能
# use_encryption = true

配置好以后分别启动就可以了,成功的话可以在frp服务端的log文件里看到连接成功,并且是来自127.0.0.1的本地连接。

自动草稿

 

然后是家里电脑的配置,目的就是将Windows远程桌面连接程序mstsc.exe流量转发到云服务器,如果有其他方案可以直接忽略这一步。

这里使用的是Proxifier这个软件,具体使用方法我比较懒就不详细说明了,说一下关键设置,就是将localhost和mstsc.exe都加入规则,软件会自动流量转发到{v2}rayN客户端,远程桌面连接成功就能看到日志和流量使用情况。

自动草稿

 

自动草稿

 

远程桌面的流量走向:mstsc.exe -> Proxifier -> {v2}rayN客户端 -> 公网服务器 -> nginx 流量分发 -> tro{jan}-go服务端 ->映射的端口3380

总结

核心思想就是内网穿透稳定的前提下将暴露在公网的端口以各种方式隐藏起来,并使用足够安全的验证机制。以上实现了隐藏内网映射到公网的端口,内网穿透的流量全部通过ssl加密传输。nginx性能足够强大,应付这几个服务的流量绰绰有余,反正就我自己用。

以上只是一种实现思路,有些步骤可以不要,比如使用ssl加密传输就够了,nginx可以不需要,希望大家多多讨论,举一反三,共同进步,谢谢!!

声明:本站所有文章或资源,均来自互联网分享。本站不参与制作或存储,内容仅用于互联网爱好者学习和研究,如不慎侵犯了您的权利,请及时联系站长处理删除。敬请谅解!