[开源] 低延迟的 ssh,基于 UDP ( KCP ) 实现, 类似 mosh(比 mosh 多了端口转发)

6 天前
 LonnyWong

开源地址

客户端 tsshhttps://github.com/trzsz/trzsz-ssh

服务端 tsshdhttps://github.com/trzsz/tsshd

基本原理

tssh 是一个 go 实现的 ssh 客户端( 已经 1.4K 的 Star 了,感谢大家的支持 ),--udp 是一个新功能。

当使用 tssh —udp 登录时,将在服务器上启动一个新的 tsshd 进程,tsshd 输出 UDP 端口和密钥( tssh 作为 ssh 客户端,可以安全地接收到 )。

然后 tssh 关闭 ssh 的 TCP 连接,再使用 UDP ( KCP ) 与 tsshd 通讯( tsshd 在这里开始承担 sshd 的角色 )。

原理和 mosh 差不多,比 mosh 多了端口转发。

安装方法

使用方法

界面截屏

tssh 可以当作 ssh 来使用,常用的功能都兼容。不带参数启动时,会列出 ~/.ssh/config 中配置的机器,可选择登录,如图:

2690 次点击
所在节点    推广
25 条回复
zeusho871
6 天前
有性能测试结果吗
LonnyWong
6 天前
@zeusho871 暂时没有,可以先参考 KCP 的性能,默认有点慢,加了行 no delay 就好很多了,https://github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08
cheneven
6 天前
问下,这个服务落地场景有哪些呀,比如,受到网络环境关系,ssh 慢,所以用 tsshd 的 udp 功能?
xuan_lengyue
6 天前
@cheneven 海外 VPS 吧
cheneven
6 天前
@xuan_lengyue 了解了
LonnyWong
6 天前
@cheneven 主要是对标 mosh: https://github.com/mobile-shell/mosh

在网络质量不是很好的场景( 例如,跨境的网络 ),TCP 的延迟可能会比较大( 例如,按下键盘比较久后,屏幕上才显示输入的字母,卡顿感比较明显 ),甚至可能 TCP 中断卡死了。

使用 UDP ( 这里用了 KCP 的实现,站在巨人的肩膀上 ),可以优化 TCP 延迟大的问题,改善 ssh 后的输入体验。

有人在 tssh 的 issue 提出 https://github.com/trzsz/trzsz-ssh/issues/117 ,而碰巧我知道怎么实现,于是就造了这个轮子,顺便支持( mosh 目前还不支持的 )端口转发。
tool2dx
6 天前
ssh 一部分用途是传输大文件,而 udp 数据量一多,运营商就会不开心,给你断流。于是大家都再加了一层 udp2raw ,伪装成 tcp 流量。

不伪装就需要随机端口。
LonnyWong
6 天前
@tool2dx 再结合 udp2raw 确实会更好,但好像要求 root 启动,或者要加权限 sudo setcap cap_net_raw+ep ...

如果有需求的人多,等有空时,再看看怎么与 udp2raw 结合在一起使用。
mightybruce
6 天前
用这个接管 sshd, 万一没启动起来,那真的要骂娘了。
大文件传输 一般用的是 rsync
LonnyWong
6 天前
@mightybruce tsshd 的本质是实现了 sshd 类似的功能,但是 tsshd 并没有替换 sshd ,他们是同时存在,互不影响的。
rrfeng
6 天前
ssh - ssh - ssh 带 proxy 的情况支持吗 #🐶
LonnyWong
6 天前
@rrfeng #11 如果 UDP 无法直通,现在还不支持哈。如果要支持,得在中间那里运行一个进程来转发,相当的复杂,但不是完全不可能。
LonnyWong
6 天前
@rrfeng #11 如果只是想第一跳是 UDP ,后面的是 TCP ,那现在是支持的,如:

tssh -oProxyCommand='tssh --udp -W x.x.x.x:22 A' B

这样,到 A 是用 UDP ,再到 B 是用 TCP 。
yushi17
6 天前
太强了!这个网络中断之后能自动重连吗?
LonnyWong
6 天前
@yushi17 #14 应该可以自动重连的,不过我没有测过,你可以帮忙测一测,然后告诉我结果。

有一个配置项 UdpAliveTimeout ,默认是 100 ( 秒 ),超时的话会 tsshd 会自动退出。看你需要在多久之内能重连,要改一下这个配置。

在命令行中,可以这样指定 tssh --udp --tssh-path '~/go/bin/tsshd' -oUdpAliveTimeout=2000 xxx ,这样就是 2000 秒内,可以自动重连。如果 -oUdpAliveTimeout=0 则无论多久都可以重连(理论上),但是 tsshd 会常驻在服务器上,不会自己退出。

也可以在 ~/.ssh/config 中配置,如:

Host xxx
#!! UdpMode yes
#!! TsshdPath ~/go/bin/tsshd
#!! UdpAliveTimeout 2000
LonnyWong
6 天前
#15 --tssh-path 写错了,应该是 --tsshd-path
yushi17
6 天前
@LonnyWong 等正式版 tssh release 吧,我木有 go
GoodRui
6 天前
一直在用大佬的 trzsz-ssh ,很好用,期待项目进化!支持~
swananan
6 天前
这个挺好的。
正好我半个月前,需要跨国访问家里内网,因为延迟比较大,我就自己写了一个 kcp or quic 的 4 层代理( pure c )。
因为之前自娱自乐,给 kcp 和 quic ( ngtcp2 )包了一个框架,所以开发成本并不算高。
swananan
6 天前
如果早点看到这个的话,可能就不用自己浪费一晚上写个 proxy 了

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

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

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

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

© 2021 V2EX