做了一个隧道软件,叫做 Termtunnel,邀请大家体验

2022-05-01 21:46:16 +08:00
 beordle

简单来说,就是和 lrzsz 一样的原理,原理上可以绕过堡垒机完成网络的打通,比如可以用于分享本机的互联网给生产机器。只是说 lrzsz 只能传输文件,Termtunnel 除了传输文件,还可以做端口转发。

目前使用起来还可以。推荐有需要的朋友尝试一下看看。

介于原型玩具和正式发布之间的开发状态,有 bug 正常,轻拍。如果有用的话求个 star ,多谢。

https://github.com/beordle/termtunnel

14832 次点击
所在节点    分享创造
52 条回复
beordle
2022-05-06 20:47:22 +08:00
@abbottcn 用 termtunnel 试试吧,这可能也是一种比较好的应用场景,我看下怎么持续优化“外行”体验。毕竟优势在于中间如果很多跳的话,是可以屏蔽复杂度的。就像这个需求不管你中间网络是什么样的,你就保持正常的操作,最终你只要能在最后的主机中的 termtunnel 控制台中敲入 remote 127.0.0.1 8000 127.0.0.1 0 就可以了。
woncode
2022-05-07 02:49:06 +08:00
好作品,start 等正式版
saucerman8
2022-05-07 12:54:46 +08:00
感觉这个软件的思路可以无视所有的堡垒机,跳板机,对安全限制做到了本质打击呀,好想法
beordle
2022-05-07 14:32:50 +08:00
思路不难想,xx over xx 的东西其实一直都有,但如果真的要通用实际上也不可能。部分公司是瘦客户端,和远程桌面,这种情况就很难有好办法。还有 web js 客户端,这种情况也需要另外实现一个 webdriver 。
bojue
2022-05-07 22:19:52 +08:00
虽然用不到,但是大为震惊,已经 star
hankai17
2022-05-07 23:12:51 +08:00
提几个底层的问题
作者底层用的是 workflow 请问用的是 ET 模式吗? 是否支持多线程?
问一下 tunnel 设计 tunnel 是如何处理关闭的?
quzard
2022-05-07 23:16:58 +08:00
@beordle 能支持 http 代理吗,看现在只有 socks
beordle
2022-05-07 23:52:30 +08:00
@hankai17 workflow 是什么呢,不太了解这个。

这个应用没有你想象的底层。使用了 libuv ,并非自写的事件循环,它是支持多线程的。一开始我自己测试的 demo 用的是自己写的 LTepoll ,我自己基本没有用过 et 。

如果要支持 tmux 这种会在中间丢包的节点,需要实现流量控制和重传,因此引入了 lwip ,将 7 层抽象成 4 层是 lwip 自带的功能。tunnel 关闭我不太清楚你指的是什么,额我就说下我认为的吧。tunnel 依赖两端主动关闭,各关各的,支持半开 shutdown 。

@quzard 也支持简单的端口转发,sock5 很多时候是满足不了需求吗?
quzard
2022-05-08 00:06:33 +08:00
@beordle 有些不支持 socks5 比如 wget
LonnyWong
2022-05-08 00:16:05 +08:00
@beordle

很强大,已 star 。

你说的 tltzsz 是指 trzsz ? https://github.com/trzsz/trzsz

Termtunnel 进程拉起 ssh 子进程,就可以控制 ssh 进程的输入和输出,通过这个输入和输出就可以和远程服务器上的 Termtunnel 进程通讯,从而实现文件传输和隧道转发。不知我有没有理解错?

https://github.com/trzsz/trzsz 是我写的,区别是我没有用一个本地的 trzsz 进程来拉起 ssh 子进程,而是利用 iTerm2 的 coprocess 功能,当服务器上的 trzsz 输出一个特定的字符串,iTerm2 就会拉起本地的 trzsz 进程,本地 trzsz 进程和远程 trzsz 进程是通过 iTerm2 转发输入和输出来实现通讯的。本质上和 Termtunnel 是差不多的。

trzsz 要求终端支持才能使用,我用 js 写了个组件 https://github.com/trzsz/trzsz.js ,让基于 electron 开发的终端 ( electerm 和 tabby )也同样支持了 trzsz 。trzsz.js 还支持在浏览器中使用,webshell 可很方便地集成 trzsz ,实现上传和下载文件。

trzsz 对 tmux 的支持是挺好的,并且速度挺快的,进度条功能也不错。iTerm2 支持与 tmux -CC 无缝集成,trzsz 也支持这种模式。

