diff options
author | Viacheslav <v.gletenko@vyos.io> | 2021-09-06 18:06:14 +0000 |
---|---|---|
committer | Viacheslav <v.gletenko@vyos.io> | 2021-09-06 18:06:47 +0000 |
commit | a5093308eab24ae4f746f52ec8c283a93a1654f9 (patch) | |
tree | ad341da5767e0cb891adab3a5d81f4d66db7b142 /src | |
parent | 591eee82296b69b9d8ed49ca28683d0f016c85b8 (diff) | |
download | vyos-1x-a5093308eab24ae4f746f52ec8c283a93a1654f9.tar.gz vyos-1x-a5093308eab24ae4f746f52ec8c283a93a1654f9.zip |
tunnel: T2920: Add checks tun with same source addr and keys
2 tunnels with the same local-address should has different keys
Check existing tunnels (source-address key) with new tunnel.
Diffstat (limited to 'src')
-rwxr-xr-x | src/conf_mode/interfaces-tunnel.py | 23 |
1 files changed, 23 insertions, 0 deletions
diff --git a/src/conf_mode/interfaces-tunnel.py b/src/conf_mode/interfaces-tunnel.py index ccc4bad3d..22a9f0e18 100755 --- a/src/conf_mode/interfaces-tunnel.py +++ b/src/conf_mode/interfaces-tunnel.py @@ -18,6 +18,7 @@ import os from sys import exit from netifaces import interfaces +from ipaddress import IPv4Address from vyos.config import Config from vyos.configdict import dict_merge @@ -31,6 +32,7 @@ from vyos.configverify import verify_mtu_ipv6 from vyos.configverify import verify_vrf from vyos.configverify import verify_tunnel from vyos.ifconfig import Interface +from vyos.ifconfig import Section from vyos.ifconfig import TunnelIf from vyos.template import is_ipv4 from vyos.template import is_ipv6 @@ -80,6 +82,27 @@ def verify(tunnel): dict_search('parameters.ip.key', tunnel) == None: raise ConfigError('Tunnel parameters ip key must be set!') + if tunnel['encapsulation'] in ['gre', 'gretap']: + if dict_search('parameters.ip.key', tunnel) != None: + # Check pairs tunnel source-address/encapsulation/key with exists tunnels. + # Prevent the same key for 2 tunnels with same source-address/encap. T2920 + for tunnel_if in Section.interfaces('tunnel'): + tunnel_cfg = get_interface_config(tunnel_if) + exist_encap = tunnel_cfg['linkinfo']['info_kind'] + exist_source_address = tunnel_cfg['address'] + exist_key = tunnel_cfg['linkinfo']['info_data']['ikey'] + new_source_address = tunnel['source_address'] + # Convert tunnel key to ip key, format "ip -j link show" + # 1 => 0.0.0.1, 999 => 0.0.3.231 + orig_new_key = int(tunnel['parameters']['ip']['key']) + new_key = IPv4Address(orig_new_key) + new_key = str(new_key) + if tunnel['encapsulation'] == exist_encap and \ + new_source_address == exist_source_address and \ + new_key == exist_key: + raise ConfigError(f'Key "{orig_new_key}" for source-address "{new_source_address}" ' \ + f'is already used for tunnel "{tunnel_if}"!') + # Keys are not allowed with ipip and sit tunnels if tunnel['encapsulation'] in ['ipip', 'sit']: if dict_search('parameters.ip.key', tunnel) != None: |