内网穿透工具(替代 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>

说明:

17311 次点击
所在节点    程序员
105 条回复
varrily
2019-11-08 17:23:52 +08:00
来个类似的,多了 web 端管理,client 鉴权 ifport.com 。但说真的,java 太占内存了。
lswang
2019-11-08 17:48:59 +08:00
@varrily java 的特性,内存占用多,但是相对稳定一些
gy123
2019-11-08 17:54:49 +08:00
server-->长连接-->client;
client 监听 http 请求--->发送到 server 的 channl-->server 请求 http 服务返回数据;
思路是这样?
coloz
2019-11-08 18:09:22 +08:00
了解下
guanhui07
2019-11-08 19:06:40 +08:00
ngrok frp 我只知道
dukang
2019-11-08 20:58:28 +08:00
@lswang 你这个通信是所有流量都经由中转服务器。还是穿透后,两端点对点通信,无需经过中转?
ungrown
2019-11-08 22:58:11 +08:00
@lswang 你别给我腆着脸找台阶下,自己举错了例子就勇敢承担别人的质问。
还服务商开不下去,都是开源可自建项目,用户众多发展迅速。
我看你这个多余的项目倒是过不了多久就不维护了。
meppy
2019-11-09 06:50:35 +08:00
mark,我一直用 natfrp,挺不错的,还算比较稳定,网速比我自己搭的快。。
ac2sherry
2019-11-09 07:14:42 +08:00
@lswang 公司没有 vpn 吗?
conn4575
2019-11-09 07:41:56 +08:00
star 了,不过我还是觉得 frp 更香。看到是 java 的就有点抵触,小机器内存耗不起 233,不过拿来学 netty 应该不错😮
lswang
2019-11-09 07:50:15 +08:00
@conn4575 谢谢,一开始写这个项目的目的也是为了学习 netty。其实之前已经用 Java 原生网络库写了一个,不过感觉性能不够好、功能不够多,就用 netty 重写了。
lswang
2019-11-09 07:52:23 +08:00
@conn4575 公司肯定不给用自己的穿透软件,这个主要是为了访问家里的树莓派
shell314
2019-11-09 08:16:44 +08:00
支持
waiaan
2019-11-09 09:09:58 +08:00
这类软件,中转服务器才是最关键的吧?
eq06
2019-11-09 10:39:34 +08:00
有 server 的人不需要内网穿透,没 server 的人用不了你的工具
lswang
2019-11-09 11:18:23 +08:00
@eq06 是需要一个 server,内网需求还是看自己了。我用内网穿透是为了用天猫精灵控制家里的树莓派开关电视
lswang
2019-11-09 11:20:48 +08:00
@waiaan 是的,现在双十一某宝和某讯针对新用户都有很大折扣,不过上车需注意,因为到期续费太贵了
lswang
2019-11-09 11:23:54 +08:00
@shell314 感谢支持
waiaan
2019-11-09 11:33:58 +08:00
@lswang 我记得 ngrok 是可以直接用的。
ICKelin
2019-11-09 11:56:53 +08:00
最近怎么这么多人写内网穿透软件。。。

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

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

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

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

© 2021 V2EX