Added IP Table rule to allow eth1-midplane traffic for chassis (#13946)
What I did: Added IP Table rule to make sure we do not drop chassis internal traffic on eth1-midpplane when Control Plane ACL's are installed. Why I did: When Control Plane ACL's are installed there is default Catch All rule is added to drop all traffic that is not white-listed explicitly https://github.com/sonic-net/sonic-host-services/blob/master/scripts/caclmgrd#L735. In this case Internal Traffic between Supervisor and LC will get drop. To fix this added explicit rule to allow all traffic coming from eth1-midplane.
This commit is contained in:
parent
15916670d7
commit
9b2aa9591c
@ -191,7 +191,7 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
|
|||||||
" | awk '{print $4}' | cut -d'/' -f1 | head -1"
|
" | awk '{print $4}' | cut -d'/' -f1 | head -1"
|
||||||
return self.run_commands([ipv6_address_get_command])
|
return self.run_commands([ipv6_address_get_command])
|
||||||
|
|
||||||
def run_commands(self, commands):
|
def run_commands(self, commands, ignore_error=False):
|
||||||
"""
|
"""
|
||||||
Given a list of shell commands, run them in order
|
Given a list of shell commands, run them in order
|
||||||
Args:
|
Args:
|
||||||
@ -202,7 +202,7 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
|
|||||||
|
|
||||||
(stdout, stderr) = proc.communicate()
|
(stdout, stderr) = proc.communicate()
|
||||||
|
|
||||||
if proc.returncode != 0:
|
if proc.returncode != 0 and not ignore_error:
|
||||||
self.log_error("Error running command '{}'".format(cmd))
|
self.log_error("Error running command '{}'".format(cmd))
|
||||||
elif stdout:
|
elif stdout:
|
||||||
return stdout.rstrip('\n')
|
return stdout.rstrip('\n')
|
||||||
@ -275,6 +275,15 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
|
|||||||
|
|
||||||
return block_ip2me_cmds
|
return block_ip2me_cmds
|
||||||
|
|
||||||
|
def check_chassis_midplane_interface_exist(self):
|
||||||
|
return self.run_commands(["ip link show" + " | grep -w 'eth1-midplane'" ], ignore_error=True)
|
||||||
|
|
||||||
|
def generate_allow_internal_chasis_midplane_traffic(self, namespace):
|
||||||
|
if not namespace and self.check_chassis_midplane_interface_exist():
|
||||||
|
return ["iptables -A INPUT -i eth1-midplane -j ACCEPT"]
|
||||||
|
else:
|
||||||
|
return []
|
||||||
|
|
||||||
def generate_allow_internal_docker_ip_traffic_commands(self, namespace):
|
def generate_allow_internal_docker_ip_traffic_commands(self, namespace):
|
||||||
allow_internal_docker_ip_cmds = []
|
allow_internal_docker_ip_cmds = []
|
||||||
|
|
||||||
@ -529,6 +538,9 @@ class ControlPlaneAclManager(daemon_base.DaemonBase):
|
|||||||
# Add iptables commands to allow internal docker traffic
|
# Add iptables commands to allow internal docker traffic
|
||||||
iptables_cmds += self.generate_allow_internal_docker_ip_traffic_commands(namespace)
|
iptables_cmds += self.generate_allow_internal_docker_ip_traffic_commands(namespace)
|
||||||
|
|
||||||
|
# Add iptables commands to allow internal chasiss midplane traffic
|
||||||
|
iptables_cmds += self.generate_allow_internal_chasis_midplane_traffic(namespace)
|
||||||
|
|
||||||
# Add iptables/ip6tables commands to allow all incoming packets from established
|
# Add iptables/ip6tables commands to allow all incoming packets from established
|
||||||
# connections or new connections which are related to established connections
|
# connections or new connections which are related to established connections
|
||||||
iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT")
|
iptables_cmds.append(self.iptables_cmd_ns_prefix[namespace] + "iptables -A INPUT -m conntrack --ctstate ESTABLISHED,RELATED -j ACCEPT")
|
||||||
|
@ -38,6 +38,7 @@ class TestCaclmgrdExternalClientAcl(TestCase):
|
|||||||
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ipv6 = mock.MagicMock()
|
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ipv6 = mock.MagicMock()
|
||||||
self.caclmgrd.ControlPlaneAclManager.generate_block_ip2me_traffic_iptables_commands = mock.MagicMock(return_value=[])
|
self.caclmgrd.ControlPlaneAclManager.generate_block_ip2me_traffic_iptables_commands = mock.MagicMock(return_value=[])
|
||||||
self.caclmgrd.ControlPlaneAclManager.get_chain_list = mock.MagicMock(return_value=["INPUT", "FORWARD", "OUTPUT"])
|
self.caclmgrd.ControlPlaneAclManager.get_chain_list = mock.MagicMock(return_value=["INPUT", "FORWARD", "OUTPUT"])
|
||||||
|
self.caclmgrd.ControlPlaneAclManager.check_chassis_midplane_interface_exist = mock.MagicMock(return_value=False)
|
||||||
caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd")
|
caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd")
|
||||||
|
|
||||||
iptables_rules_ret, _ = caclmgrd_daemon.get_acl_rules_and_translate_to_iptables_commands('')
|
iptables_rules_ret, _ = caclmgrd_daemon.get_acl_rules_and_translate_to_iptables_commands('')
|
||||||
|
@ -0,0 +1,42 @@
|
|||||||
|
import os
|
||||||
|
import sys
|
||||||
|
|
||||||
|
from swsscommon import swsscommon
|
||||||
|
from parameterized import parameterized
|
||||||
|
from sonic_py_common.general import load_module_from_source
|
||||||
|
from unittest import TestCase, mock
|
||||||
|
from pyfakefs.fake_filesystem_unittest import patchfs
|
||||||
|
|
||||||
|
from .test_chassis_midplane_vectors import CACLMGRD_CHASSIS_MIDPLANE_TEST_VECTOR
|
||||||
|
from tests.common.mock_configdb import MockConfigDb
|
||||||
|
|
||||||
|
|
||||||
|
DBCONFIG_PATH = '/var/run/redis/sonic-db/database_config.json'
|
||||||
|
|
||||||
|
|
||||||
|
class TestCaclmgrdChassisMidplane(TestCase):
|
||||||
|
"""
|
||||||
|
Test caclmgrd Chassis Midplane
|
||||||
|
"""
|
||||||
|
def setUp(self):
|
||||||
|
swsscommon.ConfigDBConnector = MockConfigDb
|
||||||
|
test_path = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
|
||||||
|
modules_path = os.path.dirname(test_path)
|
||||||
|
scripts_path = os.path.join(modules_path, "scripts")
|
||||||
|
sys.path.insert(0, modules_path)
|
||||||
|
caclmgrd_path = os.path.join(scripts_path, 'caclmgrd')
|
||||||
|
self.caclmgrd = load_module_from_source('caclmgrd', caclmgrd_path)
|
||||||
|
self.maxDiff = None
|
||||||
|
|
||||||
|
@parameterized.expand(CACLMGRD_CHASSIS_MIDPLANE_TEST_VECTOR)
|
||||||
|
@patchfs
|
||||||
|
def test_caclmgrd_chassis_midplane(self, test_name, test_data, fs):
|
||||||
|
if not os.path.exists(DBCONFIG_PATH):
|
||||||
|
fs.create_file(DBCONFIG_PATH) # fake database_config.json
|
||||||
|
|
||||||
|
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ip = mock.MagicMock()
|
||||||
|
self.caclmgrd.ControlPlaneAclManager.get_namespace_mgmt_ipv6 = mock.MagicMock()
|
||||||
|
self.caclmgrd.ControlPlaneAclManager.check_chassis_midplane_interface_exist = mock.MagicMock(return_value=True)
|
||||||
|
caclmgrd_daemon = self.caclmgrd.ControlPlaneAclManager("caclmgrd")
|
||||||
|
ret = caclmgrd_daemon.generate_allow_internal_chasis_midplane_traffic('')
|
||||||
|
self.assertListEqual(test_data["return"], ret)
|
@ -0,0 +1,15 @@
|
|||||||
|
from unittest.mock import call
|
||||||
|
|
||||||
|
"""
|
||||||
|
caclmgrd chassis midplane test vector
|
||||||
|
"""
|
||||||
|
CACLMGRD_CHASSIS_MIDPLANE_TEST_VECTOR = [
|
||||||
|
[
|
||||||
|
"Allow chassis midlane traffic",
|
||||||
|
{
|
||||||
|
"return": [
|
||||||
|
"iptables -A INPUT -i eth1-midplane -j ACCEPT"
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
]
|
Reference in New Issue
Block a user