内网穿透工具(替代 ngrok 和花生壳)

2019 年 11 月 8 日
 lswang

简介

由于 IPv4 资源的有限性,目前大部分的本地电脑都是没有公网 IP。所以想要访问自己的本地服务(ssh、http、vnc、NAS、智能家居接口回调 - 比如天猫精灵自定义语义),需要有个服务来进行内网穿透。 目前有一些工具比如花生壳、ngrok 等。但是,

  1. 花生壳是收费的;
  2. ngrok 第二版也开始收费(第一版据说有一些严重 bug)。

所以,需要一款开源的方案( 当然还需要一个固定的公网 IP >_<)。

解决方案

本人用 netty 写了一个 tcp 的穿透工具叫 Tcp Through,直接下载可用。安装方式下面有介绍

该项目分 server 端和 client 端,想要看详细信息的话,可以去 github 上查看

这个工具有以下一些比较实用的功能

  1. 支持 http api 管理服务端,还支持 命令行来管理(自己写的 python 库,自己感觉还挺炫)
  2. 支持安全模式。只有在信任列表的 IP 地址才可以访问 client (防止攻击的最好方式)
  3. 支持速度限制,功能已经测试可用。只是目前在代码中没有限速,可自己修改代码,具体代码在 server 库中的 OuterServer 中,注释中有说明。
  4. client 可设定不允许 server 控制 (client 端的 isRemoteManage 参数)
  5. 支持查看实时速率(不需要用总量来计算)
  6. 管理通道进行了 SSL 加密,防止注册信息被抓包
  7. 数据平面和控制平面分离,提高性能(mac 下测速能达到 10Gb/s+)。
  8. 管理平面和控制平面都进行了安全性校验,不正确的连接会被 kill 掉,拒绝攻击。
  9. Server 可以增加密码校验,不允许其他的 client 注册。Server 启动时候加上 -s 参数。

备注: 如果是公网虚拟机(阿里云或者腾讯云),记得要开放相应的端口

Server 安装和运行

# 下载并解压
> wget https://github.com/longshengwang/tcpthrough-server/releases/download/v1.0/server-1.0.zip
> unzip server-1.0.zip
> cd server-1.0
# 启动 server 端,会占用 3 个端口,用途分别是 控制面(默认 9000)、数据面(9009)、http 服务(8080)。可以使用 --help 查看如何设定
> bin/server

注: 详细参数可以通过 bin/server --help 来查看

下面的例子是通过 服务器端的 333 端口来访问内网的 localhost22端口

Client 安装和运行

# 下载并解压
> wget https://github.com/longshengwang/tcpthrough-client/releases/download/client-1.0/client-1.0.zip
> unzip client-1.0.zip
> cd client-1.0
# 启动 client 端, 下面的字段表示:通过服务器上的 333 端口,可以访问客户端的 localhost:22 服务(这里是 ssh 服务)
> bin/client -u my_home -s <server ip>  -p 333 -l localhost:22 -p 333 -c true -a true

注: 详细参数可以通过 bin/client --help 来查看

参数说明:

name=wls_home
password=wo_shi_server_password
remote_host=192.168.122.20
remote_data_port=9009
remote_manager_port=9000
local_host=192.168.122.20
local_port=22
remote_proxy_port=2222
is_remote_manage=true

命令行

可以通过 python 的一个库(自己写的),来查看和管理 server 上的连接信息

➜ ~ pip install tcpth.cmd
➜ ~ tcpthcmd  # 如果 server 上的 http 端口不是默认的 8080,可以后面加上 -p <port>
Welcome to use the tcp through.
tcpthrough> help
tcpthrough> help
    list -- get all registration
    get <name> -- get special name information
    monitor [<name>] -- monitor the information, refresh on 2s
    register add <name> <localhost:port> <proxy port> -- add registration
    register delete <name> <proxy port> -- delete registration
    trust add <name> [<proxy port>] <trusted ip> -- add trust ip
    trust delete <name> [<proxy port>] <trusted ip> -- delete trust ip
    trust get <name> [<proxy port>] -- get trust ip
