diff options
-rw-r--r-- | interface-definitions/include/nat-outbound-interface.xml.i | 8 | ||||
-rw-r--r-- | interface-definitions/nat.xml.in | 81 | ||||
-rwxr-xr-x | src/conf_mode/nat.py | 10 |
3 files changed, 90 insertions, 9 deletions
diff --git a/interface-definitions/include/nat-outbound-interface.xml.i b/interface-definitions/include/nat-outbound-interface.xml.i new file mode 100644 index 000000000..d562f7f03 --- /dev/null +++ b/interface-definitions/include/nat-outbound-interface.xml.i @@ -0,0 +1,8 @@ +<leafNode name="outbound-interface"> + <properties> + <help>Outbound interface of NAT traffic</help> + <completionHelp> + <script>${vyos_completion_dir}/list_interfaces.py</script> + </completionHelp> + </properties> +</leafNode> diff --git a/interface-definitions/nat.xml.in b/interface-definitions/nat.xml.in index af9dd1eff..a0b3b815b 100644 --- a/interface-definitions/nat.xml.in +++ b/interface-definitions/nat.xml.in @@ -52,22 +52,87 @@ </tagNode> </children> </node> - <node name="source"> + <node name="nptv6"> <properties> - <help>Source NAT settings</help> + <help>IPv6-to-IPv6 Network Prefix Translation Settings</help> </properties> <children> - #include <include/nat-rule.xml.i> <tagNode name="rule"> + <properties> + <help>NPTv6 rule number</help> + <valueHelp> + <format>1-9999</format> + <description>Number for this rule</description> + </valueHelp> + <constraint> + <validator name="numeric" argument="--range 1-9999"/> + </constraint> + <constraintErrorMessage>NAT rule number must be between 1 and 9999</constraintErrorMessage> + </properties> <children> - <leafNode name="outbound-interface"> + <leafNode name="description"> <properties> - <help>Outbound interface of NAT traffic</help> - <completionHelp> - <script>${vyos_completion_dir}/list_interfaces.py</script> - </completionHelp> + <help>Rule description</help> </properties> </leafNode> + <leafNode name="disable"> + <properties> + <help>Disable NAT rule</help> + <valueless/> + </properties> + </leafNode> + #include <include/nat-outbound-interface.xml.i> + <node name="source"> + <properties> + <help>IPv6 source prefix options</help> + </properties> + <children> + <leafNode name="prefix"> + <properties> + <help>IPv6 prefix to be translated</help> + <valueHelp> + <format>ipv6net</format> + <description>IPv6 prefix</description> + </valueHelp> + <constraint> + <validator name="ipv6-prefix"/> + </constraint> + </properties> + </leafNode> + </children> + </node> + <node name="translation"> + <properties> + <help>Translated IPv6 prefix options</help> + </properties> + <children> + <leafNode name="prefix"> + <properties> + <help>IPv6 prefix to translate to</help> + <valueHelp> + <format>ipv6net</format> + <description>IPv6 prefix</description> + </valueHelp> + <constraint> + <validator name="ipv6-prefix"/> + </constraint> + </properties> + </leafNode> + </children> + </node> + </children> + </tagNode> + </children> + </node> + <node name="source"> + <properties> + <help>Source NAT settings</help> + </properties> + <children> + #include <include/nat-rule.xml.i> + <tagNode name="rule"> + <children> + #include <include/nat-outbound-interface.xml.i> <node name="translation"> <properties> <help>Outside NAT IP (source NAT only)</help> diff --git a/src/conf_mode/nat.py b/src/conf_mode/nat.py index 5cb1af1f1..406ec1caf 100755 --- a/src/conf_mode/nat.py +++ b/src/conf_mode/nat.py @@ -102,8 +102,10 @@ def parse_source_destination(conf, source_dest): 'protocol': 'all', 'number': number, 'source_address': '', + 'source_prefix': '', 'source_port': '', 'translation_address': '', + 'translation_prefix': '', 'translation_port': '' } conf.set_level(base_level + ['rule', number]) @@ -138,12 +140,18 @@ def parse_source_destination(conf, source_dest): if conf.exists(['source', 'address']): rule['source_address'] = conf.return_value(['source', 'address']) + if conf.exists(['source', 'prefix']): + rule['source_prefix'] = conf.return_value(['source', 'prefix']) + if conf.exists(['source', 'port']): rule['source_port'] = conf.return_value(['source', 'port']) if conf.exists(['translation', 'address']): rule['translation_address'] = conf.return_value(['translation', 'address']) + if conf.exists(['translation', 'prefix']): + rule['translation_prefix'] = conf.return_value(['translation', 'prefix']) + if conf.exists(['translation', 'port']): rule['translation_port'] = conf.return_value(['translation', 'port']) @@ -193,7 +201,7 @@ def get_config(): # use a common wrapper function to read in the source / destination # tree from the config - thus we do not need to replicate almost the # same code :-) - for tgt in ['source', 'destination']: + for tgt in ['source', 'destination', 'nptv6']: nat[tgt] = parse_source_destination(conf, tgt) return nat |