diff options
| -rw-r--r-- | interface-definitions/firewall.xml.in | 43 | ||||
| -rw-r--r-- | python/vyos/firewall.py | 7 | ||||
| -rwxr-xr-x | smoketest/scripts/cli/test_firewall.py | 6 | 
3 files changed, 54 insertions, 2 deletions
| diff --git a/interface-definitions/firewall.xml.in b/interface-definitions/firewall.xml.in index 3250794d3..dea6ae79e 100644 --- a/interface-definitions/firewall.xml.in +++ b/interface-definitions/firewall.xml.in @@ -545,6 +545,49 @@                    #include <include/firewall/icmp-type-name.xml.i>                  </children>                </node> +              <node name="ttl"> +                <properties> +                  <help>Time to live limit</help> +                </properties> +                <children> +                  <leafNode name="eq"> +                    <properties> +                      <help>Value to match a ttl equal to it</help> +                      <valueHelp> +                        <format>u32:0-255</format> +                        <description>ttl equal to value</description> +                      </valueHelp> +                      <constraint> +                        <validator name="numeric" argument="--range 0-255"/> +                      </constraint> +                    </properties> +                  </leafNode> +                  <leafNode name="gt"> +                    <properties> +                      <help>Value to match a ttl greater than or equal to it</help> +                      <valueHelp> +                        <format>u32:0-255</format> +                        <description>ttl greater than value</description> +                      </valueHelp> +                      <constraint> +                        <validator name="numeric" argument="--range 0-255"/> +                      </constraint> +                    </properties> +                  </leafNode> +                  <leafNode name="lt"> +                    <properties> +                      <help>Value to match a ttl less than or equal to it</help> +                      <valueHelp> +                        <format>u32:0-255</format> +                        <description>ttl less than value</description> +                      </valueHelp> +                      <constraint> +                        <validator name="numeric" argument="--range 0-255"/> +                      </constraint> +                    </properties> +                  </leafNode> +                </children> +              </node>              </children>            </tagNode>          </children> diff --git a/python/vyos/firewall.py b/python/vyos/firewall.py index 31fe8b5e3..355ec44b0 100644 --- a/python/vyos/firewall.py +++ b/python/vyos/firewall.py @@ -231,6 +231,13 @@ def parse_rule(rule_conf, fw_name, rule_id, ip_name):                  value = rule_conf['hop_limit'][op]                  output.append(f'ip6 hoplimit {operator} {value}') +    if 'ttl' in rule_conf: +        operators = {'eq': '==', 'gt': '>', 'lt': '<'} +        for op, operator in operators.items(): +            if op in rule_conf['ttl']: +                value = rule_conf['ttl'][op] +                output.append(f'ip ttl {operator} {value}') +      for icmp in ['icmp', 'icmpv6']:          if icmp in rule_conf:              if 'type_name' in rule_conf[icmp]: diff --git a/smoketest/scripts/cli/test_firewall.py b/smoketest/scripts/cli/test_firewall.py index b1fd663d2..b78d6fffa 100755 --- a/smoketest/scripts/cli/test_firewall.py +++ b/smoketest/scripts/cli/test_firewall.py @@ -116,6 +116,7 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase):          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '1', 'destination', 'address', '172.16.10.10'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '1', 'log', 'enable'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '1', 'log-level', 'debug']) +        self.cli_set(['firewall', 'name', 'smoketest', 'rule', '1', 'ttl', 'eq', '15'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'action', 'reject'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'protocol', 'tcp'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'destination', 'port', '8888']) @@ -123,6 +124,7 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase):          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'log-level', 'err'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'tcp', 'flags', 'syn'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'tcp', 'flags', 'not', 'ack']) +        self.cli_set(['firewall', 'name', 'smoketest', 'rule', '2', 'ttl', 'gt', '102'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '3', 'action', 'accept'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '3', 'protocol', 'tcp'])          self.cli_set(['firewall', 'name', 'smoketest', 'rule', '3', 'destination', 'port', '22']) @@ -135,8 +137,8 @@ class TestFirewall(VyOSUnitTestSHIM.TestCase):          nftables_search = [              ['iifname "eth0"', 'jump NAME_smoketest'], -            ['saddr 172.16.20.10', 'daddr 172.16.10.10', 'log prefix "[smoketest-1-A]" level debug','return'], -            ['tcp flags & (syn | ack) == syn', 'tcp dport { 8888 }', 'log prefix "[smoketest-2-R]" level err', 'reject'], +            ['saddr 172.16.20.10', 'daddr 172.16.10.10', 'log prefix "[smoketest-1-A]" level debug', 'ip ttl 15','return'], +            ['tcp flags & (syn | ack) == syn', 'tcp dport { 8888 }', 'log prefix "[smoketest-2-R]" level err', 'ip ttl > 102', 'reject'],              ['tcp dport { 22 }', 'limit rate 5/minute', 'return'],              ['log prefix "[smoketest-default-D]"','smoketest default-action', 'drop']          ] | 
