This is an automated email from the ASF dual-hosted git repository.
nvazquez pushed a commit to branch main
in repository https://gitbox.apache.org/repos/asf/cloudstack.git
The following commit(s) were added to refs/heads/main by this push:
new e53ed9e350 network: fix event, acl, firewall for ipv6 nw (#6314)
e53ed9e350 is described below
commit e53ed9e35053dc012185f3b8ce5b3b5937585f25
Author: Abhishek Kumar <[email protected]>
AuthorDate: Wed Apr 27 08:00:44 2022 +0530
network: fix event, acl, firewall for ipv6 nw (#6314)
* add guest ipv6 cidr for fw rule
Signed-off-by: Abhishek Kumar <[email protected]>
* fix fw, acl nft chains
Signed-off-by: Abhishek Kumar <[email protected]>
* remove unnecessary log
Signed-off-by: Abhishek Kumar <[email protected]>
* api response should return default internet protocol
Signed-off-by: Abhishek Kumar <[email protected]>
* event resource fix for ipv6 firewall rule events
Signed-off-by: Abhishek Kumar <[email protected]>
* fix radvd, restore ipv6 intf in vm type script
Signed-off-by: Abhishek Kumar <[email protected]>
* fix dadfailed with rvr
Signed-off-by: Abhishek Kumar <[email protected]>
---
.../user/ipv6/CreateIpv6FirewallRuleCmd.java | 11 +++
.../user/ipv6/DeleteIpv6FirewallRuleCmd.java | 14 ++++
.../user/ipv6/UpdateIpv6FirewallRuleCmd.java | 14 ++++
.../api/routing/SetIpv6FirewallRulesCommand.java | 8 +-
.../facade/SetIpv6FirewallRulesConfigItem.java | 1 +
.../virtualnetwork/model/FirewallRule.java | 8 ++
.../cloud/offerings/dao/NetworkOfferingDao.java | 2 +
.../offerings/dao/NetworkOfferingDaoImpl.java | 9 +++
.../main/java/com/cloud/api/ApiResponseHelper.java | 2 +-
.../api/query/dao/NetworkOfferingJoinDaoImpl.java | 8 +-
.../api/query/dao/VpcOfferingJoinDaoImpl.java | 8 +-
.../cloud/network/router/CommandSetupHelper.java | 18 ++---
systemvm/debian/opt/cloud/bin/configure.py | 46 +++++++----
systemvm/debian/opt/cloud/bin/cs/CsNetfilter.py | 20 ++---
systemvm/debian/opt/cloud/bin/setup/bootstrap.sh | 9 ---
systemvm/debian/opt/cloud/bin/setup/common.sh | 88 ++++++++++++++++------
systemvm/debian/opt/cloud/bin/setup/router.sh | 1 +
17 files changed, 200 insertions(+), 67 deletions(-)
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/CreateIpv6FirewallRuleCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/CreateIpv6FirewallRuleCmd.java
index 780baa5664..be158c9de0 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/CreateIpv6FirewallRuleCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/CreateIpv6FirewallRuleCmd.java
@@ -21,6 +21,7 @@ import java.util.List;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCreateCmd;
@@ -252,4 +253,14 @@ public class CreateIpv6FirewallRuleCmd extends
BaseAsyncCreateCmd {
}
}
}
+
+ @Override
+ public Long getApiResourceId() {
+ return getNetworkId();
+ }
+
+ @Override
+ public ApiCommandResourceType getApiResourceType() {
+ return ApiCommandResourceType.Network;
+ }
}
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/DeleteIpv6FirewallRuleCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/DeleteIpv6FirewallRuleCmd.java
index 04c6082e05..e7343a80d0 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/DeleteIpv6FirewallRuleCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/DeleteIpv6FirewallRuleCmd.java
@@ -17,6 +17,7 @@
package org.apache.cloudstack.api.command.user.ipv6;
import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.ApiErrorCode;
import org.apache.cloudstack.api.BaseAsyncCmd;
@@ -94,4 +95,17 @@ public class DeleteIpv6FirewallRuleCmd extends BaseAsyncCmd {
}
}
+ @Override
+ public Long getApiResourceId() {
+ FirewallRule rule = _firewallService.getFirewallRule(id);
+ if (rule != null) {
+ return rule.getNetworkId();
+ }
+ return null;
+ }
+
+ @Override
+ public ApiCommandResourceType getApiResourceType() {
+ return ApiCommandResourceType.Network;
+ }
}
diff --git
a/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/UpdateIpv6FirewallRuleCmd.java
b/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/UpdateIpv6FirewallRuleCmd.java
index bb8fc71b55..8a05d02ae5 100644
---
a/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/UpdateIpv6FirewallRuleCmd.java
+++
b/api/src/main/java/org/apache/cloudstack/api/command/user/ipv6/UpdateIpv6FirewallRuleCmd.java
@@ -20,6 +20,7 @@ import java.util.List;
import org.apache.cloudstack.acl.RoleType;
import org.apache.cloudstack.api.APICommand;
+import org.apache.cloudstack.api.ApiCommandResourceType;
import org.apache.cloudstack.api.ApiConstants;
import org.apache.cloudstack.api.BaseAsyncCustomIdCmd;
import org.apache.cloudstack.api.Parameter;
@@ -172,4 +173,17 @@ public class UpdateIpv6FirewallRuleCmd extends
BaseAsyncCustomIdCmd {
}
}
+ @Override
+ public Long getApiResourceId() {
+ FirewallRule rule = _firewallService.getFirewallRule(id);
+ if (rule != null) {
+ return rule.getNetworkId();
+ }
+ return null;
+ }
+
+ @Override
+ public ApiCommandResourceType getApiResourceType() {
+ return ApiCommandResourceType.Network;
+ }
}
diff --git
a/core/src/main/java/com/cloud/agent/api/routing/SetIpv6FirewallRulesCommand.java
b/core/src/main/java/com/cloud/agent/api/routing/SetIpv6FirewallRulesCommand.java
index 62cc2cabaa..638ba408de 100644
---
a/core/src/main/java/com/cloud/agent/api/routing/SetIpv6FirewallRulesCommand.java
+++
b/core/src/main/java/com/cloud/agent/api/routing/SetIpv6FirewallRulesCommand.java
@@ -30,18 +30,24 @@ import com.cloud.agent.api.to.FirewallRuleTO;
*/
public class SetIpv6FirewallRulesCommand extends NetworkElementCommand {
FirewallRuleTO[] rules;
+ String guestIp6Cidr;
protected SetIpv6FirewallRulesCommand() {
}
- public SetIpv6FirewallRulesCommand(List<FirewallRuleTO> rules) {
+ public SetIpv6FirewallRulesCommand(List<FirewallRuleTO> rules, String
guestIp6Cidr) {
this.rules = rules.toArray(new FirewallRuleTO[rules.size()]);
+ this.guestIp6Cidr = guestIp6Cidr;
}
public FirewallRuleTO[] getRules() {
return rules;
}
+ public String getGuestIp6Cidr() {
+ return guestIp6Cidr;
+ }
+
@Override
public int getAnswersCount() {
return rules.length;
diff --git
a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetIpv6FirewallRulesConfigItem.java
b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetIpv6FirewallRulesConfigItem.java
index ff4f266f99..75ec539681 100644
---
a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetIpv6FirewallRulesConfigItem.java
+++
b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/facade/SetIpv6FirewallRulesConfigItem.java
@@ -42,6 +42,7 @@ public class SetIpv6FirewallRulesConfigItem extends
AbstractConfigItemFacade{
final FirewallRule fwRule = new FirewallRule(rule.getId(),
rule.getSrcVlanTag(), rule.getSrcIp(), rule.getProtocol(),
rule.getSrcPortRange(), rule.revoked(),
rule.isAlreadyAdded(), rule.getSourceCidrList(),
rule.getDestCidrList(), rule.getPurpose().toString(), rule.getIcmpType(),
rule.getIcmpCode(), rule.getTrafficType().toString(),
rule.getGuestCidr(), rule.isDefaultEgressPolicy());
+ fwRule.setGuestIp6Cidr(command.getGuestIp6Cidr());
rules.add(fwRule);
}
diff --git
a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/FirewallRule.java
b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/FirewallRule.java
index 44ec9bef76..1baf05657f 100644
---
a/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/FirewallRule.java
+++
b/core/src/main/java/com/cloud/agent/resource/virtualnetwork/model/FirewallRule.java
@@ -38,6 +38,7 @@ public class FirewallRule {
private String guestCidr;
private boolean defaultEgressPolicy;
private String type;
+ private String guestIp6Cidr;
public FirewallRule() {
// Empty constructor for (de)serialization
@@ -174,4 +175,11 @@ public class FirewallRule {
this.defaultEgressPolicy = defaultEgressPolicy;
}
+ public String getGuestIp6Cidr() {
+ return guestIp6Cidr;
+ }
+
+ public void setGuestIp6Cidr(String guestIp6Cidr) {
+ this.guestIp6Cidr = guestIp6Cidr;
+ }
}
diff --git
a/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDao.java
b/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDao.java
index 60d7701cd0..381d2144df 100644
---
a/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDao.java
+++
b/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDao.java
@@ -73,5 +73,7 @@ public interface NetworkOfferingDao extends
GenericDao<NetworkOfferingVO, Long>
NetUtils.InternetProtocol getNetworkOfferingInternetProtocol(long
offeringId);
+ NetUtils.InternetProtocol getNetworkOfferingInternetProtocol(long
offeringId, NetUtils.InternetProtocol defaultProtocol);
+
boolean isIpv6Supported(long offeringId);
}
diff --git
a/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
b/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
index fd36a1b825..65362eba3c 100644
---
a/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
+++
b/engine/schema/src/main/java/com/cloud/offerings/dao/NetworkOfferingDaoImpl.java
@@ -278,6 +278,15 @@ public class NetworkOfferingDaoImpl extends
GenericDaoBase<NetworkOfferingVO, Lo
return NetUtils.InternetProtocol.fromValue(internetProtocolStr);
}
+ @Override
+ public NetUtils.InternetProtocol getNetworkOfferingInternetProtocol(long
offeringId,NetUtils.InternetProtocol defaultProtocol) {
+ NetUtils.InternetProtocol protocol =
getNetworkOfferingInternetProtocol(offeringId);
+ if (protocol == null) {
+ return defaultProtocol;
+ }
+ return protocol;
+ }
+
@Override
public boolean isIpv6Supported(long offeringId) {
NetUtils.InternetProtocol internetProtocol =
getNetworkOfferingInternetProtocol(offeringId);
diff --git a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
index d7f03bc51c..2afe1d7d38 100644
--- a/server/src/main/java/com/cloud/api/ApiResponseHelper.java
+++ b/server/src/main/java/com/cloud/api/ApiResponseHelper.java
@@ -2533,7 +2533,7 @@ public class ApiResponseHelper implements
ResponseGenerator {
response.setBytesSent(bytesSent);
if
(networkOfferingDao.isIpv6Supported(network.getNetworkOfferingId())) {
-
response.setInternetProtocol(networkOfferingDao.getNetworkOfferingInternetProtocol(network.getNetworkOfferingId()).toString());
+
response.setInternetProtocol(networkOfferingDao.getNetworkOfferingInternetProtocol(network.getNetworkOfferingId(),
NetUtils.InternetProtocol.IPv4).toString());
response.setIpv6Routing(Network.Routing.Static.toString());
response.setIpv6Routes(new LinkedHashSet<>());
if
(Network.GuestType.Isolated.equals(networkOffering.getGuestType())) {
diff --git
a/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java
b/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java
index ae51df3cb6..474409a976 100644
---
a/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java
+++
b/server/src/main/java/com/cloud/api/query/dao/NetworkOfferingJoinDaoImpl.java
@@ -19,6 +19,7 @@ package com.cloud.api.query.dao;
import java.util.List;
+import org.apache.commons.lang3.StringUtils;
import org.apache.cloudstack.api.response.NetworkOfferingResponse;
import org.apache.log4j.Logger;
@@ -27,6 +28,7 @@ import com.cloud.offering.NetworkOffering;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.net.NetUtils;
public class NetworkOfferingJoinDaoImpl extends
GenericDaoBase<NetworkOfferingJoinVO, Long> implements NetworkOfferingJoinDao {
public static final Logger s_logger =
Logger.getLogger(NetworkOfferingJoinDaoImpl.class);
@@ -99,7 +101,11 @@ public class NetworkOfferingJoinDaoImpl extends
GenericDaoBase<NetworkOfferingJo
networkOfferingResponse.setDomain(networkOfferingJoinVO.getDomainPath());
networkOfferingResponse.setZoneId(networkOfferingJoinVO.getZoneUuid());
networkOfferingResponse.setZone(networkOfferingJoinVO.getZoneName());
-
networkOfferingResponse.setInternetProtocol(networkOfferingJoinVO.getInternetProtocol());
+ String protocol = networkOfferingJoinVO.getInternetProtocol();
+ if (StringUtils.isEmpty(protocol)) {
+ protocol = NetUtils.InternetProtocol.IPv4.toString();
+ }
+ networkOfferingResponse.setInternetProtocol(protocol);
}
networkOfferingResponse.setObjectName("networkoffering");
diff --git
a/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java
b/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java
index c7afbe1790..0413d8eb52 100644
--- a/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java
+++ b/server/src/main/java/com/cloud/api/query/dao/VpcOfferingJoinDaoImpl.java
@@ -20,6 +20,7 @@ package com.cloud.api.query.dao;
import java.util.List;
import org.apache.cloudstack.api.response.VpcOfferingResponse;
+import org.apache.commons.lang3.StringUtils;
import org.apache.log4j.Logger;
import com.cloud.api.query.vo.VpcOfferingJoinVO;
@@ -27,6 +28,7 @@ import com.cloud.network.vpc.VpcOffering;
import com.cloud.utils.db.GenericDaoBase;
import com.cloud.utils.db.SearchBuilder;
import com.cloud.utils.db.SearchCriteria;
+import com.cloud.utils.net.NetUtils;
public class VpcOfferingJoinDaoImpl extends GenericDaoBase<VpcOfferingJoinVO,
Long> implements VpcOfferingJoinDao {
public static final Logger s_logger =
Logger.getLogger(VpcOfferingJoinDaoImpl.class);
@@ -70,7 +72,11 @@ public class VpcOfferingJoinDaoImpl extends
GenericDaoBase<VpcOfferingJoinVO, Lo
offeringResponse.setDomain(offeringJoinVO.getDomainPath());
offeringResponse.setZoneId(offeringJoinVO.getZoneUuid());
offeringResponse.setZone(offeringJoinVO.getZoneName());
-
offeringResponse.setInternetProtocol(offeringJoinVO.getInternetProtocol());
+ String protocol = offeringJoinVO.getInternetProtocol();
+ if (StringUtils.isEmpty(protocol)) {
+ protocol = NetUtils.InternetProtocol.IPv4.toString();
+ }
+ offeringResponse.setInternetProtocol(protocol);
}
offeringResponse.setObjectName("vpcoffering");
diff --git
a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
index 5cf9f51a7d..d6ee6e844d 100644
--- a/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
+++ b/server/src/main/java/com/cloud/network/router/CommandSetupHelper.java
@@ -461,7 +461,9 @@ public class CommandSetupHelper {
public void createApplyIpv6FirewallRulesCommands(final List<? extends
FirewallRule> rules, final VirtualRouter router, final Commands cmds, final
long guestNetworkId) {
final List<FirewallRuleTO> rulesTO = new ArrayList<>();
String systemRule = null;
- Boolean defaultEgressPolicy = false;
+ final NetworkVO network = _networkDao.findById(guestNetworkId);
+ final NetworkOfferingVO offering =
_networkOfferingDao.findById(network.getNetworkOfferingId());
+ Boolean defaultEgressPolicy = offering.isEgressDefaultPolicy();;
if (rules != null) {
if (rules.size() > 0) {
if (rules.get(0).getTrafficType() ==
FirewallRule.TrafficType.Egress && rules.get(0).getType() ==
FirewallRule.FirewallRuleType.System) {
@@ -476,16 +478,13 @@ public class CommandSetupHelper {
final FirewallRuleTO ruleTO = new FirewallRuleTO(rule,
null, null, Purpose.Ipv6Firewall, trafficType);
rulesTO.add(ruleTO);
} else if (rule.getTrafficType() ==
FirewallRule.TrafficType.Egress) {
- final NetworkVO network =
_networkDao.findById(guestNetworkId);
- final NetworkOfferingVO offering =
_networkOfferingDao.findById(network.getNetworkOfferingId());
- defaultEgressPolicy = offering.isEgressDefaultPolicy();
final FirewallRuleTO ruleTO = new FirewallRuleTO(rule,
null, "", Purpose.Ipv6Firewall, trafficType, defaultEgressPolicy);
rulesTO.add(ruleTO);
}
}
}
- final SetIpv6FirewallRulesCommand cmd = new
SetIpv6FirewallRulesCommand(rulesTO);
+ final SetIpv6FirewallRulesCommand cmd = new
SetIpv6FirewallRulesCommand(rulesTO, network.getIp6Cidr());
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP,
_routerControlHelper.getRouterControlIp(router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP,
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME,
router.getInstanceName());
@@ -547,7 +546,9 @@ public class CommandSetupHelper {
public void createIpv6FirewallRulesCommands(final List<? extends
FirewallRule> rules, final VirtualRouter router, final Commands cmds, final
long guestNetworkId) {
final List<FirewallRuleTO> rulesTO = new ArrayList<>();
String systemRule = null;
- Boolean defaultEgressPolicy = false;
+ final NetworkVO network = _networkDao.findById(guestNetworkId);
+ final NetworkOfferingVO offering =
_networkOfferingDao.findById(network.getNetworkOfferingId());
+ Boolean defaultEgressPolicy = offering.isEgressDefaultPolicy();
if (rules != null) {
if (rules.size() > 0) {
if (rules.get(0).getTrafficType() ==
FirewallRule.TrafficType.Egress && rules.get(0).getType() ==
FirewallRule.FirewallRuleType.System) {
@@ -562,16 +563,13 @@ public class CommandSetupHelper {
final FirewallRuleTO ruleTO = new FirewallRuleTO(rule,
null, null, Purpose.Ipv6Firewall, traffictype);
rulesTO.add(ruleTO);
} else if (rule.getTrafficType() ==
FirewallRule.TrafficType.Egress) {
- final NetworkVO network =
_networkDao.findById(guestNetworkId);
- final NetworkOfferingVO offering =
_networkOfferingDao.findById(network.getNetworkOfferingId());
- defaultEgressPolicy = offering.isEgressDefaultPolicy();
final FirewallRuleTO ruleTO = new FirewallRuleTO(rule,
null, "", Purpose.Ipv6Firewall, traffictype, defaultEgressPolicy);
rulesTO.add(ruleTO);
}
}
}
- final SetIpv6FirewallRulesCommand cmd = new
SetIpv6FirewallRulesCommand(rulesTO);
+ final SetIpv6FirewallRulesCommand cmd = new
SetIpv6FirewallRulesCommand(rulesTO, network.getIp6Cidr());
cmd.setAccessDetail(NetworkElementCommand.ROUTER_IP,
_routerControlHelper.getRouterControlIp(router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_GUEST_IP,
_routerControlHelper.getRouterIpInNetwork(guestNetworkId, router.getId()));
cmd.setAccessDetail(NetworkElementCommand.ROUTER_NAME,
router.getInstanceName());
diff --git a/systemvm/debian/opt/cloud/bin/configure.py
b/systemvm/debian/opt/cloud/bin/configure.py
index e6c608b469..67e575bfb7 100755
--- a/systemvm/debian/opt/cloud/bin/configure.py
+++ b/systemvm/debian/opt/cloud/bin/configure.py
@@ -296,17 +296,13 @@ class CsAcl(CsDataBag):
return
tier_cidr = self.ip6_cidr
chain = "%s_%s_policy" % (self.device, direction)
- rule = "accept"
- parent_chain = "acl_output"
+ parent_chain = "acl_forward"
cidr_key = "saddr"
- parent_chain_rule = "ip6 saddr ::/0 jump %s" % (chain)
if direction == "ingress":
- rule = "drop"
- parent_chain = "acl_input"
cidr_key = "daddr"
parent_chain_rule = "ip6 %s %s jump %s" % (cidr_key, tier_cidr,
chain)
- self.ipv6_acl.append({'type': "", 'chain': parent_chain, 'rule':
parent_chain_rule})
- self.ipv6_acl.insert(0, {'type': "chain", 'chain': chain, 'rule':
rule})
+ self.ipv6_acl.insert(0, {'type': "", 'chain': parent_chain,
'rule': parent_chain_rule})
+ self.ipv6_acl.insert(0, {'type': "chain", 'chain': chain})
for rule in rule_list:
cidr = rule['cidr']
if cidr != None and cidr != "":
@@ -369,6 +365,8 @@ class CsAcl(CsDataBag):
self.ipv6_acl.insert(0, {'type': type, 'chain': chain,
'rule': rstr})
else:
self.ipv6_acl.append({'type': type, 'chain': chain,
'rule': rstr})
+ rstr = "counter packets 0 bytes 0 drop"
+ self.ipv6_acl.append({'type': "", 'chain': chain, 'rule': rstr})
def process(self, direction, rule_list, base):
count = base
@@ -480,10 +478,30 @@ class CsIpv6Firewall(CsDataBag):
def process(self):
fw = self.config.get_ipv6_fw()
logging.info("Processing IPv6 firewall rules %s; %s" % (self.dbag, fw))
+ chains_added = False
+ egress_policy = None
for item in self.dbag:
if item == "id":
continue
rule = self.dbag[item]
+
+ if chains_added == False:
+ guest_cidr = rule['guest_ip6_cidr']
+ parent_chain = "fw_forward"
+ chain = "fw_chain_egress"
+ parent_chain_rule = "ip6 saddr %s jump %s" % (guest_cidr,
chain)
+ fw.append({'type': "chain", 'chain': chain})
+ fw.append({'type': "", 'chain': parent_chain, 'rule':
parent_chain_rule})
+ chain = "fw_chain_ingress"
+ parent_chain_rule = "ip6 daddr %s jump %s" % (guest_cidr,
chain)
+ fw.append({'type': "chain", 'chain': chain})
+ fw.append({'type': "", 'chain': parent_chain, 'rule':
parent_chain_rule})
+ if rule['default_egress_policy']:
+ egress_policy = "accept"
+ else:
+ egress_policy = "drop"
+ chains_added = True
+
rstr = ""
chain = "fw_chain_ingress"
@@ -561,14 +579,14 @@ class CsIpv6Firewall(CsDataBag):
rstr = appendStringIfNotEmpty(rstr, proto)
if rstr and action:
rstr = rstr + " " + action
- else:
- type = "chain"
- rstr = action
- logging.debug("Process IPv6 firewall rule %s" % rstr)
- if type == "chain":
- fw.insert(0, {'type': type, 'chain': chain, 'rule': rstr})
- else:
+ logging.debug("Process IPv6 firewall rule %s" % rstr)
fw.append({'type': type, 'chain': chain, 'rule': rstr})
+ if chains_added:
+ base_rstr = "counter packets 0 bytes 0"
+ rstr = "%s drop" % base_rstr
+ fw.append({'type': "", 'chain': "fw_chain_ingress", 'rule': rstr})
+ rstr = "%s %s" % (base_rstr, egress_policy)
+ fw.append({'type': "", 'chain': "fw_chain_egress", 'rule': rstr})
class CsVmMetadata(CsDataBag):
diff --git a/systemvm/debian/opt/cloud/bin/cs/CsNetfilter.py
b/systemvm/debian/opt/cloud/bin/cs/CsNetfilter.py
index 65bf4114a2..a034034dc8 100755
--- a/systemvm/debian/opt/cloud/bin/cs/CsNetfilter.py
+++ b/systemvm/debian/opt/cloud/bin/cs/CsNetfilter.py
@@ -229,23 +229,23 @@ class CsNetfilters(object):
if chain_policy and action:
chain_policy = "%s policy %s;" % (chain_policy, action)
CsHelper.execute("nft add chain %s %s %s '{ %s }'" %
(address_family, table, chain, chain_policy))
- if chain_policy:
+ if hook == "input" or hook == "output":
CsHelper.execute("nft add rule %s %s %s icmpv6 type {
echo-request, echo-reply, nd-neighbor-solicit, nd-router-advert,
nd-neighbor-advert } accept" % (address_family, table, chain))
def apply_ip6_rules(self, rules, type):
- logging.debug("Add IPv6 rules: %s", rules)
if len(rules) == 0:
return
address_family = 'ip6'
table = 'ip6_firewall'
default_chains = [
- { "chain": "fw_chain_ingress", "hook": "input", "action": "drop"}
+ { "chain": "fw_input", "hook": "input", "action": "drop"},
+ { "chain": "fw_forward", "hook": "forward", "action": "accept"}
]
if type == "acl":
table = 'ip6_acl'
default_chains = [
{ "chain": "acl_input", "hook": "input", "action": "drop" },
- { "chain": "acl_output", "hook": "output", "action": "accept" }
+ { "chain": "acl_forward", "hook": "forward", "action":
"accept"}
]
CsHelper.execute("nft add table %s %s" % (address_family, table))
for chain in default_chains:
@@ -253,13 +253,15 @@ class CsNetfilters(object):
for fw in rules:
chain = fw['chain']
type = fw['type']
- rule = fw['rule']
+ rule = None
+ if 'rule' in fw:
+ rule = fw['rule']
if type == "chain":
- hook = "input"
- if "egress" in chain:
+ hook = ""
+ if "output" in chain:
hook = "output"
- if chain.startswith("eth"):
- hook = ""
+ elif "input" in chain:
+ hook = "input"
self.add_ip6_chain(address_family, table, chain, hook, rule)
else:
logging.info("Add: rule=%s in address_family=%s table=%s,
chain=%s", rule, address_family, table, chain)
diff --git a/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
b/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
index b3409213ed..4720237543 100755
--- a/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/bootstrap.sh
@@ -85,15 +85,6 @@ config_sysctl() {
sed -i "/^vm.vfs_cache_pressure/ c\vm.vfs_cache_pressure = 100"
/etc/sysctl.conf
fi
- eth0_ip6=$(grep -Po 'eth0ip6=\K[0-9a-zA-Z:]*' $CMDLINE)
- eth2_ip6=$(grep -Po 'eth2ip6=\K[0-9a-zA-Z:]*' $CMDLINE)
- if [ -n "$eth0_ip6" ] || [ -n "$eth2_ip6" ]
- then
- sed -i "s/net.ipv6.conf.all.disable_ipv6
=.*$/net.ipv6.conf.all.disable_ipv6 = 0/" /etc/sysctl.conf
- sed -i "s/net.ipv6.conf.all.forwarding
=.*$/net.ipv6.conf.all.forwarding = 1/" /etc/sysctl.conf
- sed -i "s/net.ipv6.conf.all.accept_ra =.*$/net.ipv6.conf.all.accept_ra
= 1/" /etc/sysctl.conf
- fi
-
sync
sysctl -p
}
diff --git a/systemvm/debian/opt/cloud/bin/setup/common.sh
b/systemvm/debian/opt/cloud/bin/setup/common.sh
index b937fd889b..a799a88be8 100755
--- a/systemvm/debian/opt/cloud/bin/setup/common.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/common.sh
@@ -110,23 +110,31 @@ setup_interface() {
fi
}
-setup_interface_ipv6() {
+enable_interface_ipv6() {
+ local intf=eth${1}
+ log_it "Enabling IPv6 on interface: ${intf}"
sysctl net.ipv6.conf.all.disable_ipv6=0
sysctl net.ipv6.conf.all.forwarding=1
sysctl net.ipv6.conf.all.accept_ra=1
-
sed -i "s/net.ipv6.conf.all.disable_ipv6
=.*$/net.ipv6.conf.all.disable_ipv6 = 0/" /etc/sysctl.conf
sed -i "s/net.ipv6.conf.all.forwarding =.*$/net.ipv6.conf.all.forwarding =
1/" /etc/sysctl.conf
sed -i "s/net.ipv6.conf.all.accept_ra =.*$/net.ipv6.conf.all.accept_ra =
1/" /etc/sysctl.conf
+ sysctl net.ipv6.conf.${intf}.accept_dad=0
+ sysctl net.ipv6.conf.${intf}.use_tempaddr=0
+ if [ "$2" = true ] ; then
+ ifdown ${intf}
+ ifup ${intf}
+ fi
+}
+
+setup_interface_ipv6() {
+ enable_interface_ipv6 $1 false
local intfnum=$1
local ipv6="$2"
local prelen="$3"
local intf=eth${intfnum}
- sysctl net.ipv6.conf.$intf.accept_dad=0
- sysctl net.ipv6.conf.$intf.use_tempaddr=0
-
echo "iface $intf inet6 static" >> /etc/network/interfaces
echo " address $ipv6 " >> /etc/network/interfaces
echo " netmask $prelen" >> /etc/network/interfaces
@@ -266,31 +274,52 @@ enable_rpsrfs() {
echo 256 > /sys/class/net/eth2/queues/rx-0/rps_flow_cnt
}
-setup_common() {
- init_interfaces $1 $2 $3
- if [ -n "$ETH0_IP" ]
+setup_ipv6() {
+ local enableradvd=false
+ if [ -n "$ETH0_IP6" ]
then
- setup_interface "0" $ETH0_IP $ETH0_MASK $GW
+ enableradvd=true
+ setup_interface_ipv6 "0" $ETH0_IP6 $ETH0_IP6_PRELEN
+ fi
+ if [ -n "$ETH0_IP6" ] || [ -n "$GUEST_GW6" -a -n "$GUEST_CIDR6_SIZE" ]
+ then
+ rm -rf /etc/radvd.conf
+ setup_radvd "0" $GUEST_GW6 $GUEST_CIDR6_SIZE $enableradvd
+ fi
+ if [ -n "$ETH2_IP6" ]
+ then
+ setup_interface_ipv6 "2" $ETH2_IP6 $ETH2_IP6_PRELEN
+ fi
+}
+
+restore_ipv6() {
+ if [ -n "$ETH0_IP6" ] || [ -n "$GUEST_GW6" -a -n "$GUEST_CIDR6_SIZE" ]
+ then
+ enable_interface_ipv6 "0" true
fi
if [ -n "$ETH0_IP6" ]
then
- setup_interface_ipv6 "0" $ETH0_IP6 $ETH0_IP6_PRELEN
- rm -rf /etc/radvd.conf
- setup_radvd "0" $ETH0_IP6 $ETH0_IP6_PRELEN true
- elif [ -n "$GUEST_GW6" -a -n "$GUEST_CIDR6_SIZE" ]
+ enable_radvd
+ fi
+ if [ -n "$ETH2_IP6" ]
then
- rm -rf /etc/radvd.conf
- setup_radvd "0" $GUEST_GW6 $GUEST_CIDR6_SIZE false
+ enable_interface_ipv6 "2" true
+ fi
+}
+
+
+setup_common() {
+ init_interfaces $1 $2 $3
+ if [ -n "$ETH0_IP" ]
+ then
+ setup_interface "0" $ETH0_IP $ETH0_MASK $GW
fi
setup_interface "1" $ETH1_IP $ETH1_MASK $GW
if [ -n "$ETH2_IP" ]
then
setup_interface "2" $ETH2_IP $ETH2_MASK $GW
fi
- if [ -n "$ETH2_IP6" ]
- then
- setup_interface_ipv6 "2" $ETH2_IP6 $ETH2_IP6_PRELEN
- fi
+ setup_ipv6
echo $NAME > /etc/hostname
echo 'AVAHI_DAEMON_DETECT_LOCAL=0' > /etc/default/avahi-daemon
@@ -370,6 +399,24 @@ setup_common() {
fi
}
+enable_radvd() {
+ systemctl -q is-enabled radvd
+ status=$?
+ if [ $status -ne 0 ]
+ then
+ log_it "Enabling radvd"
+ systemctl enable radvd
+ echo "radvd" >> /var/cache/cloud/enabled_svcs
+ fi
+ systemctl -q is-active radvd
+ status=$?
+ if [ $status -ne 0 ]
+ then
+ log_it "Starting radvd"
+ systemctl start radvd
+ fi
+}
+
setup_radvd() {
log_it "Setting up radvd"
@@ -394,8 +441,7 @@ setup_radvd() {
sed -i "s,{{ RDNSS_CONFIG }},$RDNSS_CFG,g" /etc/radvd.conf.$intf
cat /etc/radvd.conf.$intf >> /etc/radvd.conf
if [ "$enable" = true ] ; then
- systemctl enable radvd
- echo "radvd" >> /var/cache/cloud/enabled_svcs
+ enable_radvd
fi
}
diff --git a/systemvm/debian/opt/cloud/bin/setup/router.sh
b/systemvm/debian/opt/cloud/bin/setup/router.sh
index d7113c4930..f5fa95c7b1 100755
--- a/systemvm/debian/opt/cloud/bin/setup/router.sh
+++ b/systemvm/debian/opt/cloud/bin/setup/router.sh
@@ -71,6 +71,7 @@ setup_router() {
enable_fwding 1
enable_rpsrfs 1
enable_passive_ftp 1
+ restore_ipv6
# Only allow DNS service for current network
sed -i "s/-A INPUT -i eth0 -p udp -m udp --dport 53 -j ACCEPT/-A INPUT -i
eth0 -p udp -m udp --dport 53 -s $DHCP_RANGE\/$CIDR_SIZE -j ACCEPT/g"
/etc/iptables/rules.v4