Skip to content

Commit 8a68617

Browse files
ustcweizhouDaanHoogland
authored andcommitted
bugfix #9 vpc vr: Add PREROUTING rule for vm with static nat to multiple private gateways
1 parent 69c0f71 commit 8a68617

File tree

2 files changed

+24
-5
lines changed

2 files changed

+24
-5
lines changed

systemvm/debian/opt/cloud/bin/configure.py

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -817,6 +817,13 @@ def getGatewayByIp(self, ipa):
817817
return interface.get_gateway()
818818
return None
819819

820+
def getPrivateGatewayNetworks(self):
821+
interfaces = []
822+
for interface in self.config.address().get_interfaces():
823+
if interface.is_private_gateway():
824+
interfaces.append(interface)
825+
return interfaces
826+
820827
def portsToString(self, ports, delimiter):
821828
ports_parts = ports.split(":", 2)
822829
if ports_parts[0] == ports_parts[1]:
@@ -948,12 +955,21 @@ def processStaticNatRule(self, rule):
948955
if device is None:
949956
raise Exception("Ip address %s has no device in the ips databag" % rule["public_ip"])
950957

958+
chain_name = "PREROUTING-%s-def" % device
951959
self.fw.append(["mangle", "front",
952-
"-A PREROUTING -s %s/32 -m state --state NEW -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff" %
953-
rule["internal_ip"]])
954-
self.fw.append(["mangle", "front",
955-
"-A PREROUTING -s %s/32 -m state --state NEW -j MARK --set-xmark %s/0xffffffff" %
956-
(rule["internal_ip"], hex(100 + int(device[len("eth"):])))])
960+
"-A PREROUTING -s %s/32 -m state --state NEW -j %s" %
961+
(rule["internal_ip"], chain_name)])
962+
self.fw.append(["mangle", "",
963+
"-A %s -j MARK --set-xmark %s/0xffffffff" %
964+
(chain_name, hex(100 + int(device[len("eth"):])))])
965+
self.fw.append(["mangle", "",
966+
"-A %s -j CONNMARK --save-mark --nfmask 0xffffffff --ctmask 0xffffffff" %
967+
chain_name])
968+
private_gateways = self.getPrivateGatewayNetworks()
969+
for private_gw in private_gateways:
970+
self.fw.append(["mangle", "front", "-A %s -d %s -j RETURN" %
971+
(chain_name, private_gw.get_network())])
972+
957973
self.fw.append(["nat", "front",
958974
"-A PREROUTING -d %s/32 -j DNAT --to-destination %s" % (rule["public_ip"], rule["internal_ip"])])
959975
self.fw.append(["nat", "front",

systemvm/debian/opt/cloud/bin/cs/CsAddress.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -488,6 +488,9 @@ def fw_vpcrouter(self):
488488
self.fw.append(["mangle", "",
489489
"-A PREROUTING -m state --state NEW -i %s -s %s ! -d %s/32 -j ACL_OUTBOUND_%s" %
490490
(self.dev, self.address['network'], self.address['gateway'], self.dev)])
491+
self.fw.append(["mangle", "front",
492+
"-A PREROUTING -s %s -d %s -m state --state NEW -j MARK --set-xmark %s/0xffffffff" %
493+
(self.cl.get_vpccidr(), self.address['network'], hex(100 + int(self.dev[3:])))])
491494
if self.address["source_nat"]:
492495
self.fw.append(["nat", "front",
493496
"-A POSTROUTING -o %s -j SNAT --to-source %s" %

0 commit comments

Comments
 (0)