Repository navigation
Conversation
|
Hi @shafiev, thanks for this - SSH over QUIC is a genuinely useful idea, and the connection-migration angle (roaming between Wi-Fi networks, NAT traversal to your ISP-NATed devices) is a real use case. I reviewed the PR carefully, and I'd like to land the feature, but I think a smaller approach fits RustConn better. Let me explain the reasoning rather than just asking for changes. The packaging problem is the deciding factor. quicssh is a separate Go binary with its own release cycle, so RustConn can't bundle it - the same way it never bundles ssh, xfreerdp3, kubectl or mosh. That by itself is fine (those tools are detected at runtime). The harder issue is the sandboxed builds:
RustConn already supports this today, with no new protocol. SshConfig has a free-text proxy_command field (used for Tor .onion hosts via ncat ... %h %p). An SSH connection with ProxyCommand=quicssh client --addr %h:%p already:
A "QUIC (quicssh)" preset on the ProxyCommand row in the editor that fills in quicssh client --addr %h:%p for the user.
Would you be up for reworking it toward the preset approach? Happy to point at the exact spots (proxy_command handling in protocol.rs, the detection pattern in detection.rs, the auto-fill allow-list). If you'd rather I take it from here and credit you, I'm glad to do that too. |
|
ok will try to do as you said. |
Rework PR totoshko88#396 toward the preset approach: a QUIC button on the editor's ProxyCommand row fills QUIC_SSH_PROXY_COMMAND (quicssh client --addr %h:%p) instead of introducing a ProtocolType::QuicSsh variant, so the connection stays a plain SSH connection — jump hosts, exports, vault keys, connection testing and reconnect apply unchanged, and no new host-to-shell path exists for imported connections (CVE-2023-51385 shape on OpenSSH < 9.6). The password auto-fill relay allow-list recognizes the quicssh command, and detect_quicssh() next to detect_mosh() reports install state plus the Flatpak/Snap sandbox reachability note in the row tooltip.
Rework PR #396 toward the preset approach: a QUIC button on the editor's ProxyCommand row fills QUIC_SSH_PROXY_COMMAND (quicssh client --addr %h:%p) instead of introducing a ProtocolType::QuicSsh variant, so the connection stays a plain SSH connection — jump hosts, exports, vault keys, connection testing and reconnect apply unchanged, and no new host-to-shell path exists for imported connections (CVE-2023-51385 shape on OpenSSH < 9.6). The password auto-fill relay allow-list recognizes the quicssh command, and detect_quicssh() next to detect_mosh() reports install state plus the Flatpak/Snap sandbox reachability note in the row tooltip. --- Integration onto base 0.24.2 (a0eedb1), committer = agent; author n.shafiev <shafiev@gmail.com> preserved. Cherry-picked 987b5c7: the four code files applied clean; CHANGELOG.md and po/rustconn.pot were the only conflicts. CHANGELOG folded into the single base ## [Unreleased] ### Added (duplicate header removed); po/rustconn.pot regenerated with `bash po/update-pot.sh` (not hand-merged), ssh.rs already in POTFILES.in. .po catalogues untouched; no version bump. Verification: `scripts/verify.sh --tests` from the worktree root, detached, exit 0 (target/verify-gate.rc=0; log target/verify.log, "All gates passed"). Clippy re-checked for real — the script cleaned workspace crates first (log "cleaning workspace crates so clippy re-checks for real") and the clippy phase shows Checking rustconn-core / Compiling rustconn; no "Finished … in 0.2s" cache hit. Gates OK: typos, check-potfiles, check-i18n-escapes, check-po-complete, crate boundaries, fmt, machete, clippy --all-targets, clippy -p rustconn-cli --features full, rustdoc -D warnings, workspace tests. Key test ssh_tunnel::tests::test_proxy_command_relay_does_not_prompt (quicssh allow-list) passed; rustconn-core suite 1484 passed / 0 failed. GUI appearance needs a real desktop portal and was not verifiable from this terminal. Evidence: .agents/tasks/pr-396-accept/verification.md.
|
Thank you for this contribution, @shafiev! 🙏 Accepted in the preset approach from your rework — the QUIC button on the ProxyCommand row ( Shipped in release v0.24.2. Your authorship is preserved in commit I'm closing this PR manually because the change landed on One small technical note so the contribution shows up under contributors: please make sure the commit email ( Thanks again! 🚀 |
SSH over QUIC via moul/quicssh: the tunnel rides OpenSSH's ProxyCommand (quicssh client --addr %h:%p), so sessions reuse the whole SSH spawn path over a spawn-time view of the stored connection. Default port 4242 is the remote quicssh server (UDP); the TCP pre-connect check, the connection tester and reconnect handle it accordingly. Wizard card, editor tab, templates, CSV import, icons and full rustconn-cli support included; export degrades to plain SSH (asbru) or is refused with the QUIC SSH label (MobaXterm, Remmina, KDBX).
What this changes
Adding the support of ssh over QUIC
Why
Because SSH is vulnerable in TCP connection environments, and most SSH packets are actually small, so it is only necessary to maintain the SSH connection to use it in any network environment. QUIC is a good choice because it has good weak network optimization and an important feature called connection migration. This means that I can switch Wi-Fi networks freely when remote, ensuring a stable SSH connection. also i am using it for p2p udp punch hole for NAT traverstal to connect my ISP NATed devices
How it was tested
Also at local
Checklist
cargo fmt --allcleancargo clippy --all-targetsreports 0 warnings, from a run that actually re-checked (a cache hit printsFinished ... in 0.2sand reports nothing)gtk4/adw/vte4inrustconn-coreorrustconn-cli, nounsafeoutside arustconn-*-syscrateSecretString, intermediates areZeroizing, nothing secret reaches a log, an error message, or a command argumenti18n()/i18n_f(), source file listed inpo/POTFILES.in,bash po/update-pot.shrundbg!,todo!,println!, oreprintln!left behind (rustconn-cliexcepted — printing is its interface)CHANGELOG.mdupdated under## [Unreleased]if the change is user-facingtype(scope): description