summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorNataliia S. <81954790+natali-rs1985@users.noreply.github.com>2025-04-08 17:15:42 +0300
committerGitHub <noreply@github.com>2025-04-08 15:15:42 +0100
commit4d32bcddda72c1df944470f06b75908b2dc31667 (patch)
tree80fcf34ef72675d2ee5b2407b350f301a1382f81 /src
parent07a3b0f5ae87a2ab400390c9fa0ca632d7815e15 (diff)
downloadvyos-1x-4d32bcddda72c1df944470f06b75908b2dc31667.tar.gz
vyos-1x-4d32bcddda72c1df944470f06b75908b2dc31667.zip
T7315: Change CLI fot VPP NAT (#25)
New CLI ``` set vpp nat44 static rule 10 outside-interface 'eth0' set vpp nat44 static rule 10 inside-interface 'eth1' set vpp nat44 static rule 10 external address 192.168.122.10 set vpp nat44 static rule 10 external port 6545 # optional set vpp nat44 static rule 10 protocol tcp|udp|icmp|all # optional, defaults to "all" set vpp nat44 static rule 10 local address 100.64.0.10 set vpp nat44 static rule 10 local port 64010 # optional ```
Diffstat (limited to 'src')
-rw-r--r--src/conf_mode/vpp_nat_source.py10
-rw-r--r--src/conf_mode/vpp_nat_static.py63
-rw-r--r--src/op_mode/show_vpp_nat44.py27
3 files changed, 43 insertions, 57 deletions
diff --git a/src/conf_mode/vpp_nat_source.py b/src/conf_mode/vpp_nat_source.py
index 2e1884c3a..40b16a3c8 100644
--- a/src/conf_mode/vpp_nat_source.py
+++ b/src/conf_mode/vpp_nat_source.py
@@ -61,7 +61,7 @@ def verify(config):
if 'remove' in config:
return None
- required_keys = {'inbound_interface', 'outbound_interface'}
+ required_keys = {'inside_interface', 'outside_interface'}
if not all(key in config for key in required_keys):
missing_keys = required_keys - set(config.keys())
raise ConfigError(
@@ -83,8 +83,8 @@ def apply(config):
# Delete NAT source
if 'effective' in config:
remove_config = config.get('effective')
- interface_in = remove_config.get('inbound_interface')
- interface_out = remove_config.get('outbound_interface')
+ interface_in = remove_config.get('inside_interface')
+ interface_out = remove_config.get('outside_interface')
translation_address = remove_config.get('translation', {}).get('address')
n = Nat44(interface_in, interface_out, translation_address)
@@ -96,8 +96,8 @@ def apply(config):
return None
# Add NAT44
- interface_in = config.get('inbound_interface')
- interface_out = config.get('outbound_interface')
+ interface_in = config.get('inside_interface')
+ interface_out = config.get('outside_interface')
translation_address = config.get('translation', {}).get('address')
n = Nat44(interface_in, interface_out, translation_address)
diff --git a/src/conf_mode/vpp_nat_static.py b/src/conf_mode/vpp_nat_static.py
index 50384a00b..b890ea150 100644
--- a/src/conf_mode/vpp_nat_static.py
+++ b/src/conf_mode/vpp_nat_static.py
@@ -86,12 +86,12 @@ def get_config(config=None) -> dict:
expand_nodes=Diff.DELETE | Diff.ADD,
)
- if 'inbound_interface' in tmp:
- new, old = diff.get_value_diff(base_rule + ['inbound-interface'])
+ if 'inside_interface' in tmp:
+ new, old = diff.get_value_diff(base_rule + ['inside-interface'])
in_iface_add.append(new) if new else None
in_iface_del.append(old) if old else None
- if 'outbound_interface' in tmp:
- new, old = diff.get_value_diff(base_rule + ['outbound-interface'])
+ if 'outside_interface' in tmp:
+ new, old = diff.get_value_diff(base_rule + ['outside-interface'])
out_iface_add.append(new) if new else None
out_iface_del.append(old) if old else None
@@ -120,7 +120,7 @@ def verify(config):
if 'remove' in config:
return None
- required_keys = {'inbound_interface', 'outbound_interface'}
+ required_keys = {'inside_interface', 'outside_interface'}
for rule, rule_config in config['rule'].items():
missing_keys = required_keys - rule_config.keys()
if missing_keys:
@@ -128,13 +128,16 @@ def verify(config):
f"Required options are missing: {', '.join(missing_keys).replace('_', '-')} in rule {rule}"
)
- if not rule_config.get('translation', {}).get('address'):
- raise ConfigError(f'Translation requires address in rule {rule}')
+ if not rule_config.get('local', {}).get('address'):
+ raise ConfigError(f'Local settings require address in rule {rule}')
- has_dest_port = 'port' in rule_config.get('destination', {})
- has_trans_port = 'port' in rule_config.get('translation', {})
+ if not rule_config.get('external', {}).get('address'):
+ raise ConfigError(f'External settings require address in rule {rule}')
- if not has_trans_port == has_dest_port:
+ has_local_port = 'port' in rule_config.get('local', {})
+ has_external_port = 'port' in rule_config.get('external', {})
+
+ if not has_external_port == has_local_port:
raise ConfigError(
'Source and destination ports must either both be specified, or neither must be specified'
)
@@ -147,28 +150,22 @@ def generate(config):
def apply(config):
n = Nat44Static()
- # Delete inbound interfaces
+ # Delete inside interfaces
for interface in config['in_iface_del']:
- n.delete_inbound_interface(interface)
- # Delete outbound interfaces
+ n.delete_inside_interface(interface)
+ # Delete outside interfaces
for interface in config['out_iface_del']:
- n.delete_outbound_interface(interface)
+ n.delete_outside_interface(interface)
# Delete NAT static mapping rules
for rule in config['changed_rules']:
if rule in config.get('effective', {}).get('rule', {}):
rule_config = config['effective']['rule'][rule]
n.delete_nat44_static_mapping(
- iface_out=rule_config.get('outbound_interface'),
- local_ip=rule_config.get('translation').get('address'),
- external_ip=rule_config.get('destination', {}).get('address', ''),
- local_port=int(rule_config.get('translation', {}).get('port', 0)),
- external_port=int(rule_config.get('destination', {}).get('port', 0)),
+ local_ip=rule_config.get('local').get('address'),
+ external_ip=rule_config.get('external', {}).get('address', ''),
+ local_port=int(rule_config.get('local', {}).get('port', 0)),
+ external_port=int(rule_config.get('external', {}).get('port', 0)),
protocol=protocol_map[rule_config.get('protocol', 'all')],
- use_iface=(
- True
- if not rule_config.get('destination', {}).get('address')
- else False
- ),
)
if 'remove' in config:
@@ -177,24 +174,18 @@ def apply(config):
# Add NAT44 static mapping rules
n.enable_nat44_ed()
for interface in config['in_iface_add']:
- n.add_inbound_interface(interface)
+ n.add_inside_interface(interface)
for interface in config['out_iface_add']:
- n.add_outbound_interface(interface)
+ n.add_outside_interface(interface)
for rule in config['changed_rules']:
if rule in config.get('rule', {}):
rule_config = config['rule'][rule]
n.add_nat44_static_mapping(
- iface_out=rule_config.get('outbound_interface'),
- local_ip=rule_config.get('translation').get('address'),
- external_ip=rule_config.get('destination', {}).get('address', ''),
- local_port=int(rule_config.get('translation', {}).get('port', 0)),
- external_port=int(rule_config.get('destination', {}).get('port', 0)),
+ local_ip=rule_config.get('local').get('address'),
+ external_ip=rule_config.get('external', {}).get('address', ''),
+ local_port=int(rule_config.get('local', {}).get('port', 0)),
+ external_port=int(rule_config.get('external', {}).get('port', 0)),
protocol=protocol_map[rule_config.get('protocol', 'all')],
- use_iface=(
- True
- if not rule_config.get('destination', {}).get('address')
- else False
- ),
)
diff --git a/src/op_mode/show_vpp_nat44.py b/src/op_mode/show_vpp_nat44.py
index 1aae8164e..fcf28f76a 100644
--- a/src/op_mode/show_vpp_nat44.py
+++ b/src/op_mode/show_vpp_nat44.py
@@ -116,27 +116,22 @@ def _get_raw_output_static_rules(vpp_api):
return rules_list
-def _get_formatted_output_rules(vpp, rules_list):
+def _get_formatted_output_rules(rules_list):
data_entries = []
for rule in rules_list:
- dest_address = rule.get('external_ip_address')
- dest_port = rule.get('external_port') or ''
- trans_address = rule.get('local_ip_address')
- trans_port = rule.get('local_port') or ''
+ external_address = rule.get('external_ip_address')
+ external_port = rule.get('external_port') or ''
+ local_address = rule.get('local_ip_address')
+ local_port = rule.get('local_port') or ''
protocol = protocol_map[rule.get('protocol', 0)]
- dest_sh_if_index = rule.get('external_sw_if_index')
- vpp_if_name = vpp.get_interface_name(dest_sh_if_index)
- if vpp_if_name:
- dest_address = vpp_if_name
-
- values = [dest_address, dest_port, trans_address, trans_port, protocol]
+ values = [external_address, external_port, local_address, local_port, protocol]
data_entries.append(values)
headers = [
- 'Des_address/interface',
- 'Dest_port',
- 'Trans_address',
- 'Trans_port',
+ 'External address',
+ 'External port',
+ 'Local address',
+ 'Local port',
'Protocol',
]
out = sorted(data_entries, key=lambda x: x[2])
@@ -170,7 +165,7 @@ def show_static(raw: bool):
return rules_list
else:
- return _get_formatted_output_rules(vpp, rules_list)
+ return _get_formatted_output_rules(rules_list)
if __name__ == '__main__':