From 894995cef179232578d45eb9b6e1de6e3e8dc245 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Fri, 26 Jan 2024 14:04:24 +0100 Subject: [PATCH 1/2] VR: fix issue between VPC VMs and other Public IPs in the same subnet as additional Public IPs --- .../network/router/VirtualNetworkApplianceManagerImpl.java | 7 +++++++ systemvm/debian/opt/cloud/bin/cs/CsAddress.py | 7 +++++-- systemvm/debian/opt/cloud/bin/cs/CsDatabag.py | 6 ++++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index a0e8a2a2f0d5..514d409fc0dd 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -72,6 +72,7 @@ import org.apache.cloudstack.utils.CloudStackVersion; import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.cloudstack.utils.usage.UsageUtils; +import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -2146,6 +2147,12 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile " on the virtual router.", RouterLogrotateFrequency.key(), routerLogrotateFrequency, dc.getUuid())); buf.append(String.format(" logrotatefrequency=%s", routerLogrotateFrequency)); + if (router.getVpcId() != null) { + List vpcIps = _ipAddressDao.listByAssociatedVpc(router.getVpcId(), true); + if (CollectionUtils.isNotEmpty(vpcIps)) { + buf.append(String.format(" source_nat_ip=%s", vpcIps.get(0).getAddress().toString())); + } + } if (s_logger.isDebugEnabled()) { s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); } diff --git a/systemvm/debian/opt/cloud/bin/cs/CsAddress.py b/systemvm/debian/opt/cloud/bin/cs/CsAddress.py index a8634a75ae36..3cb782daf7ab 100755 --- a/systemvm/debian/opt/cloud/bin/cs/CsAddress.py +++ b/systemvm/debian/opt/cloud/bin/cs/CsAddress.py @@ -453,8 +453,8 @@ def fw_router(self): ["", "", "-A NETWORK_STATS_%s -o %s ! -i eth0 -p tcp" % (self.dev, self.dev)]) self.fw.append( ["", "", "-A NETWORK_STATS_%s -i %s ! -o eth0 -p tcp" % (self.dev, self.dev)]) - self.fw.append(["nat", "", - "-A POSTROUTING -o %s -j SNAT --to-source %s" % (self.dev, self.cl.get_eth2_ip())]) + self.fw.append( + ["nat", "", "-A POSTROUTING -o %s -j SNAT --to-source %s" % (self.dev, self.cl.get_eth2_ip())]) self.fw.append(["mangle", "", "-A PREROUTING -i %s -m state --state NEW " % self.dev + "-j CONNMARK --set-xmark %s/0xffffffff" % self.dnum]) @@ -695,6 +695,9 @@ def post_config_change(self, method): ["filter", 3, "-A FORWARD -s %s ! -d %s -j ACCEPT" % (vpccidr, vpccidr)]) self.fw.append( ["nat", "", "-A POSTROUTING -j SNAT -o %s --to-source %s" % (self.dev, self.address['public_ip'])]) + elif cmdline.get_source_nat_ip() and not self.is_private_gateway(): + self.fw.append( + ["nat", "", "-A POSTROUTING -j SNAT -o %s --to-source %s" % (self.dev, cmdline.get_source_nat_ip())]) def list(self): self.iplist = {} diff --git a/systemvm/debian/opt/cloud/bin/cs/CsDatabag.py b/systemvm/debian/opt/cloud/bin/cs/CsDatabag.py index c000611af48a..f2de92304ea0 100755 --- a/systemvm/debian/opt/cloud/bin/cs/CsDatabag.py +++ b/systemvm/debian/opt/cloud/bin/cs/CsDatabag.py @@ -181,6 +181,12 @@ def get_dev_ip6prelen(self, devname): return False return "%s/%s" % (self.idata()[ipkey], self.idata()[prelenkey]) + def get_source_nat_ip(self): + if "source_nat_ip" in self.idata(): + return self.idata()['source_nat_ip'] + return False + + class CsGuestNetwork(CsDataBag): """ Get guestnetwork config parameters """ From 9236d16d8aead4bfc5b33707d6f668d63f158b74 Mon Sep 17 00:00:00 2001 From: Wei Zhou Date: Mon, 5 Feb 2024 12:29:57 +0100 Subject: [PATCH 2/2] Update PR8599: move to VpcVirtualNetworkApplianceManagerImpl --- .../VirtualNetworkApplianceManagerImpl.java | 7 ------- ...VpcVirtualNetworkApplianceManagerImpl.java | 19 ++++++++++++++++++- 2 files changed, 18 insertions(+), 8 deletions(-) diff --git a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java index 514d409fc0dd..a0e8a2a2f0d5 100644 --- a/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VirtualNetworkApplianceManagerImpl.java @@ -72,7 +72,6 @@ import org.apache.cloudstack.utils.CloudStackVersion; import org.apache.cloudstack.utils.identity.ManagementServerNode; import org.apache.cloudstack.utils.usage.UsageUtils; -import org.apache.commons.collections.CollectionUtils; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.Logger; @@ -2147,12 +2146,6 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile " on the virtual router.", RouterLogrotateFrequency.key(), routerLogrotateFrequency, dc.getUuid())); buf.append(String.format(" logrotatefrequency=%s", routerLogrotateFrequency)); - if (router.getVpcId() != null) { - List vpcIps = _ipAddressDao.listByAssociatedVpc(router.getVpcId(), true); - if (CollectionUtils.isNotEmpty(vpcIps)) { - buf.append(String.format(" source_nat_ip=%s", vpcIps.get(0).getAddress().toString())); - } - } if (s_logger.isDebugEnabled()) { s_logger.debug("Boot Args for " + profile + ": " + buf.toString()); } diff --git a/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java b/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java index 18801eb01fdf..aebeb5c93982 100644 --- a/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java +++ b/server/src/main/java/com/cloud/network/router/VpcVirtualNetworkApplianceManagerImpl.java @@ -27,6 +27,7 @@ import javax.inject.Inject; import javax.naming.ConfigurationException; +import org.apache.commons.collections.CollectionUtils; import org.apache.log4j.Logger; import org.springframework.stereotype.Component; @@ -294,7 +295,23 @@ public boolean finalizeVirtualMachineProfile(final VirtualMachineProfile profile } } - return super.finalizeVirtualMachineProfile(profile, dest, context); + super.finalizeVirtualMachineProfile(profile, dest, context); + appendSourceNatIpToBootArgs(profile); + return true; + } + + private void appendSourceNatIpToBootArgs(final VirtualMachineProfile profile) { + final StringBuilder buf = profile.getBootArgsBuilder(); + final DomainRouterVO router = _routerDao.findById(profile.getVirtualMachine().getId()); + if (router != null && router.getVpcId() != null) { + List vpcIps = _ipAddressDao.listByAssociatedVpc(router.getVpcId(), true); + if (CollectionUtils.isNotEmpty(vpcIps)) { + buf.append(String.format(" source_nat_ip=%s", vpcIps.get(0).getAddress().toString())); + if (s_logger.isDebugEnabled()) { + s_logger.debug("The final Boot Args for " + profile + ": " + buf); + } + } + } } @Override