From b5fa671d8a63b3a104916476970b329d47c33975 Mon Sep 17 00:00:00 2001 From: Mahesh Kommareddi Date: Mon, 1 Sep 2025 11:14:19 -0400 Subject: [PATCH] Port forwarding --- QemuVmManager.Core/QemuCommandBuilder.cs | 43 ++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 3 deletions(-) diff --git a/QemuVmManager.Core/QemuCommandBuilder.cs b/QemuVmManager.Core/QemuCommandBuilder.cs index c68c6d7..f08ef98 100644 --- a/QemuVmManager.Core/QemuCommandBuilder.cs +++ b/QemuVmManager.Core/QemuCommandBuilder.cs @@ -93,8 +93,23 @@ public class QemuCommandBuilder Console.WriteLine($"Info: Bridge networking detected - port forwarding will be configured via iptables"); Console.WriteLine($"Info: Custom port forwards: {customForwards}"); - // Automatically configure iptables port forwarding - ConfigureIptablesPortForwarding(); + // For bridge networking, we need to wait for the VM to get an IP + // Port forwarding will be configured after the VM starts and gets an IP + Console.WriteLine($""); + Console.WriteLine($"📝 Bridge Networking Port Forwarding:"); + Console.WriteLine($" Port forwarding will be configured automatically once the VM gets an IP address."); + Console.WriteLine($" The system will use iptables to forward traffic from host ports to the VM."); + Console.WriteLine($""); + Console.WriteLine($" Configured forwards:"); + foreach (var pf in GetPortForwardList()) + { + Console.WriteLine($" • Port {pf.HostPort} → VM:{pf.VmPort} ({pf.Protocol})"); + } + Console.WriteLine($""); + Console.WriteLine($" To configure port forwarding manually after VM starts:"); + Console.WriteLine($" sudo iptables -t nat -A PREROUTING -p tcp --dport 3300 -j DNAT --to-destination :80"); + Console.WriteLine($" sudo iptables -A FORWARD -p tcp --dport 80 -d -j ACCEPT"); + Console.WriteLine($" (Replace with the VM's actual IP address from the bridge)"); } private void ConfigureIptablesPortForwarding() @@ -450,7 +465,8 @@ public class QemuCommandBuilder if (!vmForwards.Any()) return string.Empty; - // Build hostfwd arguments for custom port forwards + // For bridge networking, we don't use hostfwd - we use iptables instead + // This method is only called for macOS user networking var forwardArgs = new List(); foreach (var pf in vmForwards) { @@ -466,6 +482,27 @@ public class QemuCommandBuilder } } + private List GetPortForwardList() + { + try + { + var configFile = "port-forwards.json"; + if (!File.Exists(configFile)) + return new List(); + + var json = File.ReadAllText(configFile); + var portForwards = System.Text.Json.JsonSerializer.Deserialize>(json) ?? new List(); + + // Filter port forwards for this VM + return portForwards.Where(pf => pf.VmName == _config.Name).ToList(); + } + catch (Exception ex) + { + Console.WriteLine($"Warning: Could not load port forward list: {ex.Message}"); + return new List(); + } + } + private void AddMachineConfiguration() { _arguments.Add("-machine");