tcpthrough>
tcpthrough> list   # 在命令行下,列是对齐的,拷贝过来之后就不对齐了
 Name | Local Service | Proxy Port | Out Conn Count | Remote Managed | Security | Write Speed | Read Speed
--------------------------------------------------------------------------------------------------------------
 my_home | localhost:22 | 333 | 0 | true | true | 0KB/s | 0KB/s
tcpthrough>

说明:

21415 次点击
所在节点    程序员
105 条回复
ICKelin
2019 年 11 月 9 日
ngrok 这款软件很好,但是是国外的,连接的节点看其内部调度算法以及是否在国内有节点。

frp 是开源项目,面向的是有技术底子的人,没技术功底的让他折腾不一定能搞得定,其实可以算一下,如果 frp 需要花一个早上来搞定部署,还需要域名备案,时间上的消耗足够购买收费软件一年了,还需要额外支付服务器费用,不太划算的。

市面上有不少基于 frp 或者 ngrok 来做二次开发的软件,但是毕竟不是独立开发的,出故障能否快速解决其实也是一个问题,官网打着免费的旗号,但是这类软件带宽费用是个大头,最终肯定是需要收回去的。

我觉得楼主是不是可以考虑尝试往软件服务方向去做。
imWBB
2019 年 11 月 9 日
@ICKelin
为什么要备案?
直接用国外的服务器就好了。
ICKelin
2019 年 11 月 9 日
@imWBB 可以的。
shinciao
2019 年 11 月 9 日
@ICKelin #81 frp 部署不是 3 分钟就好了的吗。。使用非 80/443 端口也不需要备案
ICKelin
2019 年 11 月 9 日
@lanternxx 部署这东西得看人,有人用内网穿透是用来做公众号接口调试的,这个还真要求 80/443 端口。
xia0shi
2019 年 11 月 9 日
支持 点赞
zhfsxtx
2019 年 11 月 9 日
请问开发这种程序你是用什么 IDE?
lswang
2019 年 11 月 9 日
@zhfsxtx idea
quericy
2019 年 11 月 10 日
后续考虑支持 client 之间 p2p 么
c0py7hat
2019 年 11 月 10 日
为啥你们都有这需求,我就没这需求,佛系..难道我太菜了
darknoll
2019 年 11 月 11 日
@ICKelin frp 是我见过部署最简单的软件了,大部分人几分钟就搞定了吧。
lswang
2019 年 11 月 11 日
@quericy 暂时不考虑,现在打洞太难了。之前用试过了,打不进去。。。
lswang
2019 年 11 月 11 日
@c0py7hat 看自己的需求了,一般捣鼓树莓派和小米或者天猫智能家居之类的,这个需求还是很多的
stevenkang
2019 年 11 月 11 日
有更简单的:
ssh -R 80:localhost:8080 serveo.net
zunceng
2019 年 11 月 11 日
你都有 server 了 用 autossh 不就完事了
ICKelin
2019 年 11 月 11 日
@darknoll 真得看人,我印象中作者也搞了个付费星球群专门解决问题的,大部分人可能是大部分技术人员。买个服务器,买个域名做个解析是不是很难的事,但是并不是所有人都能做得了的。
wslzy007
2019 年 11 月 12 日
目前 go 语言的穿透工具很多,java 的倒是少见,奈何我的哲学是绿色环保,自己动手,只用 c/c++的
lswang
2019 年 11 月 12 日
@wslzy007 go 在做网络开发方面确实比 java 好。用 java 做网络开发的唯一理由就是 netty 这个库,真的是香
wslzy007
2019 年 11 月 12 日
@lswang 认同,前提是从 0 开始。毕竟 java 生态是公认最好的。go 的网络框架 /web 框架的确很优秀,这个可以看我之前发的对比测试帖子。做技术,始终是术业有专攻,没有最好的,只有最适合自己的。
easing
2019 年 11 月 20 日
Client 侧可以同时起多个转发么,还是说每个转发需要一个运行一个 client。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/617484

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX