Skip to content

Commit bc506f4

Browse files
committed
rewrite source only for non-default nics
1 parent 2a88f86 commit bc506f4

6 files changed

Lines changed: 46 additions & 7 deletions

File tree

api/src/main/java/com/cloud/agent/api/to/StaticNatRuleTO.java

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828

2929
public class StaticNatRuleTO extends FirewallRuleTO {
3030
String dstIp;
31+
boolean destinationIpOnDefaultNic = true;
3132

3233
protected StaticNatRuleTO() {
3334
}
@@ -79,4 +80,12 @@ public String getDstIp() {
7980
return dstIp;
8081
}
8182

83+
public boolean isDestinationIpOnDefaultNic() {
84+
return destinationIpOnDefaultNic;
85+
}
86+
87+
public void setDestinationIpOnDefaultNic(boolean destinationIpOnDefaultNic) {
88+
this.destinationIpOnDefaultNic = destinationIpOnDefaultNic;
89+
}
90+
8291
}

core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetStaticNatRulesConfigItem.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,8 @@ public List<ConfigItem> generateConfig(final NetworkElementCommand cmd) {
3939

4040
final LinkedList<StaticNatRule> rules = new LinkedList<>();
4141
for (final StaticNatRuleTO rule : command.getRules()) {
42-
final StaticNatRule staticNatRule = new StaticNatRule(rule.revoked(), rule.getProtocol(), rule.getSrcIp(), rule.getStringSrcPortRange(), rule.getDstIp());
42+
final StaticNatRule staticNatRule = new StaticNatRule(rule.revoked(), rule.getProtocol(), rule.getSrcIp(),
43+
rule.getStringSrcPortRange(), rule.getDstIp(), rule.isDestinationIpOnDefaultNic());
4344
rules.add(staticNatRule);
4445
}
4546
final StaticNatRules staticNatRules = new StaticNatRules(rules);

core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/StaticNatRule.java

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,18 +25,25 @@ public class StaticNatRule {
2525
private String sourceIpAddress;
2626
private String sourcePortRange;
2727
private String destinationIpAddress;
28+
private boolean destinationIpOnDefaultNic = true;
2829

2930
public StaticNatRule() {
3031
// Empty constructor for (de)serialization
3132
}
3233

3334
public StaticNatRule(boolean revoke, String protocol, String sourceIpAddress, String sourcePortRange, String destinationIpAddress) {
35+
this(revoke, protocol, sourceIpAddress, sourcePortRange, destinationIpAddress, true);
36+
}
37+
38+
public StaticNatRule(boolean revoke, String protocol, String sourceIpAddress, String sourcePortRange,
39+
String destinationIpAddress, boolean destinationIpOnDefaultNic) {
3440
super();
3541
this.revoke = revoke;
3642
this.protocol = protocol;
3743
this.sourceIpAddress = sourceIpAddress;
3844
this.sourcePortRange = sourcePortRange;
3945
this.destinationIpAddress = destinationIpAddress;
46+
this.destinationIpOnDefaultNic = destinationIpOnDefaultNic;
4047
}
4148

4249
public boolean isRevoke() {
@@ -79,4 +86,12 @@ public void setDestinationIpAddress(String destinationIpAddress) {
7986
this.destinationIpAddress = destinationIpAddress;
8087
}
8188

89+
public boolean isDestinationIpOnDefaultNic() {
90+
return destinationIpOnDefaultNic;
91+
}
92+
93+
public void setDestinationIpOnDefaultNic(boolean destinationIpOnDefaultNic) {
94+
this.destinationIpOnDefaultNic = destinationIpOnDefaultNic;
95+
}
96+
8297
}

server/src/main/java/com/cloud/network/router/CommandSetupHelper.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -446,6 +446,7 @@ public void createApplyStaticNatRulesCommands(final List<? extends StaticNatRule
446446
for (final StaticNatRule rule : rules) {
447447
final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
448448
final StaticNatRuleTO ruleTO = new StaticNatRuleTO(rule, null, sourceIp.getAddress().addr(), rule.getDestIpAddress());
449+
ruleTO.setDestinationIpOnDefaultNic(isDestinationIpOnDefaultNic(guestNetworkId, rule.getDestIpAddress()));
449450
rulesTO.add(ruleTO);
450451
}
451452
}
@@ -459,6 +460,15 @@ public void createApplyStaticNatRulesCommands(final List<? extends StaticNatRule
459460
cmds.addCommand(cmd);
460461
}
461462

463+
private boolean isDestinationIpOnDefaultNic(final long networkId, final String destinationIp) {
464+
final NicVO destinationNic = _nicDao.findByIp4AddressAndNetworkId(destinationIp, networkId);
465+
if (destinationNic == null) {
466+
logger.debug("Unable to find destination NIC for ip [{}] in network [{}], assuming default NIC.", destinationIp, networkId);
467+
return true;
468+
}
469+
return destinationNic.isDefaultNic();
470+
}
471+
462472
public void createApplyFirewallRulesCommands(final List<? extends FirewallRule> rules, final VirtualRouter router, final Commands cmds, final long guestNetworkId) {
463473
final List<FirewallRuleTO> rulesTO = new ArrayList<>();
464474
String systemRule = null;
@@ -697,6 +707,7 @@ public void createApplyStaticNatCommands(final List<? extends StaticNat> rules,
697707
final IpAddress sourceIp = _networkModel.getIp(rule.getSourceIpAddressId());
698708
final StaticNatRuleTO ruleTO = new StaticNatRuleTO(0, sourceIp.getAddress().addr(), null, null, rule.getDestIpAddress(), null, null, null, rule.isForRevoke(),
699709
false);
710+
ruleTO.setDestinationIpOnDefaultNic(isDestinationIpOnDefaultNic(guestNetworkId, rule.getDestIpAddress()));
700711
rulesTO.add(ruleTO);
701712
}
702713
}

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

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1567,12 +1567,13 @@ def processStaticNatRule(self, rule):
15671567
self.fw.append(["nat", "front", "-A POSTROUTING -s %s -d %s -j SNAT -o %s --to-source %s" %
15681568
(self.getNetworkByIp(rule['internal_ip']), rule["internal_ip"], self.getDeviceByIp(rule["internal_ip"]), self.getGuestIpByIp(rule["internal_ip"]))])
15691569

1570-
internal_device = self.getDeviceByIp(rule["internal_ip"])
1571-
internal_vr_ip = self.getGuestIpByIp(rule["internal_ip"])
1572-
if internal_device and internal_vr_ip and internal_device != device:
1573-
self.fw.append(["nat", "front",
1574-
"-A POSTROUTING -o %s -d %s/32 -j SNAT --to-source %s" %
1575-
(internal_device, rule["internal_ip"], internal_vr_ip)])
1570+
destination_ip_on_default_nic = rule.get("destination_ip_on_default_nic", True)
1571+
if not destination_ip_on_default_nic:
1572+
internal_device = self.getDeviceByIp(rule["internal_ip"])
1573+
internal_vr_ip = self.getGuestIpByIp(rule["internal_ip"])
1574+
if internal_device and internal_vr_ip and internal_device != device:
1575+
self.fw.append(["nat", "front",
1576+
"-A POSTROUTING -o %s -d %s/32 -j SNAT --to-source %s" % (internal_device, rule["internal_ip"], internal_vr_ip)])
15761577

15771578

15781579
class IpTablesExecutor:

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,8 @@ def merge(dbag, rules):
2727
newrule = dict()
2828
newrule["public_ip"] = source_ip
2929
newrule["internal_ip"] = destination_ip
30+
if "destination_ip_on_default_nic" in rule:
31+
newrule["destination_ip_on_default_nic"] = rule["destination_ip_on_default_nic"]
3032

3133
if rules["type"] == "staticnatrules":
3234
newrule["type"] = "staticnat"

0 commit comments

Comments
 (0)