由于 IPv4 资源的有限性,目前大部分的本地电脑都是没有公网 IP。所以想要访问自己的本地服务(ssh、http、vnc、NAS、智能家居接口回调 - 比如天猫精灵自定义语义),需要有个服务来进行内网穿透。 目前有一些工具比如花生壳、ngrok 等。但是,
所以,需要一款开源的方案( 当然还需要一个固定的公网 IP >_<)。
本人用 netty 写了一个 tcp 的穿透工具叫 Tcp Through,直接下载可用。安装方式下面有介绍
该项目分 server 端和 client 端,想要看详细信息的话,可以去 github 上查看
https://github.com/longshengwang/tcpthrough-serverhttps://github.com/longshengwang/tcpthrough-client这个工具有以下一些比较实用的功能
备注: 如果是公网虚拟机(阿里云或者腾讯云),记得要开放相应的端口
# 下载并解压
> 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 端口来访问内网的 localhost 的 22端口
# 下载并解压
> 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来查看
参数说明:
-c 表示 client 是否可以被 server 控制(是否可以增加被代理的服务)-u 客户端的名称,也是唯一标识,server 下的 client name 不可以重复-a 表示被代理的端口只可以被信任的主机访问 (如何增加被信任的主机,下面的命令行会有提到)-f 表示可以把所有的参数都写入文件,然后用 -f 指向该文件
文件模板如下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>
说明:
exit 或者 ctrl + d 或者 ctrl + c 退出命令行模式-a, 那么只有通过 trust add <your-client-name> <your-ip> 来添加信任的 IP 地址     1 
                    
                    shadowczp      2019-11-08 10:33:09 +08:00 
                    
                    其实比较新的工具里,有现成的叫做 frp。。。 
                 | 
            
     3 
                    
                    HangoX      2019-11-08 10:41:44 +08:00 
                    
                    倒是差一个 ngrok 重放的功能,其他都没有 
                 | 
            
     4 
                    
                    xxsww211      2019-11-08 10:43:27 +08:00 
                    
                    我觉得楼主这个也很不错,很到位。 
                楼主要不考虑其他的突破点,比如不需要固定的公网 IP。连接第三方服务器实现转发,当然第三方这个过程也是开源的,让用户自由组建。  | 
            
     5 
                    
                    yorkyoung      2019-11-08 10:48:07 +08:00 
                    
                    限速、客户端管理和流量实时这些功能还是比较新颖的,先马后看 
                 | 
            
     8 
                    
                    imagecap      2019-11-08 10:57:49 +08:00 
                    
                    收费也好免费也好,最后都是要走公网 ip,都是要花钱。最终各种成本综合考虑,选择自己适合的。 
                 | 
            
     10 
                    
                    lswang   OP  | 
            
     11 
                    
                    boywhp      2019-11-08 11:04:31 +08:00 
                    
                    FCN 一键免费穿透,日常维护管理基本够用了 
                 | 
            
     12 
                    
                    keepeye      2019-11-08 11:07:55 +08:00 
                    
                    frp 很稳定,就是阿里云带宽太贵了 
                 | 
            
     13 
                    
                    ChangHaoWei      2019-11-08 11:09:23 +08:00 
                    
                    你们都不用 ssh 自带的端口转发?简单快捷。基于 alphine 装 ssh-client 然后 docker 起来也免进程管理。 
                换服务器还什么都不用调,通讯还是加密的。不能理解为什么不用。。  | 
            
     14 
                    
                    lswang   OP @ChangHaoWei  用过,容易断。用 docker 运行应该会好点 
                 | 
            
     15 
                    
                    prenwang      2019-11-08 11:24:21 +08:00 
                    
                    java netty 实现,是不是内存占用多了一点 
                 | 
            
     16 
                    
                    tigerstudent      2019-11-08 11:30:33 +08:00 
                    
                    @ChangHaoWei 断了就没了,得重新执行命令,还得写一套脚本去管理重连 
                 | 
            
     17 
                    
                    xxsww211      2019-11-08 11:33:49 +08:00 
                    
                    @lswang 你误会我的意思了。技术只管实现,至于这第三方到底是谁就不用去管,因为这是用户自己的需求,他们自己在一些云服务器搭建个服务就行了。这比自己去建一个第三方要实在很多。 
                 | 
            
     18 
                    
                    easing      2019-11-08 11:50:59 +08:00 
                    
                    我理解这还是需要服务端转发流量? 
                 | 
            
     19 
                    
                    jaybing926      2019-11-08 11:53:45 +08:00 
                    
                    @ChangHaoWei 我用 SSH 转发,frp,ngrok 这些工具都需要 server 端和 client 端,SSH 只要一条命令,一条命令~~ 
                 | 
            
     20 
                    
                    lihongjie0209      2019-11-08 11:56:21 +08:00 
                    
                    mark 一下 后面学习用 
                 | 
            
     22 
                    
                    lswang   OP @jaybing926  ssh 转发是简单,不过少了 限速、管理一些其他的功能 
                 | 
            
     23 
                    
                    fanyingmao      2019-11-08 12:12:13 +08:00 via Android 
                    
                    还是直接用 ssh 转发,比较简单。 
                 | 
            
     25 
                    
                    wpblank      2019-11-08 12:57:22 +08:00 
                    
                    正好我顺路问个问题,本来准备电脑弄个内网穿透,回家了也能连上。结果我们公司网络好像屏蔽了 frp 和 v2ray,想问下怎么实现的 
                 | 
            
     26 
                    
                    sagaxu      2019-11-08 13:03:19 +08:00 via Android 
                    
                    家里宽带公网 IP,配了 dmz,域名解析到家里 IP,每隔半个小时向 dnspod 上报一次 IP。 
                公司 ssh 连接到家里做隧道,systemd 管理,转发失败会自动重连。 第三方工具,好像并不需要。  | 
            
     27 
                    
                    encro      2019-11-08 13:10:23 +08:00 
                    
                    frp,nps,goproxy 都很不错 
                 | 
            
     28 
                    
                    wangyongbo      2019-11-08 13:10:41 +08:00 
                    
                    @jaybing926   教一下我吧, 这一条命令是啥? 谢谢 
                 | 
            
     29 
                    
                    shenqi      2019-11-08 13:33:23 +08:00 
                    
                    临时使用,推荐  pierced。不要滥用了,不然封了就惨了。 
                 | 
            
     30 
                    
                    sagaxu      2019-11-08 13:36:05 +08:00 via Android 
                    
                    @tigerstudent systemd 或者 supervisord 都很成熟 
                 | 
            
     31 
                    
                    lswang   OP @wpblank  怎么屏蔽 frp 和 v2ray 的就不知道了。 文章里的安装步骤照着做就行,如果是 windows 的,把文章里对应的命令换成你手动操作。不过你需要有一个固定的公网 IP 
                 | 
            
     32 
                    
                    jaybing926      2019-11-08 14:18:59 +08:00 
                    
                    @wangyongbo ssh -R 20001:localhost:80 [email protected] 或者 autossh -p22 -M 5000 -NR 20001:0.0.0.0:80 [email protected],autossh 会一直尝试重新连接 可以消除网络故障隐患,ssh 透传的缺陷是透传到外网的端口只能监听 127 
                 | 
            
     33 
                    
                    samondlee      2019-11-08 14:29:25 +08:00 
                    
                    点个 star2333 
                感觉和 sakura frp 魔改的 有点儿像  | 
            
     36 
                    
                    SenLief      2019-11-08 15:29:27 +08:00 
                    
                    有公网 IP 的还是直接用 DDNS,没有的我觉得不如买一个设备了。省心 
                 | 
            
     37 
                    
                    labubu      2019-11-08 15:31:34 +08:00 via Android 
                    
                    frp 不香吗? 
                 | 
            
     38 
                    
                    lswang   OP @daimiaopeng 自己写的最香 
                 | 
            
     39 
                    
                    ungrown      2019-11-08 15:52:12 +08:00 
                    
                    @xxsww211 你们为什么造轮子之前就不能先查一下,你说的这个也有了,而且早就有了,“远古”项目 n2n 就是(虽然已经凉凉),现在有个更大的项目 zerotier 
                 | 
            
     42 
                    
                    lswang   OP @ungrown  我也想写加密算法,可惜数学能力限制了我。 
                重复造轮子的说法不适合个人,程序员就是通过自己开发来学更多的东西。自己造的轮子是自己的轮子,别人造的轮子是别人的。 再说,如果都用别人的轮子,那你说为什么华为还要搞芯片干嘛?华为也在浪费生产力?  | 
            
     43 
                    
                    m1862897      2019-11-08 16:19:19 +08:00 
                    
                    一般人用 frp 就行了 
                我当然会把你这个作为备用的,毕竟有 java 源码,熟悉 netty 的 chanelhandler 和 pipeline 可以自己修改; frp 好像是 go 写的,go 这种语言,还真特么不会,完全看不懂写的神马,根本无从改起。  | 
            
     44 
                    
                    m1862897      2019-11-08 16:20:07 +08:00 
                    
                    所以,大佬,我支持你。 
                呵呵,可能还会抄袭你的 netty 代码。  | 
            
     45 
                    
                    ysys123      2019-11-08 16:21:11 +08:00 
                    
                    我用的付费的 natapp 用起来也挺稳定 还不用担心自己的 vps 有问题 
                 | 
            
     49 
                    
                    Calm1      2019-11-08 16:27:22 +08:00 
                    
                    收藏了,感觉不错。谢谢楼主分享。 
                 | 
            
     50 
                    
                    ungrown      2019-11-08 16:28:55 +08:00    @lswang 因为别的芯片厂商故意给华为使绊子,请问你被别人使绊子了吗? 
                如果你还觉得实现加密算法的关键是数学能力的话,我只能呵呵,请自行搜索“不要自己实现加密算法”。  | 
            
     51 
                    
                    Kilerd      2019-11-08 16:36:31 +08:00 
                    
                    jaav 写这种东西真的是。。。。。。 怎么说呢? 感觉没必要? 
                 | 
            
     52 
                    
                    lswang   OP  | 
            
     53 
                    
                    atom234      2019-11-08 16:41:55 +08:00 
                    
                    不错 
                 | 
            
     54 
                    
                    lswang   OP @Kilerd 写这个库主要也是实际用下 netty,熟悉网络开发。Netty 很稳定,性能也还行,而且把底层的很多部分都省去了。很多开源项目(JAVA)涉及网络的部分都是 netty 开发的,比如 zookeeper。一些大公司也会用 netty 做一些网络开发。 
                 | 
            
     55 
                    
                    m1862897      2019-11-08 16:48:42 +08:00 
                    
                    大佬 
                ,看了一下你的代码 ,你的打包方式别具一格 ,依赖相当精华尽量优化到最低 ,小可对大佬佩服得五体投地 ,能否加个微信 ,以后给小可一点指教  | 
            
     57 
                    
                    thanatosS      2019-11-08 16:53:11 +08:00 
                    
                    学习了 
                 | 
            
     58 
                    
                    tankren      2019-11-08 16:54:47 +08:00 
                    
                    我的联通有公网 有 IPv6 有 443 哈哈 
                 | 
            
     59 
                    
                    morphyhu      2019-11-08 17:09:36 +08:00 
                    
                    支持楼主,感谢分享。在中国的这种网络环境下,多个选择总是好的。 
                 | 
            
     60 
                    
                    weifengzi2009      2019-11-08 17:21:43 +08:00 
                    
                    @jaybing926 #32 不只是能监听 127 啊,你可以用 GatewayPorts 去控制监听任意 interface 啊 
                 | 
            
     61 
                    
                    varrily      2019-11-08 17:23:52 +08:00 
                    
                    来个类似的,多了 web 端管理,client 鉴权 ifport.com 。但说真的,java 太占内存了。 
                 | 
            
     63 
                    
                    gy123      2019-11-08 17:54:49 +08:00 
                    
                    server-->长连接-->client;  
                client 监听 http 请求--->发送到 server 的 channl-->server 请求 http 服务返回数据; 思路是这样?  | 
            
     64 
                    
                    coloz      2019-11-08 18:09:22 +08:00 
                    
                    了解下 
                 | 
            
     65 
                    
                    guanhui07      2019-11-08 19:06:40 +08:00 
                    
                    ngrok frp 我只知道 
                 | 
            
     67 
                    
                    ungrown      2019-11-08 22:58:11 +08:00 via Android     | 
            
     68 
                    
                    meppy      2019-11-09 06:50:35 +08:00 
                    
                    mark,我一直用 natfrp,挺不错的,还算比较稳定,网速比我自己搭的快。。 
                 | 
            
     70 
                    
                    conn4575      2019-11-09 07:41:56 +08:00 via Android 
                    
                    star 了,不过我还是觉得 frp 更香。看到是 java 的就有点抵触,小机器内存耗不起 233,不过拿来学 netty 应该不错😮 
                 | 
            
     71 
                    
                    lswang   OP @conn4575  谢谢,一开始写这个项目的目的也是为了学习 netty。其实之前已经用 Java 原生网络库写了一个,不过感觉性能不够好、功能不够多,就用 netty 重写了。 
                 | 
            
     73 
                    
                    shell314      2019-11-09 08:16:44 +08:00 via Android 
                    
                    支持 
                 | 
            
     74 
                    
                    waiaan      2019-11-09 09:09:58 +08:00 
                    
                    这类软件,中转服务器才是最关键的吧? 
                 | 
            
     75 
                    
                    eq06      2019-11-09 10:39:34 +08:00 
                    
                    有 server 的人不需要内网穿透,没 server 的人用不了你的工具 
                 | 
            
     76 
                    
                    lswang   OP @eq06 是需要一个 server,内网需求还是看自己了。我用内网穿透是为了用天猫精灵控制家里的树莓派开关电视 
                 | 
            
     77 
                    
                    lswang   OP @waiaan 是的,现在双十一某宝和某讯针对新用户都有很大折扣,不过上车需注意,因为到期续费太贵了 
                 | 
            
     80 
                    
                    ICKelin      2019-11-09 11:56:53 +08:00 
                    
                    最近怎么这么多人写内网穿透软件。。。 
                 | 
            
     81 
                    
                    ICKelin      2019-11-09 12:13:51 +08:00 
                    
                    ngrok 这款软件很好,但是是国外的,连接的节点看其内部调度算法以及是否在国内有节点。 
                frp 是开源项目,面向的是有技术底子的人,没技术功底的让他折腾不一定能搞得定,其实可以算一下,如果 frp 需要花一个早上来搞定部署,还需要域名备案,时间上的消耗足够购买收费软件一年了,还需要额外支付服务器费用,不太划算的。 市面上有不少基于 frp 或者 ngrok 来做二次开发的软件,但是毕竟不是独立开发的,出故障能否快速解决其实也是一个问题,官网打着免费的旗号,但是这类软件带宽费用是个大头,最终肯定是需要收回去的。 我觉得楼主是不是可以考虑尝试往软件服务方向去做。  | 
            
     86 
                    
                    xia0shi      2019-11-09 15:53:53 +08:00 via iPhone 
                    
                    支持 点赞 
                 | 
            
     87 
                    
                    zhfsxtx      2019-11-09 21:24:55 +08:00 
                    
                    请问开发这种程序你是用什么 IDE? 
                 | 
            
     89 
                    
                    quericy      2019-11-10 14:21:53 +08:00 
                    
                    后续考虑支持 client 之间 p2p 么 
                 | 
            
     90 
                    
                    c0py7hat      2019-11-10 22:47:27 +08:00 
                    
                    为啥你们都有这需求,我就没这需求,佛系..难道我太菜了 
                 | 
            
     94 
                    
                    stevenkang      2019-11-11 10:01:56 +08:00 
                    
                    有更简单的: 
                ssh -R 80:localhost:8080 serveo.net  | 
            
     95 
                    
                    zunceng      2019-11-11 15:38:28 +08:00 
                    
                    你都有 server 了  用 autossh 不就完事了 
                 | 
            
     96 
                    
                    ICKelin      2019-11-11 19:22:08 +08:00 
                    
                    @darknoll 真得看人,我印象中作者也搞了个付费星球群专门解决问题的,大部分人可能是大部分技术人员。买个服务器,买个域名做个解析是不是很难的事,但是并不是所有人都能做得了的。 
                 | 
            
     97 
                    
                    wslzy007      2019-11-12 15:00:41 +08:00 
                    
                    目前 go 语言的穿透工具很多,java 的倒是少见,奈何我的哲学是绿色环保,自己动手,只用 c/c++的 
                 | 
            
     98 
                    
                    lswang   OP @wslzy007  go 在做网络开发方面确实比 java 好。用 java 做网络开发的唯一理由就是 netty 这个库,真的是香 
                 | 
            
     99 
                    
                    wslzy007      2019-11-12 18:52:06 +08:00 
                    
                    @lswang 认同,前提是从 0 开始。毕竟 java 生态是公认最好的。go 的网络框架 /web 框架的确很优秀,这个可以看我之前发的对比测试帖子。做技术,始终是术业有专攻,没有最好的,只有最适合自己的。 
                 | 
            
     100 
                    
                    easing      2019-11-20 14:56:35 +08:00 
                    
                    Client 侧可以同时起多个转发么,还是说每个转发需要一个运行一个 client。 
                 |