Page Menu
Home
VyOS Platform
Search
Configure Global Search
Log In
Files
F117520619
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Size
9 KB
Referenced Files
None
Subscribers
None
View Options
diff --git a/data/templates/firewall/nftables-nat.tmpl b/data/templates/firewall/nftables-nat.tmpl
index 5ce110d82..abb32ddc6 100644
--- a/data/templates/firewall/nftables-nat.tmpl
+++ b/data/templates/firewall/nftables-nat.tmpl
@@ -1,177 +1,139 @@
#!/usr/sbin/nft -f
# Start with clean NAT table
flush table nat
{% if helper_functions == 'remove' %}
{# NAT if going to be disabled - remove rules and targets from nftables #}
{% set base_command = "delete rule ip raw" %}
{{ base_command }} PREROUTING handle {{ pre_ct_ignore }}
{{ base_command }} OUTPUT handle {{ out_ct_ignore }}
{{ base_command }} PREROUTING handle {{ pre_ct_conntrack }}
{{ base_command }} OUTPUT handle {{ out_ct_conntrack }}
delete chain ip raw NAT_CONNTRACK
{% elif helper_functions == 'add' %}
{# NAT if enabled - add targets to nftables #}
add chain ip raw NAT_CONNTRACK
add rule ip raw NAT_CONNTRACK counter accept
{% set base_command = "add rule ip raw" %}
{{ base_command }} PREROUTING position {{ pre_ct_ignore }} counter jump VYATTA_CT_HELPER
{{ base_command }} OUTPUT position {{ out_ct_ignore }} counter jump VYATTA_CT_HELPER
{{ base_command }} PREROUTING position {{ pre_ct_conntrack }} counter jump NAT_CONNTRACK
{{ base_command }} OUTPUT position {{ out_ct_conntrack }} counter jump NAT_CONNTRACK
{% endif %}
-#
-# Destination NAT rules build up here
-#
-{% for r in destination if not r.disabled -%}
-{% set chain = "PREROUTING" %}
-{% set src_addr = "ip saddr " + r.source_address if r.source_address %}
-{% set src_port = "sport { " + r.source_port +" }" if r.source_port %}
-{% set dst_addr = "ip daddr " + r.dest_address if r.dest_address %}
-{% set dst_port = "dport { " + r.dest_port +" }" if r.dest_port %}
-{% set trns_addr = "dnat to " + r.translation_address %}
-{% set trns_port = ":" + r.translation_port if r.translation_port %}
-{% set interface = " iifname \"" + r.interface_in + "\"" %}
-{% set comment = "DST-NAT-" + r.number %}
-
-{% if r.protocol == "tcp_udp" %}
+{% macro nat_rule(rule, chain) %}
+{% set src_addr = "ip saddr " + rule.source_address if rule.source_address %}
+{% set src_port = "sport { " + rule.source_port +" }" if rule.source_port %}
+{% set dst_addr = "ip daddr " + rule.dest_address if rule.dest_address %}
+{% set dst_port = "dport { " + rule.dest_port +" }" if rule.dest_port %}
+{% set comment = "DST-NAT-" + rule.number %}
+
+{% if chain == "PREROUTING" %}
+{% set interface = " iifname \"" + rule.interface_in + "\"" %}
+{% set trns_addr = "dnat to " + rule.translation_address %}
+{% elif chain == "POSTROUTING" %}
+{% set interface = " oifname \"" + rule.interface_out + "\"" %}
+{% set trns_addr = rule.translation_address %}
+{% if rule.translation_address != 'masquerade' %}
+{% set trns_addr = "snat to " + trns_addr %}
+{% endif %}
+{% endif %}
+{% set trns_port = ":" + rule.translation_port if rule.translation_port %}
+
+{% if rule.protocol == "tcp_udp" %}
{% set protocol = "tcp" %}
{% set comment = comment + " tcp_udp" %}
{% else %}
-{% set protocol = r.protocol %}
+{% set protocol = rule.protocol %}
{% endif %}
-{% if r.log %}
-{% set base_log = "[NAT-DST-" + r.number %}
-{% if r.exclude %}
+{% if rule.log %}
+{% set base_log = "[NAT-DST-" + rule.number %}
+{% if rule.exclude %}
{% set log = base_log + "-EXCL]" %}
-{% elif r.translation_address == 'masquerade' %}
+{% elif rule.translation_address == 'masquerade' %}
{% set log = base_log + "-MASQ]" %}
{% else %}
{% set log = base_log + "]" %}
{% endif %}
{% endif %}
-{% if r.exclude %}
+{% if rule.exclude %}
{# rule has been marked as "exclude" thus we simply return here #}
{% set trns_addr = "return" %}
{% set trns_port = "" %}
{% endif %}
-{% set output = "add rule ip nat " + chain + interface + " counter" %}
-{% set output = output + " comment \"" + comment + "\"" %}
+{% set output = "add rule ip nat " + chain + interface %}
+
+{% if protocol != "all" %}
+{% set output = output + " ip protocol " + protocol %}
+{% endif %}
{% if src_addr %}
{% set output = output + " " + src_addr %}
{% endif %}
-
{% if src_port %}
-{% set output = output + " " + src_port %}
+{% set output = output + " " + protocol + " " + src_port %}
{% endif %}
{% if dst_addr %}
{% set output = output + " " + dst_addr %}
{% endif %}
-
{% if dst_port %}
{% set output = output + " " + protocol + " " + dst_port %}
-{% else %}
-{% set output = output + " ip protocol " + protocol %}
{% endif %}
+{# Count packets #}
+{% set output = output + " counter" %}
+
{# Special handling of log option, we must repeat the entire rule before the #}
{# NAT translation options are added, this is essential #}
{% if log %}
-{% set log_output = output + " log prefix \"" + log + "\"" %}
+{% set log_output = output + " log prefix \"" + log + "\" comment \"" + comment + "\"" %}
{% endif %}
{% if trns_addr %}
{% set output = output + " " + trns_addr %}
{% endif %}
{% if trns_port %}
{# Do not add a whitespace here, translation port must be directly added after IP address #}
{# e.g. 192.0.2.10:3389 #}
{% set output = output + trns_port %}
{% endif %}
+{% if comment %}
+{% set output = output + " comment \"" + comment + "\"" %}
+{% endif %}
+
{{ log_output if log_output }}
{{ output }}
{# Special handling if protocol is tcp_udp, we must repeat the entire rule with udp as protocol #}
-{% if r.protocol == "tcp_udp" %}
+{% if rule.protocol == "tcp_udp" %}
{# Beware of trailing whitespace, without it the comment tcp_udp will be changed to udp_udp #}
{{ log_output | replace("tcp ", "udp ") if log_output }}
{{ output | replace("tcp ", "udp ") }}
{% endif %}
-{% endfor %}
-
-
+{% endmacro %}
+#
+# Destination NAT rules build up here
+#
+{% for rule in destination if not rule.disabled -%}
+{{ nat_rule(rule, 'PREROUTING') }}
+{% endfor %}
#
# Source NAT rules build up here
#
-{% for r in source if not r.disabled -%}
-{% set chain = "POSTROUTING" %}
-{% set src_addr = "ip saddr " + r.source_address if r.source_address %}
-{% set src_port = "sport { " + r.source_port +" }" if r.source_port %}
-{% set dst_addr = "ip daddr " + r.dest_address if r.dest_address %}
-{% set dst_port = "dport { " + r.dest_port +" }" if r.dest_port %}
-{% set trns_addr = "snat to " + r.translation_address if r.translation_address != "masquerade" else "masquerade" %}
-{% set trns_port = ":" + r.translation_port if r.translation_port %}
-{% set comment = "SRC-NAT-" + r.number %}
-{% set iface = r.interface_out %}
-
-{% if r.log %}
-{% if r.exclude %}
-{% set log = "[" + comment + "-EXCL]" %}
-{% elif r.translation_address == 'masquerade' %}
-{% set log = "[" + comment + "-MASQ]" %}
-{% else %}
-{% set log = "[" + comment + "]" %}
-{% endif %}
-{% endif %}
-
-{% if r.exclude %}
-{# rule has been marked as "exclude" thus we simply return here #}
-{% set trns_addr = "return" %}
-{% set trns_port = "" %}
-{% endif %}
-
-{% if r.protocol == 'tcp_udp' %}
-{# Special handling for protocol tcp_udp which is represented as two individual rules #}
-{% set comment = comment + " tcp_udp" %}
-{% if log %}
-
-{% set tcp_dst_port = "tcp " + dst_port if dst_port else "ip protocol tcp" %}
-{% set udp_dst_port = "udp " + dst_port if dst_port else "ip protocol udp" %}
-{% set tcp_src_port = "tcp " + src_port if src_port %}
-{% set udp_src_port = "udp " + src_port if src_port %}
-
-add rule ip nat {{ chain }} oifname "{{ iface }}" {{ tcp_src_port }} {{ src_port }} {{ tcp_dst_port }} {{ dst_addr }} counter log prefix "{{ log }}" comment "{{ comment }}"
-{% endif %}
-add rule ip nat {{ chain }} oifname "{{ iface }}" {{ tcp_src_port }} {{ src_port }} {{ tcp_dst_port }} {{ dst_addr }} counter {{ trns_addr }}{{ trns_port }} comment "{{ comment }}"
-{% if log %}
-add rule ip nat {{ chain }} oifname "{{ iface }}" {{ udp_src_port }} {{ src_port }} {{ udp_dst_port }} {{ dst_addr }} counter log prefix "{{ log }}" comment "{{ comment }}"
-{% endif %}
-add rule ip nat {{ chain }} oifname "{{ iface }}" {{ udp_src_port }} {{ src_port }} {{ udp_dst_port }} {{ dst_addr }} counter {{ trns_addr }}{{ trns_port }} comment "{{ comment }}"
-
-{% else %}
-{% set proto_dst_port = dst_port if dst_port else "ip protocol " + r.protocol %}
-{% set proto_dst_port = proto_dst_port if r.protocol != "all" %}
-{% set proto_src_port = r.protocol + " " + src_port if r.protocol != "all" else src_port %}
-
-{% if log %}
-add rule ip nat {{ chain }} oifname "{{ iface }}" {{ src_addr }} {{ proto_src_port }} {{ proto_dst_port }} {{ dst_addr }} counter log prefix "{{ log }}" comment "{{ comment }}"
-{% endif %}
-add rule ip nat {{ chain }} oifname "{{ iface }}" {{ src_addr }} {{ proto_src_port }} {{ proto_dst_port }} {{ dst_addr }} counter {{ trns_addr }}{{ trns_port }} comment "{{ comment }}"
-{% endif %}
+{% for rule in source if not rule.disabled -%}
+{{ nat_rule(rule, 'POSTROUTING') }}
{% endfor %}
File Metadata
Details
Attached
Mime Type
text/x-diff
Expires
Sat, Sep 26, 11:19 AM (1 d, 20 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
4285030
Default Alt Text
(9 KB)
Attached To
Mode
rVYOSONEX vyos-1x
Attached
Detach File
Event Timeline
Log In to Comment