Skip to content

Fix tunneling of connection when keepalive is set #3684

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Jul 4, 2025

Conversation

balajiv113
Copy link
Member

Fixes #3601

Copy link

@Copilot Copilot AI left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull Request Overview

Fix tunneling of connection when keepalive is set by replacing the existing bicopy-based data forwarding with a TCP proxy that preserves keepalive semantics.

  • Swap out bicopy.Bicopy for tcpproxy.DialProxy to handle TCP connections
  • Update imports from lima/pkg/bicopy to containers/gvisor-tap-vsock/pkg/tcpproxy
Comments suppressed due to low confidence (1)

pkg/portfwd/client.go:36

  • This new proxy path for TCP connections lacks dedicated tests; consider adding unit or integration tests to verify tunneling behavior when keepalive is enabled.
	proxy := tcpproxy.DialProxy{DialContext: func(ctx context.Context, _, _ string) (net.Conn, error) {

@balajiv113 balajiv113 force-pushed the fix-keepalive branch 2 times, most recently from 9b11171 to 7b94043 Compare July 4, 2025 04:48
@balajiv113 balajiv113 added this to the v1.2.0 milestone Jul 4, 2025
@balajiv113
Copy link
Member Author

@AkihiroSuda & @jandubois
For now i reverted back to tcpproxy. We can improve bicopy incrementally. Hope its fine.

This works for me. with given reproduction steps

Copy link
Member

@AkihiroSuda AkihiroSuda left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Thanks, let's merge this, but we should eventually run a test for this on CI

@AkihiroSuda AkihiroSuda merged commit d877648 into lima-vm:master Jul 4, 2025
36 checks passed
@nirs
Copy link
Member

nirs commented Jul 7, 2025

@AkihiroSuda & @jandubois For now i reverted back to tcpproxy. We can improve bicopy incrementally. Hope its fine.

This works for me. with given reproduction steps

Can you explain what is the issue and how it is solved in tcpproxy? What is missing in bicopy to implement TCP half-close?

Looking at bicopy and tcpproxy, both start goroutines running io.Copy(dot, src), and both call src.CloseRead() and dst.CloseWrite() the goroutine exits. Finally both call src.Close() and dst.Close() at the end.

The only thing missing in biCopy is setting keepalive on both ends, but since we don't set KeepAlivePeriod the keepalive is not set on the net.Con.

Do we have a way to write a test reproducing this issue?

@balajiv113
Copy link
Member Author

I tried to write a test but couldn't but the steps mentioned in the issue is perfectly reproducible

tmeijn pushed a commit to tmeijn/dotfiles that referenced this pull request Jul 27, 2025
This MR contains the following updates:

| Package | Update | Change |
|---|---|---|
| [lima-vm/lima](https://github.com/lima-vm/lima) | minor | `v1.1.1` -> `v1.2.1` |

MR created with the help of [el-capitano/tools/renovate-bot](https://gitlab.com/el-capitano/tools/renovate-bot).

**Proposed changes to behavior should be submitted there as MRs.**

---

### Release Notes

<details>
<summary>lima-vm/lima (lima-vm/lima)</summary>

### [`v1.2.1`](https://github.com/lima-vm/lima/releases/tag/v1.2.1)

[Compare Source](lima-vm/lima@v1.2.0...v1.2.1)

#### Changes

- Cherry-picks from `master` to `release/1.2` ([#&#8203;3750](lima-vm/lima#3750))
  - portfwd: create separate gRPC streams for each UDP client ([#&#8203;3724](lima-vm/lima#3724), thanks to [@&#8203;stek29](https://github.com/stek29))
  - qemuimgutil: fix "Failed to get "write" lock" error ([#&#8203;3742](lima-vm/lima#3742), thanks to [@&#8203;pavelanni](https://github.com/pavelanni))
  - Embed templates edited from the user interface ([#&#8203;3745](lima-vm/lima#3745), thanks to [@&#8203;afbjorklund](https://github.com/afbjorklund))

#### Usage

```console
$ limactl create
$ limactl start
...
INFO[0029] READY. Run `lima` to open the shell.

$ lima uname
Linux
```

***

The binaries were built automatically on GitHub Actions.
The build log is available for 90 days: https://github.com/lima-vm/lima/actions/runs/16405168554

The sha256sum of the SHA256SUMS file itself is `fda636e062d8f75a689071b308a94dc902111620f7122746fc0d172959d7d26a` .

***

Release manager: [@&#8203;AkihiroSuda](https://github.com/AkihiroSuda)

### [`v1.2.0`](https://github.com/lima-vm/lima/releases/tag/v1.2.0)

[Compare Source](lima-vm/lima@v1.1.1...v1.2.0)

#### Changes

- `limactl` CLI:
  - Add `limactl network (list|create|delete)` commands ([#&#8203;3677](lima-vm/lima#3677))
  - Add `limactl clone OLDINST NEWINST` command. Not to be confused with `limactl copy`, which copies files. ([#&#8203;3673](lima-vm/lima#3673))
  - Add `limactl edit --mount-none` flag ([#&#8203;3647](lima-vm/lima#3647))
- Port forwarding:
  - Improve stability ([#&#8203;3684](lima-vm/lima#3684). [#&#8203;3708](lima-vm/lima#3708), thanks to [@&#8203;balajiv113](https://github.com/balajiv113))
  - De-deprecate `LIMA_SSH_PORT_FORWARDER` that was once deprecated in v1.1 ([#&#8203;3709](lima-vm/lima#3709))
- nerdctl:
  - Update from v2.1.2 to [v2.1.3](https://github.com/containerd/nerdctl/releases/tag/v2.1.3) ([#&#8203;3701](lima-vm/lima#3701))
- Templates:
  - `default`: update from Ubuntu 24.10 to 25.04 ([#&#8203;3643](lima-vm/lima#3643))
  - `fedora`: update from Fedora 41 to 42 ([#&#8203;3643](lima-vm/lima#3643))
  - `almalinux-10`: new template ([#&#8203;3602](lima-vm/lima#3602), thanks to [@&#8203;refi64](https://github.com/refi64))
  - `rocky-10`: new template ([#&#8203;3642](lima-vm/lima#3642))
  - `experimental/debian-testing`: new template ([#&#8203;3645](lima-vm/lima#3645))
  - `experimental/ubuntu-next`: new template ([#&#8203;3645](lima-vm/lima#3645))
- Makefile:
  - Kconfig: deprecate ([#&#8203;3706](lima-vm/lima#3706))

> \[!NOTE]
> On Intel Mac, macOS 15.5 or later is needed to boot the default Ubuntu 25.04 template.
>
> Workarounds for macOS <= 15.4 :
>
> - Option 1: Use QEMU
>
> ```
> limactl create --vm-type=qemu
> ```
>
> - Option2: Use Ubuntu 24.04 template
>
> ```
> limactl create --name=default template://ubuntu-24.04
> ```

Full changes: https://github.com/lima-vm/lima/milestone/61?closed=1

Thanks to
[@&#8203;AkinoKaede](https://github.com/AkinoKaede) [@&#8203;Horiodino](https://github.com/Horiodino) [@&#8203;afbjorklund](https://github.com/afbjorklund) [@&#8203;alexandear](https://github.com/alexandear) [@&#8203;arixmkii](https://github.com/arixmkii) [@&#8203;balajiv113](https://github.com/balajiv113) [@&#8203;fruzitent](https://github.com/fruzitent) [@&#8203;jandubois](https://github.com/jandubois) [@&#8203;kachick](https://github.com/kachick) [@&#8203;mazzz1y](https://github.com/mazzz1y) [@&#8203;nirs](https://github.com/nirs) [@&#8203;refi64](https://github.com/refi64) [@&#8203;songponssw](https://github.com/songponssw) [@&#8203;thomasjm](https://github.com/thomasjm) [@&#8203;unsuman](https://github.com/unsuman)

#### Usage

```console
$ limactl create
$ limactl start
...
INFO[0029] READY. Run `lima` to open the shell.

$ lima uname
Linux
```

***

The binaries were built automatically on GitHub Actions.
The build log is available for 90 days: https://github.com/lima-vm/lima/actions/runs/16187325385

The sha256sum of the SHA256SUMS file itself is `f4d57cdd637022ead291af680c0c88a8d07fd35fd6a779b7c6348e2c9a2ec2cc` .

***

Release manager: [@&#8203;AkihiroSuda](https://github.com/AkihiroSuda)

</details>

---

### Configuration

📅 **Schedule**: Branch creation - At any time (no schedule defined), Automerge - At any time (no schedule defined).

🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied.

♻ **Rebasing**: Whenever MR becomes conflicted, or you tick the rebase/retry checkbox.

🔕 **Ignore**: Close this MR and you won't be reminded about this update again.

---

 - [ ] <!-- rebase-check -->If you want to rebase/retry this MR, check this box

---

This MR has been generated by [Renovate Bot](https://github.com/renovatebot/renovate).
<!--renovate-debug:eyJjcmVhdGVkSW5WZXIiOiI0MC42Mi4xIiwidXBkYXRlZEluVmVyIjoiNDAuNjIuMSIsInRhcmdldEJyYW5jaCI6Im1haW4iLCJsYWJlbHMiOlsiUmVub3ZhdGUgQm90Il19-->
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

Stuck network when using multiple connections with k3s
3 participants