当 tmux 运行在本地,或者运行在中间的跳板机时,trzsz 目前还不能很好地支持。原因是远程服务器输出大量数据时,本地或中间的 tmux 会吃掉,tmux 只输出最后一屏的内容,导致文件传输不完整。楼主没有遇到这个问题,是因为传输速率慢,没有触发 tmux 吃掉的情况?

可以多多交流,一起为开源做点贡献。
LonnyWong
2022-05-08 00:32:03 +08:00
@beordle 刚回复完,然后看到 lwIP ,原来可以通过流控和重传来解决 tmux 丢包的问题。太强了!
beordle
2022-05-08 00:55:09 +08:00
@LonnyWong 哈哈哈,实际上我基于 item2 实现过一个简单的版本,但是感觉不是很满意,主要是因为 item2 只能在 mac 上用,我也没有精力实现多个。我想实现一个从任何地方都能用的版本。主要是实现 frame 一层,不过这一层实际上如果被偶尔翻转(不是 ssh 这种 tcp 的,比如 rlogin 到喘口)就不靠谱了,这个其实好解决,我正好用 lwip 的 checksum 解决。另外还有一就是被高级重担吞的情况,因为 tmux 等实现了一个完整的终端模拟器,知道哪些地方屏幕刷新了多次没用就扔了,所以为了过 tmux (其实主要是为了对付一众基于 tmux 或者类似软件跳板机),我实际上实现了两层,有一个解析终端转移码的状态机,只提取绿色字体和绿色背景的内容。这样的话就知道有价值的信息,避免 tmux 本身的 bar 输出干扰。然后一定要实现的是慢启动,因为实际上我们不知道中间节点到底存不存在 tmux (有可能不存在丢包),因为要用最小流量试探,慢慢试探到可行的流量大小来。如果直接无脑写很多数据,到达对端的概率可能不足 0.1%。lwip 是支持慢启动的。实际上如果只用 lwip ,应该也行。不过我的状态机也不太可能是负优化就是了。


如果你的 tmux 可以被替换,事实上可以使用这个代码解决 tmux 会扔内容的问题。不过我的场景不能如此假设,就是了。

```index c9c61086..b3333020 100644
--- a/screen-write.c
+++ b/screen-write.c
@@ -1645,7 +1645,7 @@ screen_write_collect_add(struct screen_write_ctx *ctx,
* a plain character is encountered.
*/

- collect = 1;
+ collect = 0;
if (gc->data.width != 1 || gc->data.size != 1 || *gc->data.data >= 0x7f)
collect = 0;
else if (gc->attr & GRID_ATTR_CHARSET)
@@ -1819,7 +1819,7 @@ screen_write_cell(struct screen_write_ctx *ctx, const struct grid_cell *gc)
}

/* Write to the screen. */
- if (!skip) {
+ if (1 || !skip) {
if (selected) {
screen_select_cell(s, &tmp_gc, gc);
ttyctx.cell = &tmp_gc;
diff --git a/tty.c b/tty.c
index bcbccca6..10bd56da 100644
--- a/tty.c
+++ b/tty.c
@@ -196,6 +196,7 @@ tty_timer_callback(__unused int fd, __unused short events, void *data)
static int
tty_block_maybe(struct tty *tty)
{
+ return 0;
struct client *c = tty->client;
size_t size = EVBUFFER_LENGTH(tty->out);
struct timeval tv = { .tv_usec = TTY_BLOCK_INTERVAL };

```
ericls
2022-05-08 07:21:15 +08:00
思路有意思 implementation 还没看 但是提供的 API 很 intuitive 👍
LonnyWong
2022-05-08 07:24:51 +08:00
@beordle 太强了,建议你为 tmux 提个 PR 。加个启动参数,或.tmux.conf 配置项,默认不启用,对于有需要的自行启用就好。
beordle
2022-05-08 19:50:39 +08:00
@quzard 1.5.1 增加了 http 协议支持,和 socks5 同端口。
quzard
2022-05-08 21:39:14 +08:00
@beordle 高效率👍
lamCJ
2022-05-09 19:17:36 +08:00
如果内网网络做了 IP/域名白名单,能 bypass 吗
beordle
2022-05-09 19:27:05 +08:00
不能,只能以某个主机(对端)的身份去发起请求。不可能超出这个范畴。当然你也可以让他们一群机器都通过你的主机连到互联网…配合..frp..?
buubiu
2022-05-09 20:03:02 +08:00
star 了
diaosi
2022-05-10 06:03:27 +08:00
@LonnyWong 看到这个正好问一句,有什么好用的 webshell 吗

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

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

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

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

© 2021 V2EX