diff options
author | Christian Breunig <christian@breunig.cc> | 2024-09-30 17:27:17 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-09-30 17:27:17 +0200 |
commit | e663fc49edc3043d63b648b482b633c1ff233ac4 (patch) | |
tree | df2ba35456a772222de1dd475d8ff21faf883571 /python | |
parent | 2cd0baa50e244529462e3aed064b923c6cbab859 (diff) | |
parent | 8dcb042bb2352717395ba3c17bc5437534c83af5 (diff) | |
download | vyos-1x-e663fc49edc3043d63b648b482b633c1ff233ac4.tar.gz vyos-1x-e663fc49edc3043d63b648b482b633c1ff233ac4.zip |
Merge pull request #4113 from vyos/mergify/bp/circinus/pr-4024
T6687: add fqdn support to nat rules. (backport #4024)
Diffstat (limited to 'python')
-rwxr-xr-x | python/vyos/firewall.py | 47 | ||||
-rw-r--r-- | python/vyos/nat.py | 7 |
2 files changed, 33 insertions, 21 deletions
diff --git a/python/vyos/firewall.py b/python/vyos/firewall.py index 8913ba152..fe4326807 100755 --- a/python/vyos/firewall.py +++ b/python/vyos/firewall.py @@ -50,25 +50,32 @@ def conntrack_required(conf): # Domain Resolver -def fqdn_config_parse(firewall): - firewall['ip_fqdn'] = {} - firewall['ip6_fqdn'] = {} - - for domain, path in dict_search_recursive(firewall, 'fqdn'): - hook_name = path[1] - priority = path[2] - - fw_name = path[2] - rule = path[4] - suffix = path[5][0] - set_name = f'{hook_name}_{priority}_{rule}_{suffix}' - - if (path[0] == 'ipv4') and (path[1] == 'forward' or path[1] == 'input' or path[1] == 'output' or path[1] == 'name'): - firewall['ip_fqdn'][set_name] = domain - elif (path[0] == 'ipv6') and (path[1] == 'forward' or path[1] == 'input' or path[1] == 'output' or path[1] == 'name'): - if path[1] == 'name': - set_name = f'name6_{priority}_{rule}_{suffix}' - firewall['ip6_fqdn'][set_name] = domain +def fqdn_config_parse(config, node): + config['ip_fqdn'] = {} + config['ip6_fqdn'] = {} + + for domain, path in dict_search_recursive(config, 'fqdn'): + if node != 'nat': + hook_name = path[1] + priority = path[2] + + rule = path[4] + suffix = path[5][0] + set_name = f'{hook_name}_{priority}_{rule}_{suffix}' + + if (path[0] == 'ipv4') and (path[1] == 'forward' or path[1] == 'input' or path[1] == 'output' or path[1] == 'name'): + config['ip_fqdn'][set_name] = domain + elif (path[0] == 'ipv6') and (path[1] == 'forward' or path[1] == 'input' or path[1] == 'output' or path[1] == 'name'): + if path[1] == 'name': + set_name = f'name6_{priority}_{rule}_{suffix}' + config['ip6_fqdn'][set_name] = domain + else: + # Parse FQDN for NAT + nat_direction = path[0] + nat_rule = path[2] + suffix = path[3][0] + set_name = f'{nat_direction}_{nat_rule}_{suffix}' + config['ip_fqdn'][set_name] = domain def fqdn_resolve(fqdn, ipv6=False): try: @@ -77,8 +84,6 @@ def fqdn_resolve(fqdn, ipv6=False): except: return None -# End Domain Resolver - def find_nftables_rule(table, chain, rule_matches=[]): # Find rule in table/chain that matches all criteria and return the handle results = cmd(f'sudo nft --handle list chain {table} {chain}').split("\n") diff --git a/python/vyos/nat.py b/python/vyos/nat.py index e54548788..4fe21ef13 100644 --- a/python/vyos/nat.py +++ b/python/vyos/nat.py @@ -236,6 +236,13 @@ def parse_nat_rule(rule_conf, rule_id, nat_type, ipv6=False): output.append(f'{proto} {prefix}port {operator} @P_{group_name}') + if 'fqdn' in side_conf: + fqdn = side_conf['fqdn'] + operator = '' + if fqdn[0] == '!': + operator = '!=' + output.append(f' ip {prefix}addr {operator} @FQDN_nat_{nat_type}_{rule_id}_{prefix}') + output.append('counter') if 'log' in rule_conf: |