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

2019-11-08 10:25:29 +08:00
 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>

说明:

16294 次点击
所在节点    程序员
104 条回复
ungrown
2019-11-08 15:54:48 +08:00
@zlylong 协议白名单,或者端口白名单,甚至 IP 地理池白名单
lswang
2019-11-08 16:09:35 +08:00
@ungrown 我也想写加密算法,可惜数学能力限制了我。
重复造轮子的说法不适合个人,程序员就是通过自己开发来学更多的东西。自己造的轮子是自己的轮子,别人造的轮子是别人的。

再说,如果都用别人的轮子,那你说为什么华为还要搞芯片干嘛?华为也在浪费生产力?
m1862897
2019-11-08 16:19:19 +08:00
一般人用 frp 就行了

我当然会把你这个作为备用的,毕竟有 java 源码,熟悉 netty 的 chanelhandler 和 pipeline 可以自己修改;
frp 好像是 go 写的,go 这种语言,还真特么不会,完全看不懂写的神马,根本无从改起。
m1862897
2019-11-08 16:20:07 +08:00
所以,大佬,我支持你。
呵呵,可能还会抄袭你的 netty 代码。
ysys123
2019-11-08 16:21:11 +08:00
我用的付费的 natapp 用起来也挺稳定 还不用担心自己的 vps 有问题
lswang
2019-11-08 16:23:02 +08:00
@m1862897 谢谢支持,代码随意用
lswang
2019-11-08 16:24:58 +08:00
@ysys123 这种流量收费的,怎么防止有人恶意蹭?
lswang
2019-11-08 16:25:40 +08:00
@ysys123 我看阿里云也有按流量收费,不过不敢用,怕有心人搞。。
Calm1
2019-11-08 16:27:22 +08:00
收藏了,感觉不错。谢谢楼主分享。
ungrown
2019-11-08 16:28:55 +08:00
@lswang 因为别的芯片厂商故意给华为使绊子,请问你被别人使绊子了吗?
如果你还觉得实现加密算法的关键是数学能力的话,我只能呵呵,请自行搜索“不要自己实现加密算法”。
Kilerd
2019-11-08 16:36:31 +08:00
jaav 写这种东西真的是。。。。。。 怎么说呢? 感觉没必要?
lswang
2019-11-08 16:38:29 +08:00
@ungrown 如果你用的服务的供应商开不下去了,你用啥。。 。 华为的例子,简单举例,用不着深入探讨。

我想你的时间应该会用来创造更多的价值,不会浪费的。
atom234
2019-11-08 16:41:55 +08:00
不错
lswang
2019-11-08 16:42:49 +08:00
@Kilerd 写这个库主要也是实际用下 netty,熟悉网络开发。Netty 很稳定,性能也还行,而且把底层的很多部分都省去了。很多开源项目(JAVA)涉及网络的部分都是 netty 开发的,比如 zookeeper。一些大公司也会用 netty 做一些网络开发。
m1862897
2019-11-08 16:48:42 +08:00
大佬
,看了一下你的代码
,你的打包方式别具一格
,依赖相当精华尽量优化到最低
,小可对大佬佩服得五体投地
,能否加个微信
,以后给小可一点指教
lswang
2019-11-08 16:51:05 +08:00
@m1862897 =.= 也就是用了 gradle 打包。。。优点就是不用写那么多冗余的 xml 标签。
thanatosS
2019-11-08 16:53:11 +08:00
学习了
tankren
2019-11-08 16:54:47 +08:00
我的联通有公网 有 IPv6 有 443 哈哈
morphyhu
2019-11-08 17:09:36 +08:00
支持楼主,感谢分享。在中国的这种网络环境下,多个选择总是好的。
weifengzi2009
2019-11-08 17:21:43 +08:00
@jaybing926 #32 不只是能监听 127 啊,你可以用 GatewayPorts 去控制监听任意 interface 啊

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

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

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

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

© 2021 V2EX