[开源] 低延迟的 ssh,基于 UDP ( KCP ) 实现, 类似 mosh(比 mosh 多了端口转发) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LonnyWong
V2EX    推广

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

  •  2
     
  •   LonnyWong 2024-06-24 08:12:51 +08:00 4366 次点击
    这是一个创建于 506 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开源地址

    客户端 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 多了端口转发。

    安装方法

    • 在服务器上安装 tsshd( 暂时要用 go install 安装 ):

      go install github.com/trzsz/tsshd/cmd/tsshd@main 
    • 在客户端上安装 tssh( 这是 main 分支,预计要 v0.1.21 版本才正式支持 ):

      go install github.com/trzsz/trzsz-ssh/cmd/tssh@main 

    使用方法

    • 在使用 tssh 登录时,加 --udp 参数启用,用 --tsshd-path 指定 tsshd 在服务器上的路径。
    • 也可以在 ~/.ssh/config 中如下配置( 命令行参数即可省略 ):
      Host xxx #!! UdpMode yes #!! TsshdPath ~/go/bin/tsshd 

    界面截屏

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

    tssh

    25 条回复    2024-06-25 16:00:58 +08:00
    zeusho871
        1
    zeusho871  
       2024-06-24 08:28:04 +08:00 via Android
    有性能测试结果吗
    LonnyWong
        2
    LonnyWong  
    OP
       2024-06-24 08:41:26 +08:00
    @zeusho871 暂时没有,可以先参考 KCP 的性能,默认有点慢,加了行 no delay 就好很多了,https://github.com/trzsz/tsshd/commit/ea4d1d7d4ed8743896f2b9f16a8a131f56452f08
    cheneven
        3
    cheneven  
       2024-06-24 10:07:45 +08:00
    问下,这个服务落地场景有哪些呀,比如,受到网络环境关系,ssh 慢,所以用 tsshd 的 udp 功能?
    xuan_lengyue
        4
    xuan_lengyue  
       2024-06-24 10:12:19 +08:00
    @cheneven 海外 VPS 吧
    cheneven
        5
    cheneven  
       2024-06-24 10:14:49 +08:00
    @xuan_lengyue 了解了
    LonnyWong
        6
    LonnyWong  
    OP
       2024-06-24 10:21:25 +08:00
    @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
        7
    tool2dx  
       2024-06-24 10:27:26 +08:00
    ssh 一部分用途是传输大文件,而 udp 数据量一多,运营商就会不开心,给你断流。于是大家都再加了一层 udp2raw ,伪装成 tcp 流量。

    不伪装就需要随机端口。
    LonnyWong
        8
    LonnyWong  
    OP
       2024-06-24 10:34:45 +08:00
    @tool2dx 再结合 udp2raw 确实会更好,但好像要求 root 启动,或者要加权限 sudo setcap cap_net_raw+ep ...

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

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

    这样,到 A 是用 UDP ,再到 B 是用 TCP 。
    yushi17
        14
    yushi17  
       2024-06-24 11:50:31 +08:00
    太强了!这个网络中断之后能自动重连吗?
    LonnyWong
        15
    LonnyWong  
    OP
       2024-06-24 11:56:59 +08:00
    @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
        16
    LonnyWong  
    OP
       2024-06-24 11:58:00 +08:00
    #15 --tssh-path 写错了,应该是 --tsshd-path
    yushi17
        17
    yushi17  
       2024-06-24 12:06:45 +08:00
    @LonnyWong 等正式版 tssh release 吧,我木有 go
    GoodRui
        18
    GoodRui  
       2024-06-24 12:15:11 +08:00   1
    一直在用大佬的 trzsz-ssh ,很好用,期待项目进化!支持~
    swananan
        19
    swananan  
       2024-06-24 13:16:27 +08:00   1
    这个挺好的。
    正好我半个月前,需要跨国访问家里内网,因为延迟比较大,我就自己写了一个 kcp or quic 的 4 层代理( pre c )。
    因为之前自娱自乐,给 kcp 和 quic ( ngtcp2 )包了一个框架,所以开发成本并不算高。
    swananan
        20
    swananan  
       2024-06-24 13:16:55 +08:00
    如果早点看到这个的话,可能就不用自己浪费一晚上写个 proxy 了
    huaxianyan
        21
    huaxianyan  
       2024-06-24 13:20:06 +08:00   1
    用了 tssh 很久了,一直都习惯维护 sshconfig 这种方式来上服务器,tssh 不装服务端也可以无缝兼容(当然不需要额外功能的情况下)
    chinni
        22
    chinni  
       2024-06-24 20:32:25 +08:00
    问一下 滚动缓存 问题 mosh 一直支持不太好 这个怎么样?
    LonnyWong
        23
    LonnyWong  
    OP
       2024-06-24 21:30:12 +08:00
    @chinni #22 应该是没有滚动问题的,你可以试一下。
    JohnSmith
        24
    JohnSmith  
       2024-06-25 15:54:36 +08:00
    可以作为 vscode ssh remote 来用吗
    LonnyWong
        25
    LonnyWong  
    OP
       2024-06-25 16:00:58 +08:00
    @JohnSmith #24 vscode 的 ssh remote 是它自己实现的,它是调用 ssh 创建一个隧道,然后就自己在这个隧道中玩。可以让 vscode 使用 tssh --udp 来创建隧道,这个隧道本身就是走 UDP 协议的,vscode 会在这个隧道上再创建一个一个的终端的。
    关于     帮助文档     自助推广系统     博客     API     FAQ     Solana     5556 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 24ms UTC 06:33 PVG 14:33 LAX 22:33 JFK 01:33
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86