V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
LonnyWong
V2EX  ›  推广

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

  •  2
     
  •   LonnyWong · 136 天前 · 3313 次点击
    这是一个创建于 136 天前的主题,其中的信息可能已经有所发展或是发生改变。

    开源地址

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

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

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

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

    这样,到 A 是用 UDP ,再到 B 是用 TCP 。
    yushi17
        14
    yushi17  
       136 天前
    太强了!这个网络中断之后能自动重连吗?
    LonnyWong
        15
    LonnyWong  
    OP
       136 天前
    @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
       136 天前
    #15 --tssh-path 写错了,应该是 --tsshd-path
    yushi17
        17
    yushi17  
       136 天前
    @LonnyWong 等正式版 tssh release 吧,我木有 go
    GoodRui
        18
    GoodRui  
       136 天前   ❤️ 1
    一直在用大佬的 trzsz-ssh ,很好用,期待项目进化!支持~
    swananan
        19
    swananan  
       136 天前   ❤️ 1
    这个挺好的。
    正好我半个月前,需要跨国访问家里内网,因为延迟比较大,我就自己写了一个 kcp or quic 的 4 层代理( pure c )。
    因为之前自娱自乐,给 kcp 和 quic ( ngtcp2 )包了一个框架,所以开发成本并不算高。
    swananan
        20
    swananan  
       136 天前
    如果早点看到这个的话,可能就不用自己浪费一晚上写个 proxy 了
    huaxianyan
        21
    huaxianyan  
       136 天前   ❤️ 1
    用了 tssh 很久了,一直都习惯维护 sshconfig 这种方式来上服务器,tssh 不装服务端也可以无缝兼容(当然不需要额外功能的情况下)
    chinni
        22
    chinni  
       135 天前
    问一下 滚动缓存 问题 mosh 一直支持不太好 这个怎么样?
    LonnyWong
        23
    LonnyWong  
    OP
       135 天前
    @chinni #22 应该是没有滚动问题的,你可以试一下。
    JohnSmith
        24
    JohnSmith  
       135 天前
    可以作为 vscode ssh remote 来用吗
    LonnyWong
        25
    LonnyWong  
    OP
       135 天前
    @JohnSmith #24 vscode 的 ssh remote 是它自己实现的,它是调用 ssh 创建一个隧道,然后就自己在这个隧道中玩。可以让 vscode 使用 tssh --udp 来创建隧道,这个隧道本身就是走 UDP 协议的,vscode 会在这个隧道上再创建一个一个的终端的。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   4669 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 33ms · UTC 09:59 · PVG 17:59 · LAX 01:59 · JFK 04:59
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.