-
Notifications
You must be signed in to change notification settings - Fork 308
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
Bring back iptable scanning #7723
Conversation
7b09ab6
to
ab27674
Compare
The iptables scanning code was never removed from Lima; it is still there. Did you mean the code in Rancher Desktop was removed from the WSL2 code? |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Mostly comments, but I do think the blocking sleep
must be replaced by something cancellable.
portMap := make(nat.PortMap) | ||
// Add new forwards | ||
for _, p := range added { | ||
if p.TCP { |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Why only TCP? I thought we also do UDP, or am I confused?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
We totally support UDP now in RD but, this decision came from how the iptables.Entry
defined in the upstream. It doesn't seem to give the proper protocol but rather a boolean. Of course, if TCP
is set to true, we know it is 100% TCP
but when it's set to false I'm not sure if that means it would be UDP 100%.
Thanks, I corrected it now. I meant Rancher Desktop. |
I agree. To be honest, I just revived the old code with a minor modification to make it work for our current needs, but I didn't change any of the old pars, assuming that it was previously doing the right thing. However, I agree with removing the |
Previously, the guestAgent in Rancher Desktop was picking up port mappings from iptables using the GetPorts function, as seen [here](https://github.com/lima-vm/lima/blob/3e01f2597cba83914e0dcd8ff3b87a409ca8e0ae/pkg/guestagent/iptables/iptables.go#L36). However, since the iptables scanning package was removed in commit [ca0009c](ca0009c) from the guestAgent, it no longer retrieves these port mappings. An example of such a rule in iptables is as follows: ``` CNI-HOSTPORT-SETMARK tcp -- 10.42.0.0/24 anywhere tcp dpt:12345 CNI-HOSTPORT-SETMARK tcp -- localhost anywhere tcp dpt:12345 DNAT tcp -- anywhere anywhere tcp dpt:12345 to:10.42.0.100:80 CNI-DN-6ef6bede9244615191a81 tcp -- anywhere anywhere /* dnat name: "cbr0" id: "0344293f74a8790f54a73bdd10f97bfaf98b3fb80b8e88c610f2da8ddf1c241a" */ multiport dports 12345 ``` The rules above are custom rules generated by the CNI plugin to manage traffic to the cbr0 network bridge, the default bridge network interface Kubernetes uses for pod-to-pod communication. These rules seem to be a part of Kubernetes’ networking setup. Given that these rules are essential for Kubernetes networking—ensuring traffic on specific hostports (e.g., port 12345) is correctly routed to a pod and handled by the CNI plugin—it seems important that they are not ignored. Signed-off-by: Nino Kodabande <[email protected]>
Signed-off-by: Nino Kodabande <[email protected]>
Signed-off-by: Nino Kodabande <[email protected]>
ab27674
to
da1ac1c
Compare
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, LGTM
Just one more stylistic tweak please!
select { | ||
case <-ticker.C: | ||
// Detect ports for forward |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'm not a big fan of having a 60-line case statement. Wouldn't it be better to have a minimal select
, and then have the rest of the logic as the body of the for
loop:
select { | |
case <-ticker.C: | |
// Detect ports for forward | |
select { | |
case <-ctx.Done(): | |
return nil | |
case <-ticker.C: | |
} | |
// Detect ports for forward |
Signed-off-by: Nino Kodabande <[email protected]>
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Thanks, LGTM
Previously, the guestAgent in Rancher Desktop was picking up port mappings from iptables using the GetPorts function from Lima, as seen here. However, since the iptables scanning package was removed from the guestAgent, it no longer retrieves these port mappings.
An example of such a rule in iptables is as follows:
These rules are generated by the CNI (Container Network Interface) plugin for pod-to-pod communication. They are part of Kubernetes' networking and ensure that traffic on specific host ports (e.g., port 12345) is correctly routed to the appropriate pod, with the CNI plugin managing the handling of that traffic.
Given their role in routing traffic correctly within Kubernetes, it is important that these rules are not overlooked by the guestAgent.
TCP Repro Steps
echo-server.yaml
from https://gist.github.com/mikeseese/cca62f2dba7a453ebe172031a9490760kubectl apply -f echo-server.yaml
curl <hostIP>:12345/param?query=demo
kubectl port-forward pods/echo-server 12345:80 -n default
and change the curl command to use the localhost IPcurl 127.0.0.1:12345/param?query=demo
Fixes: #7722