summaryrefslogtreecommitdiff
path: root/lib/Vyatta
diff options
context:
space:
mode:
authorDaniil Baturin <daniil@vyos.io>2021-11-17 15:02:20 -0500
committerDaniil Baturin <daniil@vyos.io>2021-11-17 15:02:20 -0500
commit082f6459f131d0af2fa7a4ef0cf3028238ecc3af (patch)
tree57bd5d7bf67393614b161c558cbf90248abee79f /lib/Vyatta
parent86689760356508ad4d9f8a6c82cd5b803c529dce (diff)
downloadvyatta-nat-082f6459f131d0af2fa7a4ef0cf3028238ecc3af.tar.gz
vyatta-nat-082f6459f131d0af2fa7a4ef0cf3028238ecc3af.zip
T1083: add port and address mapping options
Diffstat (limited to 'lib/Vyatta')
-rw-r--r--lib/Vyatta/DstNatRule.pm20
-rw-r--r--lib/Vyatta/SrcNatRule.pm32
2 files changed, 51 insertions, 1 deletions
diff --git a/lib/Vyatta/DstNatRule.pm b/lib/Vyatta/DstNatRule.pm
index aa419e5..98ebd56 100644
--- a/lib/Vyatta/DstNatRule.pm
+++ b/lib/Vyatta/DstNatRule.pm
@@ -91,6 +91,10 @@ sub setup {
}
$self->{_inside_addr}->{_port}
= $config->returnValue("translation port");
+
+ $self->{_address_mapping} = $config->returnValue("translation options address-mapping");
+ $self->{_port_mapping} = $config->returnValue("translation options port-mapping");
+
$src->setup("$level source");
$dst->setup("$level destination");
@@ -122,6 +126,9 @@ sub setupOrig {
}
$self->{_inside_addr}->{_port}
= $config->returnOrigValue("translation port");
+
+ $self->{_address_mapping} = $config->returnOrigValue("translation options address-mapping");
+ $self->{_port_mapping} = $config->returnOrigValue("translation options port-mapping");
$src->setupOrig("$level source");
$dst->setupOrig("$level destination");
@@ -248,7 +255,18 @@ sub rule_str {
$jump_target = 'NETMAP';
$jump_param .= " $to_dst";
} else {
- $jump_param .= " $to_dst";
+ $jump_param .= " $to_dst";
+
+ my $addr_mapping = $self->{_address_mapping};
+ if(defined($addr_mapping)) {
+ if($addr_mapping eq "persistent") {
+ $jump_param .= " --persistent";
+ } elsif ($addr_mapping eq "random") {
+ # random is the default, do nothing
+ } else {
+ return ('address-mapping must be either "persistent" or "random"', undef);
+ }
+ }
}
} else {
return ("translation address not specified", undef);
diff --git a/lib/Vyatta/SrcNatRule.pm b/lib/Vyatta/SrcNatRule.pm
index dfb6f28..dac868e 100644
--- a/lib/Vyatta/SrcNatRule.pm
+++ b/lib/Vyatta/SrcNatRule.pm
@@ -94,6 +94,9 @@ sub setup {
$self->{_outside_addr}->{_port}
= $config->returnValue("translation port");
+ $self->{_address_mapping} = $config->returnValue("translation options address-mapping");
+ $self->{_port_mapping} = $config->returnValue("translation options port-mapping");
+
$src->setup("$level source");
$dst->setup("$level destination");
@@ -129,6 +132,9 @@ sub setupOrig {
$self->{_outside_addr}->{_port}
= $config->returnOrigValue("translation port");
+ $self->{_address_mapping} = $config->returnOrigValue("translation options address-mapping");
+ $self->{_port_mapping} = $config->returnOrigValue("translation options port-mapping");
+
$src->setupOrig("$level source");
$dst->setupOrig("$level destination");
@@ -268,13 +274,39 @@ sub rule_str {
} elsif ($to_src ne '') {
if (defined($self->{_is_masq})) {
$jump_param .= " --to-ports $to_src";
+
+ my $port_mapping = $self->{_port_mapping};
+ if(defined($port_mapping)) {
+ if($port_mapping eq "random") {
+ $jump_param .= " --random-fully";
+ } elsif ($port_mapping eq "none") {
+ # none is the deault, do nothing
+ } else {
+ return ('port-mapping must be either "random" or "none"', undef);
+ }
+ }
} else {
+ if(defined($self->{_port_mapping})) {
+ return ('port-mapping option is only valid for masquerade rules', undef);
+ }
+
if ($use_netmap) {
# replace "SNAT" with "NETMAP"
$jump_target = 'NETMAP';
$jump_param .= " --to $to_src";
} else {
$jump_param .= " --to-source $to_src";
+
+ my $addr_mapping = $self->{_address_mapping};
+ if(defined($addr_mapping)) {
+ if($addr_mapping eq "persistent") {
+ $jump_param .= " --persistent";
+ } elsif ($addr_mapping eq "random") {
+ # random is the default, do nothing
+ } else {
+ return ('address-mapping must be either "persistent" or "random"', undef);
+ }
+ }
}
}
} elsif (!defined($self->{_is_masq})) {