diff options
| author | Yuriy Andamasov <yuriy@vyos.io> | 2026-05-06 18:46:21 +0300 |
|---|---|---|
| committer | Yuriy Andamasov <yuriy@vyos.io> | 2026-05-06 18:46:21 +0300 |
| commit | 88957530a3e174bfc61e8358cb2b28fd8f1fbbb6 (patch) | |
| tree | 22b30d717e61a573a3712efec8a60f3e6b409d97 /docs/configuration/firewall | |
| parent | c784d8880325f96423fdd2c558750cac4313a56e (diff) | |
| download | vyos-documentation-88957530a3e174bfc61e8358cb2b28fd8f1fbbb6.tar.gz vyos-documentation-88957530a3e174bfc61e8358cb2b28fd8f1fbbb6.zip | |
feat: import MyST swap mechanism + content for sagitta (replaces #1886)
Replaces the broken #1886 with a fresh, properly-converted MyST set for
the sagitta (1.4.x) docs, mirroring what landed for circinus via #1897.
This PR:
- Re-imports 210 md-*.md files for sagitta. Source: ran the pipelines
rst-to-myst converter (chrisjsewell/rst-to-myst v0.4.0, with pandoc
fallback) on sagittas RST. Post-processed via the pipelines
postprocess stage (10 ordered fixes for blanks, admonitions, label
hyphens, pandoc artifacts, structural blanks, linter markers).
Compared to the broken #1886 content (which was left over from an
earlier stage-1-only run): zero raw `<div class=>` remnants.
- For 23 stems where sagittas RST is byte-identical with currents RST
(mostly stable policy/protocol pages and the 404 page), reuses currents
already-validated md-*.md content rather than re-converting.
- Drops cli and installation/cloud/aws from sagittas swap set: their
RST has SEVERE/4 "Title level inconsistent" errors that crash
rst-to-myst; they need an independent RST-source fix and are kept as
RST-only for now.
- Adds the per-page swap mechanism: scripts/swap_sources.py,
scripts/import_myst.py, the matching tests under tests/, _swap.txt
with 210 stems, _ext/vyos.py MyST renderer fallback, Makefile
swap-wrapped targets, .readthedocs.yml swap pre/post hooks.
- Adds 187 .webp images and removes 235 superseded .jpg/.png/.jpeg
static assets; flips html_logo to vyos-logo.webp.
- Adds the MyST swap-related blocks to docs/conf.py only:
myst_enable_extensions, myst_fence_as_directive, md-*.md exclude
patterns, _swap_exclude.txt reader, _prefer_webp and _copy_md_sources
setup hooks. github_version fallback set to 'sagitta' to match the
branch (parallel to currents 'current' and circinuss 'circinus').
Deliberately excluded (per user direction):
- llms.txt and sphinx-llms-txt / sphinx-sitemap config: these will
land separately for sagitta via #1870 plus a new sagitta-specific
llms.txt template PR. The conf.py here does not pull those extensions
in, so the build does not depend on the new pip packages.
Verification before pushing:
- 210 md-*.md = 210 _swap.txt stems = 210 RST siblings on sagitta (1:1:1).
- 0 files contain raw `<div class=` (the breakage that took down /en/1.5/).
- conf.py copyright/version/release preserve sagittas values
(2024 / 1.4 / "1.4.x (sagitta)") - not currents.
- html_title from currents conf.py removed - PR #1880 is the right place
for sagittas branch-localized title.
Supersedes / closes on merge:
- #1886 (broken converter output, would break /en/1.4/ if merged).
Generated by robots https://vyos.io
Diffstat (limited to 'docs/configuration/firewall')
| -rw-r--r-- | docs/configuration/firewall/md-bridge.md | 543 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-flowtables.md | 195 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-global-options.md | 187 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-groups.md | 495 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-index.md | 181 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-ipv4.md | 2037 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-ipv6.md | 2026 | ||||
| -rw-r--r-- | docs/configuration/firewall/md-zone.md | 177 |
8 files changed, 5841 insertions, 0 deletions
diff --git a/docs/configuration/firewall/md-bridge.md b/docs/configuration/firewall/md-bridge.md new file mode 100644 index 00000000..ebb9287d --- /dev/null +++ b/docs/configuration/firewall/md-bridge.md @@ -0,0 +1,543 @@ +--- +lastproofread: '2023-11-08' +--- + +(firewall-configuration)= + +# Bridge Firewall Configuration + +:::{note} +**Documentation under development** +::: + +## Overview + +In this section there's useful information of all firewall configuration that +can be done regarding bridge, and appropiate op-mode commands. +Configuration commands covered in this section: + +```{eval-rst} +.. cfgcmd:: set firewall bridge ... +``` + +From main structure defined in {doc}`Firewall Overview</configuration/firewall/index>` +in this section you can find detailed information only for the next part +of the general structure: + +```none +- set firewall + * bridge + - forward + + filter + - name + + custom_name +``` + +Traffic which is received by the router on an interface which is member of a +bridge is processed on the **Bridge Layer**. A simplified packet flow diagram +for this layer is shown next: + +:::{figure} /_static/images/firewall-bridge-packet-flow.png +::: + +For traffic that needs to be forwared internally by the bridge, base chain is +is **forward**, and it's base command for filtering is `set firewall bridge +forward filter ...`, which happens in stage 4, highlightened with red color. + +Custom bridge firewall chains can be create with command `set firewall bridge +name <name> ...`. In order to use such custom chain, a rule with action jump, +and the appropiate target should be defined in a base chain. + +:::{note} +**Layer 3 bridge**: +When an IP address is assigned to the bridge interface, and if traffic +is sent to the router to this IP (for example using such IP as +default gateway), then rules defined for **bridge firewall** won't +match, and firewall analysis continues at **IP layer**. +::: + +## Bridge Rules + +For firewall filtering, firewall rules needs to be created. Each rule is +numbered, has an action to apply if the rule is matched, and the ability +to specify multiple criteria matchers. Data packets go through the rules +from 1 - 999999, so order is crucial. At the first match the action of the +rule will be executed. + +### Actions + +If a rule is defined, then an action must be defined for it. This tells the +firewall what to do if all criteria matchers defined for such rule do match. + +In firewall bridge rules, the action can be: + +> - `accept`: accept the packet. +> - `continue`: continue parsing next rule. +> - `drop`: drop the packet. +> - `jump`: jump to another custom chain. +> - `return`: Return from the current chain and continue at the next rule +> of the last chain. +> - `queue`: Enqueue packet to userspace. + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> action + [accept | continue | drop | jump | queue | return] +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> action + [accept | continue | drop | jump | queue | return] + + This required setting defines the action of the current rule. If action is + set to jump, then jump-target is also needed. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + queue <0-65535> + + To be used only when action is set to ``queue``. Use this command to specify + queue target to use. Queue range is also supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + queue-options bypass + + To be used only when action is set to ``queue``. Use this command to let + packet go through firewall when no userspace software is connected to the + queue. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + queue-options fanout + + To be used only when action is set to ``queue``. Use this command to + distribute packets between several queues. +``` + +Also, **default-action** is an action that takes place whenever a packet does +not match any rule in it's chain. For base chains, possible options for +**default-action** are **accept** or **drop**. + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> default-action + [accept | continue | drop | jump | queue | return] + + This set the default action of the rule-set if no rule matched a packet + criteria. If default-action is set to ``jump``, then + ``default-jump-target`` is also needed. Note that for base chains, default + action can only be set to ``accept`` or ``drop``, while on custom chain, + more actions are available. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> default-jump-target <text> + + To be used only when ``defult-action`` is set to ``jump``. Use this + command to specify jump target for default rule. +``` + +:::{note} +**Important note about default-actions:** +If default action for any base chain is not defined, then the default +action is set to **accept** for that chain. For custom chains, if default +action is not defined, then the default-action is set to **drop**. +::: + +### Firewall Logs + +Logging can be enable for every single firewall rule. If enabled, other +log options can be defined. + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> log + + Enable logging for the matched packet. If this configuration command is not + present, then log is not enabled. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> default-log + + Use this command to enable the logging of the default action on + the specified chain. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] + + Define log-level. Only applicable if rule log is enable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + log-options group <0-65535> + + Define log group to send message to. Only applicable if rule log is enable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + log-options snapshot-length <0-9000> + + Define length of packet payload to include in netlink message. Only + applicable if rule log is enable and log group is defined. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + log-options queue-threshold <0-65535> + + Define number of packets to queue inside the kernel before sending them to + userspace. Only applicable if rule log is enable and log group is defined. +``` + +### Firewall Description + +For reference, a description can be defined for every defined custom chain. + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> description <text> + + Provide a rule-set description to a custom firewall chain. +``` + +### Rule Status + +When defining a rule, it is enable by default. In some cases, it is useful to +just disable the rule, rather than removing it. + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> disable + + Command for disabling a rule but keep it in the configuration. +``` + +### Matching criteria + +There are a lot of matching criteria against which the packet can be tested. + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + destination mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + destination mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + source mac-address <mac-address> + + Match criteria based on source and/or destination mac-address. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + inbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + inbound-interface name <iface> + + Match based on inbound interface. Wilcard ``*`` can be used. + For example: ``eth2*``. Prepending character ``!`` for inverted matching + criteria is also supportd. For example ``!eth2`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + inbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + inbound-interface group <iface_group> + + Match based on inbound interface group. Prepending character ``!`` for + inverted matching criteria is also supportd. For example ``!IFACE_GROUP`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + outbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + outbound-interface name <iface> + + Match based on outbound interface. Wilcard ``*`` can be used. + For example: ``eth2*``. Prepending character ``!`` for inverted matching + criteria is also supportd. For example ``!eth2`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + outbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + outbound-interface group <iface_group> + + Match based on outbound interface group. Prepending character ``!`` for + inverted matching criteria is also supportd. For example ``!IFACE_GROUP`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + vlan id <0-4096> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + vlan id <0-4096> + + Match based on vlan ID. Range is also supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge forward filter rule <1-999999> + vlan priority <0-7> +``` + +```{eval-rst} +.. cfgcmd:: set firewall bridge name <name> rule <1-999999> + vlan priority <0-7> + + Match based on vlan priority(pcp). Range is also supported. +``` + +## Operation-mode Firewall + +### Rule-set overview + +In this section you can find all useful firewall op-mode commands. + +General commands for firewall configuration, counter and statiscits: + +```{eval-rst} +.. opcmd:: show firewall +``` + +```{eval-rst} +.. opcmd:: show firewall summary +``` + +```{eval-rst} +.. opcmd:: show firewall statistics +``` + +And, to print only bridge firewall information: + +```{eval-rst} +.. opcmd:: show firewall bridge +``` + +```{eval-rst} +.. opcmd:: show firewall bridge forward filter +``` + +```{eval-rst} +.. opcmd:: show firewall bridge forward filter rule <rule> +``` + +```{eval-rst} +.. opcmd:: show firewall bridge name <name> +``` + +```{eval-rst} +.. opcmd:: show firewall bridge name <name> rule <rule> +``` + +### Show Firewall log + +```{eval-rst} +.. opcmd:: show log firewall +``` + +```{eval-rst} +.. opcmd:: show log firewall bridge +``` + +```{eval-rst} +.. opcmd:: show log firewall bridge forward +``` + +```{eval-rst} +.. opcmd:: show log firewall bridge forward filter +``` + +```{eval-rst} +.. opcmd:: show log firewall bridge name <name> +``` + +```{eval-rst} +.. opcmd:: show log firewall bridge forward filter rule <rule> +``` + +```{eval-rst} +.. opcmd:: show log firewall bridge name <name> rule <rule> + + Show the logs of all firewall; show all bridge firewall logs; show all logs + for forward hook; show all logs for forward hook and priority filter; show + all logs for particular custom chain; show logs for specific Rule-Set. +``` + +### Example + +Configuration example: + +```none +set firewall bridge forward filter default-action 'drop' +set firewall bridge forward filter default-log +set firewall bridge forward filter rule 10 action 'continue' +set firewall bridge forward filter rule 10 inbound-interface name 'eth2' +set firewall bridge forward filter rule 10 vlan id '22' +set firewall bridge forward filter rule 20 action 'drop' +set firewall bridge forward filter rule 20 inbound-interface group 'TRUNK-RIGHT' +set firewall bridge forward filter rule 20 vlan id '60' +set firewall bridge forward filter rule 30 action 'jump' +set firewall bridge forward filter rule 30 jump-target 'TEST' +set firewall bridge forward filter rule 30 outbound-interface name '!eth1' +set firewall bridge forward filter rule 35 action 'accept' +set firewall bridge forward filter rule 35 vlan id '11' +set firewall bridge forward filter rule 40 action 'continue' +set firewall bridge forward filter rule 40 destination mac-address '66:55:44:33:22:11' +set firewall bridge forward filter rule 40 source mac-address '11:22:33:44:55:66' +set firewall bridge name TEST default-action 'accept' +set firewall bridge name TEST default-log +set firewall bridge name TEST rule 10 action 'continue' +set firewall bridge name TEST rule 10 log +set firewall bridge name TEST rule 10 vlan priority '0' +``` + +And op-mode commands: + +```none +vyos@BRI:~$ show firewall bridge +Rulesets bridge Information + +--------------------------------- +bridge Firewall "forward filter" + +Rule Action Protocol Packets Bytes Conditions +------- -------- ---------- --------- ------- --------------------------------------------------------------------- +10 continue all 0 0 iifname "eth2" vlan id 22 continue +20 drop all 0 0 iifname @I_TRUNK-RIGHT vlan id 60 +30 jump all 2130 170688 oifname != "eth1" jump NAME_TEST +35 accept all 2080 168616 vlan id 11 accept +40 continue all 0 0 ether daddr 66:55:44:33:22:11 ether saddr 11:22:33:44:55:66 continue +default drop all 0 0 + +--------------------------------- +bridge Firewall "name TEST" + +Rule Action Protocol Packets Bytes Conditions +------- -------- ---------- --------- ------- -------------------------------------------------- +10 continue all 2130 170688 vlan pcp 0 prefix "[bri-NAM-TEST-10-C]" continue +default accept all 2130 170688 + +vyos@BRI:~$ +vyos@BRI:~$ show firewall bridge name TEST +Ruleset Information + +--------------------------------- +bridge Firewall "name TEST" + +Rule Action Protocol Packets Bytes Conditions +------- -------- ---------- --------- ------- -------------------------------------------------- +10 continue all 2130 170688 vlan pcp 0 prefix "[bri-NAM-TEST-10-C]" continue +default accept all 2130 170688 + +vyos@BRI:~$ +``` + +Inspect logs: + +```none +vyos@BRI:~$ show log firewall bridge +Dec 05 14:37:47 kernel: [bri-NAM-TEST-10-C]IN=eth1 OUT=eth2 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=50:00:00:04:00:00 IPSRC=10.11.11.101 MACDST=00:00:00:00:00:00 IPDST=10.11.11.102 +Dec 05 14:37:48 kernel: [bri-NAM-TEST-10-C]IN=eth1 OUT=eth2 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=50:00:00:04:00:00 IPSRC=10.11.11.101 MACDST=00:00:00:00:00:00 IPDST=10.11.11.102 +Dec 05 14:37:49 kernel: [bri-NAM-TEST-10-C]IN=eth1 OUT=eth2 ARP HTYPE=1 PTYPE=0x0800 OPCODE=1 MACSRC=50:00:00:04:00:00 IPSRC=10.11.11.101 MACDST=00:00:00:00:00:00 IPDST=10.11.11.102 +... +vyos@BRI:~$ show log firewall bridge forward filter +Dec 05 14:42:22 kernel: [bri-FWD-filter-default-D]IN=eth2 OUT=eth1 MAC=33:33:00:00:00:16:50:00:00:06:00:00:86:dd SRC=0000:0000:0000:0000:0000:0000:0000:0000 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=96 TC=0 HOPLIMIT=1 FLOWLBL=0 PROTO=ICMPv6 TYPE=143 CODE=0 +Dec 05 14:42:22 kernel: [bri-FWD-filter-default-D]IN=eth2 OUT=eth1 MAC=33:33:00:00:00:16:50:00:00:06:00:00:86:dd SRC=0000:0000:0000:0000:0000:0000:0000:0000 DST=ff02:0000:0000:0000:0000:0000:0000:0016 LEN=96 TC=0 HOPLIMIT=1 FLOWLBL=0 PROTO=ICMPv6 TYPE=143 CODE=0 +``` diff --git a/docs/configuration/firewall/md-flowtables.md b/docs/configuration/firewall/md-flowtables.md new file mode 100644 index 00000000..bc9fc457 --- /dev/null +++ b/docs/configuration/firewall/md-flowtables.md @@ -0,0 +1,195 @@ +--- +lastproofread: '2024-06-20' +--- + +(firewall-flowtables-configuration)= + +# Flowtables Firewall Configuration + +:::{note} +**Documentation under development** +::: + +## Overview + +In this section there's useful information of all firewall configuration that +can be done regarding flowtables. + +```{eval-rst} +.. cfgcmd:: set firewall flowtables ... +``` + +From main structure defined in +{doc}`Firewall Overview</configuration/firewall/index>` +in this section you can find detailed information only for the next part +of the general structure: + +```none +- set firewall + * flowtable + - custom_flow_table + + ... +``` + +Flowtables allows you to define a fastpath through the flowtable datapath. +The flowtable supports for the layer 3 IPv4 and IPv6 and the layer 4 TCP +and UDP protocols. + +:::{figure} /_static/images/firewall-flowtable-packet-flow.png +::: + +Once the first packet of the flow successfully goes through the IP forwarding +path (black circles path), from the second packet on, you might decide to +offload the flow to the flowtable through your ruleset. The flowtable +infrastructure provides a rule action that allows you to specify when to add +a flow to the flowtable (On forward filtering, red circle number 6) + +A packet that finds a matching entry in the flowtable (flowtable hit) is +transmitted to the output netdevice, hence, packets bypass the classic IP +forwarding path and uses the **Fast Path** (orange circles path). The visible +effect is that you do not see these packets from any of the Netfilter +hooks coming after ingress. In case that there is no matching entry in the +flowtable (flowtable miss), the packet follows the classic IP forwarding path. + +:::{note} +**Flowtable Reference:** +<https://docs.kernel.org/networking/nf_flowtable.html> +::: + +## Flowtable Configuration + +In order to use flowtables, the minimal configuration needed includes: + +> - Create flowtable: create flowtable, which includes the interfaces +> that are going to be used by the flowtable. +> - Create firewall rule: create a firewall rule, setting action to +> `offload` and using desired flowtable for `offload-target`. + +Creating a flow table: + +```{eval-rst} +.. cfgcmd:: set firewall flowtable <flow_table_name> interface <iface> + + Define interfaces to be used in the flowtable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall flowtable <flow_table_name> description <text> +``` + +Provide a description to the flow table. + +```{eval-rst} +.. cfgcmd:: set firewall flowtable <flow_table_name> offload + <hardware | software> + + Define type of offload to be used by the flowtable: ``hardware`` or + ``software``. By default, ``software`` offload is used. +``` + +:::{note} +**Hardware offload:** should be supported by the NICs used. +::: + +Creating rules for using flow tables: + +```{eval-rst} +.. cfgcmd:: set firewall [ipv4 | ipv6] forward filter rule <1-999999> + action offload + + Create firewall rule in forward chain, and set action to ``offload``. +``` + +```{eval-rst} +.. cfgcmd:: set firewall [ipv4 | ipv6] forward filter rule <1-999999> + offload-target <flowtable> + + Create firewall rule in forward chain, and define which flowtbale + should be used. Only applicable if action is ``offload``. +``` + +## Configuration Example + +Things to be considred in this setup: + +> - Two interfaces are going to be used in the flowtables: eth0 and eth1 +> - Minumum firewall ruleset is provided, which includes some filtering rules, +> and appropiate rules for using flowtable offload capabilities. + +As described, first packet will be evaluated by all the firewall path, so +desired connection should be explicitely accepted. Same thing should be taken +into account for traffic in reverse order. In most cases state policies are +used in order to accept connection in reverse patch. + +We will only accept traffic comming from interface eth0, protocol tcp and +destination port 1122. All other traffic traspassing the router should be +blocked. + +### Commands + +```none +set firewall flowtable FT01 interface 'eth0' +set firewall flowtable FT01 interface 'eth1' +set firewall ipv4 forward filter default-action 'drop' +set firewall ipv4 forward filter rule 10 action 'offload' +set firewall ipv4 forward filter rule 10 offload-target 'FT01' +set firewall ipv4 forward filter rule 10 state 'established' +set firewall ipv4 forward filter rule 10 state 'related' +set firewall ipv4 forward filter rule 20 action 'accept' +set firewall ipv4 forward filter rule 20 state 'established' +set firewall ipv4 forward filter rule 20 state 'related' +set firewall ipv4 forward filter rule 110 action 'accept' +set firewall ipv4 forward filter rule 110 destination address '192.0.2.100' +set firewall ipv4 forward filter rule 110 destination port '1122' +set firewall ipv4 forward filter rule 110 inbound-interface name 'eth0' +set firewall ipv4 forward filter rule 110 protocol 'tcp' +``` + +### Explanation + +Analysis on what happens for desired connection: + +> 1\. First packet is received on eth0, with destination address 192.0.2.100, +> protocol tcp and destination port 1122. Assume such destination address is +> reachable through interface eth1. +> +> 2\. Since this is the first packet, connection status of this connection, +> so far is **new**. So neither rule 10 nor 20 are valid. +> +> 3. Rule 110 is hit, so connection is accepted. +> +> 4\. Once answer from server 192.0.2.100 is seen in opposite direction, +> connection state will be triggered to **established**, so this reply is +> accepted in rule 20. +> +> 5\. Second packet for this connection is received by the router. Since +> connection state is **established**, then rule 10 is hit, and a new entry +> in the flowtable FT01 is added for this connection. +> +> 6\. All the following packets will skip traditional path, and will be offloaded +> and will use the **Fast Path**. + +### Checks + +It's time to check conntrack table, to see if any connection was accepted, +and if was properly offloaded + +```none +vyos@FlowTables:~$ show firewall ipv4 forward filter +Ruleset Information + +--------------------------------- +ipv4 Firewall "forward filter" + +Rule Action Protocol Packets Bytes Conditions +------- -------- ---------- --------- ------- ---------------------------------------------------------------- +10 offload all 8 468 ct state { established, related } flow add @VYOS_FLOWTABLE_FT01 +20 accept all 8 468 ct state { established, related } accept +110 accept tcp 2 120 ip daddr 192.0.2.100 tcp dport 1122 iifname "eth0" accept +default drop all 7 420 + +vyos@FlowTables:~$ sudo conntrack -L | grep tcp +conntrack v1.4.6 (conntrack-tools): 5 flow entries have been shown. +tcp 6 src=198.51.100.100 dst=192.0.2.100 sport=41676 dport=1122 src=192.0.2.100 dst=198.51.100.100 sport=1122 dport=41676 [OFFLOAD] mark=0 use=2 +vyos@FlowTables:~$ +``` diff --git a/docs/configuration/firewall/md-global-options.md b/docs/configuration/firewall/md-global-options.md new file mode 100644 index 00000000..6ca5a0e2 --- /dev/null +++ b/docs/configuration/firewall/md-global-options.md @@ -0,0 +1,187 @@ +--- +lastproofread: '2023-12-26' +--- + +(firewall-global-options-configuration)= + +# Global Options Firewall Configuration + +## Overview + +Some firewall settings are global and have an affect on the whole system. +In this section there's useful information about these global-options that can +be configured using vyos cli. + +Configuration commands covered in this section: + +```{eval-rst} +.. cfgcmd:: set firewall global-options ... +``` + +## Configuration + +```{eval-rst} +.. cfgcmd:: set firewall global-options all-ping [enable | disable] + + By default, when VyOS receives an ICMP echo request packet destined for + itself, it will answer with an ICMP echo reply, unless you avoid it + through its firewall. + + With the firewall you can set rules to accept, drop or reject ICMP in, + out or local traffic. You can also use the general **firewall all-ping** + command. This command affects only to LOCAL (packets destined for your + VyOS system), not to IN or OUT traffic. + + .. note:: **firewall global-options all-ping** affects only to LOCAL + and it always behaves in the most restrictive way + + .. code-block:: none + + set firewall global-options all-ping enable + + When the command above is set, VyOS will answer every ICMP echo request + addressed to itself, but that will only happen if no other rule is + applied dropping or rejecting local echo requests. In case of conflict, + VyOS will not answer ICMP echo requests. + + .. code-block:: none + + set firewall global-options all-ping disable + + When the command above is set, VyOS will answer no ICMP echo request + addressed to itself at all, no matter where it comes from or whether + more specific rules are being applied to accept them. +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options broadcast-ping [enable | disable] + + This setting enable or disable the response of icmp broadcast + messages. The following system parameter will be altered: + + * ``net.ipv4.icmp_echo_ignore_broadcasts`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options ip-src-route [enable | disable] +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options ipv6-src-route [enable | disable] + + This setting handle if VyOS accept packets with a source route + option. The following system parameter will be altered: + + * ``net.ipv4.conf.all.accept_source_route`` + * ``net.ipv6.conf.all.accept_source_route`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options receive-redirects [enable | disable] +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options ipv6-receive-redirects + [enable | disable] + + enable or disable of ICMPv4 or ICMPv6 redirect messages accepted + by VyOS. The following system parameter will be altered: + + * ``net.ipv4.conf.all.accept_redirects`` + * ``net.ipv6.conf.all.accept_redirects`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options send-redirects [enable | disable] + + enable or disable ICMPv4 redirect messages send by VyOS + The following system parameter will be altered: + + * ``net.ipv4.conf.all.send_redirects`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options log-martians [enable | disable] + + enable or disable the logging of martian IPv4 packets. + The following system parameter will be altered: + + * ``net.ipv4.conf.all.log_martians`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options source-validation + [strict | loose | disable] + + Set the IPv4 source validation mode. + The following system parameter will be altered: + + * ``net.ipv4.conf.all.rp_filter`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options syn-cookies [enable | disable] + + Enable or Disable if VyOS use IPv4 TCP SYN Cookies. + The following system parameter will be altered: + + * ``net.ipv4.tcp_syncookies`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options twa-hazards-protection + [enable | disable] + + Enable or Disable VyOS to be {rfc}`1337` conform. + The following system parameter will be altered: + + * ``net.ipv4.tcp_rfc1337`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy established action + [accept | drop | reject] +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy established log +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy established log-level + [emerg | alert | crit | err | warn | notice | info | debug] + + Set the global setting for an established connection. +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy invalid action + [accept | drop | reject] +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy invalid log +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy invalid log-level + [emerg | alert | crit | err | warn | notice | info | debug] + + Set the global setting for invalid packets. +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy related action + [accept | drop | reject] +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy related log +``` + +```{eval-rst} +.. cfgcmd:: set firewall global-options state-policy related log-level + [emerg | alert | crit | err | warn | notice | info | debug] + + Set the global setting for related connections. +``` diff --git a/docs/configuration/firewall/md-groups.md b/docs/configuration/firewall/md-groups.md new file mode 100644 index 00000000..d3c2db6e --- /dev/null +++ b/docs/configuration/firewall/md-groups.md @@ -0,0 +1,495 @@ +--- +lastproofread: '2023-11-08' +--- + +(firewall-groups-configuration)= + +# Firewall groups + +## Configuration + +Firewall groups represent collections of IP addresses, networks, ports, +mac addresses, domains or interfaces. Once created, a group can be referenced +by firewall, nat and policy route rules as either a source or destination +matcher, and/or as inbound/outbound in the case of interface group. + +### Address Groups + +In an **address group** a single IP address or IP address ranges are +defined. + +```{eval-rst} +.. cfgcmd:: set firewall group address-group <name> address [address | + address range] +``` + +```{eval-rst} +.. cfgcmd:: set firewall group ipv6-address-group <name> address <address> + + Define a IPv4 or a IPv6 address group + + .. code-block:: none + + set firewall group address-group ADR-INSIDE-v4 address 192.168.0.1 + set firewall group address-group ADR-INSIDE-v4 address 10.0.0.1-10.0.0.8 + set firewall group ipv6-address-group ADR-INSIDE-v6 address 2001:db8::1 +``` + +```{eval-rst} +.. cfgcmd:: set firewall group address-group <name> description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall group ipv6-address-group <name> description <text> + + Provide a IPv4 or IPv6 address group description +``` + +### Network Groups + +While **network groups** accept IP networks in CIDR notation, specific +IP addresses can be added as a 32-bit prefix. If you foresee the need +to add a mix of addresses and networks, the network group is +recommended. + +```{eval-rst} +.. cfgcmd:: set firewall group network-group <name> network <CIDR> +``` + +```{eval-rst} +.. cfgcmd:: set firewall group ipv6-network-group <name> network <CIDR> + + Define a IPv4 or IPv6 Network group. + + .. code-block:: none + + set firewall group network-group NET-INSIDE-v4 network 192.168.0.0/24 + set firewall group network-group NET-INSIDE-v4 network 192.168.1.0/24 + set firewall group ipv6-network-group NET-INSIDE-v6 network 2001:db8::/64 +``` + +```{eval-rst} +.. cfgcmd:: set firewall group network-group <name> description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall group ipv6-network-group <name> description <text> + + Provide an IPv4 or IPv6 network group description. +``` + +### Interface Groups + +An **interface group** represents a collection of interfaces. + +```{eval-rst} +.. cfgcmd:: set firewall group interface-group <name> interface <text> + + Define an interface group. Wildcard are accepted too. +``` + +```none +set firewall group interface-group LAN interface bond1001 +set firewall group interface-group LAN interface eth3* +``` + +```{eval-rst} +.. cfgcmd:: set firewall group interface-group <name> description <text> + + Provide an interface group description +``` + +### Port Groups + +A **port group** represents only port numbers, not the protocol. Port +groups can be referenced for either TCP or UDP. It is recommended that +TCP and UDP groups are created separately to avoid accidentally +filtering unnecessary ports. Ranges of ports can be specified by using +`-`. + +```{eval-rst} +.. cfgcmd:: set firewall group port-group <name> port + [portname | portnumber | startport-endport] + + Define a port group. A port name can be any name defined in + /etc/services. e.g.: http + + .. code-block:: none + + set firewall group port-group PORT-TCP-SERVER1 port http + set firewall group port-group PORT-TCP-SERVER1 port 443 + set firewall group port-group PORT-TCP-SERVER1 port 5000-5010 +``` + +```{eval-rst} +.. cfgcmd:: set firewall group port-group <name> description <text> + + Provide a port group description. +``` + +### MAC Groups + +A **mac group** represents a collection of mac addresses. + +```{eval-rst} +.. cfgcmd:: set firewall group mac-group <name> mac-address <mac-address> + + Define a mac group. +``` + +```none +set firewall group mac-group MAC-G01 mac-address 88:a4:c2:15:b6:4f +set firewall group mac-group MAC-G01 mac-address 4c:d5:77:c0:19:81 +``` + +```{eval-rst} +.. cfgcmd:: set firewall group mac-group <name> description <text> + + Provide a mac group description. +``` + +### Domain Groups + +A **domain group** represents a collection of domains. + +```{eval-rst} +.. cfgcmd:: set firewall group domain-group <name> address <domain> + + Define a domain group. +``` + +```none +set firewall group domain-group DOM address example.com +``` + +```{eval-rst} +.. cfgcmd:: set firewall group domain-group <name> description <text> + + Provide a domain group description. +``` + +### Dynamic Groups + +Firewall dynamic groups are different from all the groups defined previously +because, not only they can be used as source/destination in firewall rules, +but members of these groups are not defined statically using vyos +configuration. + +Instead, members of these groups are added dynamically using firewall +rules. + +#### Defining Dynamic Address Groups + +Dynamic address group is supported by both IPv4 and IPv6 families. +Commands used to define dynamic IPv4|IPv6 address groups are: + +```{eval-rst} +.. cfgcmd:: set firewall group dynamic-group address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall group dynamic-group ipv6-address-group <name> +``` + +Add description to firewall groups: + +```{eval-rst} +.. cfgcmd:: set firewall group dynamic-group address-group <name> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall group dynamic-group ipv6-address-group <name> + description <text> +``` + +#### Adding elements to Dynamic Firewall Groups + +Once dynamic firewall groups are defined, they should be used in firewall +rules in order to dynamically add elements to it. + +Commands used for this task are: + +- Add destination IP address of the connection to a dynamic address group: + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [forward | input | output] filter rule + <1-999999> add-address-to-group destination-address address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> add-address-to-group + destination-address address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [forward | input | output] filter rule + <1-999999> add-address-to-group destination-address address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> add-address-to-group + destination-address address-group <name> +``` + +- Add source IP address of the connection to a dynamic address group: + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [forward | input | output] filter rule + <1-999999> add-address-to-group source-address address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> add-address-to-group + source-address address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [forward | input | output] filter rule + <1-999999> add-address-to-group source-address address-group <name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> add-address-to-group + source-address address-group <name> +``` + +Also, specific timeout can be defined per rule. In case rule gets a hit, +source or destinatination address will be added to the group, and this +element will remain in the group until timeout expires. If no timeout +is defined, then the element will remain in the group until next reboot, +or until a new commit that changes firewall configuration is done. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [forward | input | output] filter rule + <1-999999> add-address-to-group [destination-address | source-address] + timeout <timeout> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> add-address-to-group + [destination-address | source-address] timeout <timeout> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [forward | input | output] filter rule + <1-999999> add-address-to-group [destination-address | source-address] + timeout <timeout> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> add-address-to-group + [destination-address | source-address] timeout <timeout> +``` + +Timeout can be defined using seconds, minutes, hours or days: + +```none +set firewall ipv6 name FOO rule 10 add-address-to-group source-address timeout +Possible completions: +<number>s Timeout value in seconds +<number>m Timeout value in minutes +<number>h Timeout value in hours +<number>d Timeout value in days +``` + +#### Using Dynamic Firewall Groups + +As any other firewall group, dynamic firewall groups can be used in firewall +rules as matching options. For example: + +```none set firewall ipv4 input filter rule 10 source group dynamic-address-group FOO set firewall ipv4 input filter rule 10 destination group dynamic-address-group BAR + +``` + +## Examples + +### General example + +As said before, once firewall groups are created, they can be referenced +either in firewall, nat, nat66 and/or policy-route rules. + +Here is an example were multiple groups are created: + +> ```none +> set firewall group address-group SERVERS address 198.51.100.101 +> set firewall group address-group SERVERS address 198.51.100.102 +> set firewall group network-group TRUSTEDv4 network 192.0.2.0/30 +> set firewall group network-group TRUSTEDv4 network 203.0.113.128/25 +> set firewall group ipv6-network-group TRUSTEDv6 network 2001:db8::/64 +> set firewall group interface-group LAN interface eth2.2001 +> set firewall group interface-group LAN interface bon0 +> set firewall group port-group PORT-SERVERS port http +> set firewall group port-group PORT-SERVERS port 443 +> set firewall group port-group PORT-SERVERS port 5000-5010 +> ``` + +And next, some configuration example where groups are used: + +> ```none +> set firewall ipv4 output filter rule 10 action accept +> set firewall ipv4 output filter rule 10 outbound-interface group !LAN +> set firewall ipv4 forward filter rule 20 action accept +> set firewall ipv4 forward filter rule 20 source group network-group TRUSTEDv4 +> set firewall ipv6 input filter rule 10 action accept +> set firewall ipv6 input filter rule 10 source group network-group TRUSTEDv6 +> set nat destination rule 101 inbound-interface group LAN +> set nat destination rule 101 destination group address-group SERVERS +> set nat destination rule 101 protocol tcp +> set nat destination rule 101 destination group port-group PORT-SERVERS +> set nat destination rule 101 translation address 203.0.113.250 +> set policy route PBR rule 201 destination group port-group PORT-SERVERS +> set policy route PBR rule 201 protocol tcp +> set policy route PBR rule 201 set table 15 +> ``` + +### Port knocking example + +Using dynamic firewall groups, we can secure access to the router, or any other +device if needed, by using the technique of port knocking. + +A 4 step port knocking example is shown next: + +> ```none +> set firewall global-options state-policy established action 'accept' +> set firewall global-options state-policy invalid action 'drop' +> set firewall global-options state-policy related action 'accept' +> set firewall group dynamic-group address-group ALLOWED +> set firewall group dynamic-group address-group PN_01 +> set firewall group dynamic-group address-group PN_02 +> set firewall ipv4 input filter default-action 'drop' +> set firewall ipv4 input filter rule 5 action 'accept' +> set firewall ipv4 input filter rule 5 protocol 'icmp' +> set firewall ipv4 input filter rule 10 action 'drop' +> set firewall ipv4 input filter rule 10 add-address-to-group source-address address-group 'PN_01' +> set firewall ipv4 input filter rule 10 add-address-to-group source-address timeout '2m' +> set firewall ipv4 input filter rule 10 description 'Port_nock 01' +> set firewall ipv4 input filter rule 10 destination port '9990' +> set firewall ipv4 input filter rule 10 protocol 'tcp' +> set firewall ipv4 input filter rule 20 action 'drop' +> set firewall ipv4 input filter rule 20 add-address-to-group source-address address-group 'PN_02' +> set firewall ipv4 input filter rule 20 add-address-to-group source-address timeout '3m' +> set firewall ipv4 input filter rule 20 description 'Port_nock 02' +> set firewall ipv4 input filter rule 20 destination port '9991' +> set firewall ipv4 input filter rule 20 protocol 'tcp' +> set firewall ipv4 input filter rule 20 source group dynamic-address-group 'PN_01' +> set firewall ipv4 input filter rule 30 action 'drop' +> set firewall ipv4 input filter rule 30 add-address-to-group source-address address-group 'ALLOWED' +> set firewall ipv4 input filter rule 30 add-address-to-group source-address timeout '2h' +> set firewall ipv4 input filter rule 30 description 'Port_nock 03' +> set firewall ipv4 input filter rule 30 destination port '9992' +> set firewall ipv4 input filter rule 30 protocol 'tcp' +> set firewall ipv4 input filter rule 30 source group dynamic-address-group 'PN_02' +> set firewall ipv4 input filter rule 99 action 'accept' +> set firewall ipv4 input filter rule 99 description 'Port_nock 04 - Allow ssh' +> set firewall ipv4 input filter rule 99 destination port '22' +> set firewall ipv4 input filter rule 99 protocol 'tcp' +> set firewall ipv4 input filter rule 99 source group dynamic-address-group 'ALLOWED' +> ``` + +Before testing, we can check members of firewall groups: + +> ```none +> vyos@vyos# run show firewall group +> Firewall Groups +> +> Name Type References Members Timeout Expires +> ------- ---------------------- -------------------- ------------- --------- --------- +> ALLOWED address_group(dynamic) ipv4-input-filter-30 N/D N/D N/D +> PN_01 address_group(dynamic) ipv4-input-filter-10 N/D N/D N/D +> PN_02 address_group(dynamic) ipv4-input-filter-20 N/D N/D N/D +> [edit] +> vyos@vyos# +> ``` + +With this configuration, in order to get ssh access to the router, user +needs to: + +1\. Generate a new TCP connection with destination port 9990. As shown next, +a new entry was added to dynamic firewall group **PN_01** + +> ```none +> vyos@vyos# run show firewall group +> Firewall Groups +> +> Name Type References Members Timeout Expires +> ------- ---------------------- -------------------- ------------- --------- --------- +> ALLOWED address_group(dynamic) ipv4-input-filter-30 N/D N/D N/D +> PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.89.31 120 119 +> PN_02 address_group(dynamic) ipv4-input-filter-20 N/D N/D N/D +> [edit] +> vyos@vyos# +> ``` + +2\. Generate a new TCP connection with destination port 9991. As shown next, +a new entry was added to dynamic firewall group **PN_02** + +> ```none +> vyos@vyos# run show firewall group +> Firewall Groups +> +> Name Type References Members Timeout Expires +> ------- ---------------------- -------------------- ------------- --------- --------- +> ALLOWED address_group(dynamic) ipv4-input-filter-30 N/D N/D N/D +> PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.89.31 120 106 +> PN_02 address_group(dynamic) ipv4-input-filter-20 192.168.89.31 180 179 +> [edit] +> vyos@vyos# +> ``` + +3\. Generate a new TCP connection with destination port 9992. As shown next, +a new entry was added to dynamic firewall group **ALLOWED** + +> ```none +> vyos@vyos# run show firewall group +> Firewall Groups +> +> Name Type References Members Timeout Expires +> ------- ---------------------- -------------------- ------------- --------- --------- +> ALLOWED address_group(dynamic) ipv4-input-filter-30 192.168.89.31 7200 7199 +> PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.89.31 120 89 +> PN_02 address_group(dynamic) ipv4-input-filter-20 192.168.89.31 180 170 +> [edit] +> vyos@vyos# +> ``` + +4. Now user can connect through ssh to the router (assuming ssh is configured). + +## Operation-mode + +```{eval-rst} +.. opcmd:: show firewall group +``` + +```{eval-rst} +.. opcmd:: show firewall group <name> + + Overview of defined groups. You see the firewall group name, type, + references (where the group is used), members, timeout and expiration (last + two only present in dynamic firewall groups). +``` + +Here is an example of such command: + +> ```none +> vyos@vyos:~$ show firewall group +> Firewall Groups +> +> Name Type References Members Timeout Expires +> ------------ ---------------------- ---------------------- ---------------- --------- --------- +> SERVERS address_group nat-destination-101 198.51.100.101 +> 198.51.100.102 +> ALLOWED address_group(dynamic) ipv4-input-filter-30 192.168.77.39 7200 7174 +> PN_01 address_group(dynamic) ipv4-input-filter-10 192.168.0.245 120 112 +> 192.168.77.39 120 85 +> PN_02 address_group(dynamic) ipv4-input-filter-20 192.168.77.39 180 151 +> LAN interface_group ipv4-output-filter-10 bon0 +> nat-destination-101 eth2.2001 +> TRUSTEDv6 ipv6_network_group ipv6-input-filter-10 2001:db8::/64 +> TRUSTEDv4 network_group ipv4-forward-filter-20 192.0.2.0/30 +> 203.0.113.128/25 +> PORT-SERVERS port_group route-PBR-201 443 +> route-PBR-201 5000-5010 +> nat-destination-101 http +> vyos@vyos:~$ +> ``` diff --git a/docs/configuration/firewall/md-index.md b/docs/configuration/firewall/md-index.md new file mode 100644 index 00000000..53c5a7fc --- /dev/null +++ b/docs/configuration/firewall/md-index.md @@ -0,0 +1,181 @@ +--- +lastproofread: '2023-11-23' +--- + +# Firewall + +As VyOS is based on Linux it leverages its firewall. The Netfilter project +created iptables and its successor nftables for the Linux kernel to +work directly on packet data flows. This now extends the concept of +zone-based security to allow for manipulating the data at multiple stages once +accepted by the network interface and the driver before being handed off to +the destination (e.g., a web server OR another device). + +A simplified traffic flow diagram, based on Netfilter packet flow, is shown +next, in order to have a full view and understanding of how packets are +processed, and what possible paths traffic can take. + +:::{figure} /_static/images/firewall-gral-packet-flow.png +::: + +The main points regarding this packet flow and terminology used in VyOS +firewall are covered below: + +> - **Bridge Port?**: choose appropriate path based on whether interface +> where the packet was received is part of a bridge, or not. + +If the interface where the packet was received isn't part of a bridge, then +packetis processed at the **IP Layer**: + +> - **Prerouting**: several actions can be done in this stage, and currently +> these actions are defined in different parts in VyOS configuration. Order +> is important, and all these actions are performed before any actions +> defined under `firewall` section. Relevant configuration that acts in +> this stage are: +> +> > - **Conntrack Ignore**: rules defined under `set system conntrack ignore +> > [ipv4 | ipv6] ...`. +> > - **Policy Route**: rules defined under `set policy [route | route6] +> > ...`. +> > - **Destination NAT**: rules defined under `set [nat | nat66] +> > destination...`. +> +> - **Destination is the router?**: choose appropriate path based on +> destination IP address. Transit forward continues to **forward**, +> while traffic that destination IP address is configured on the router +> continues to **input**. +> +> - **Input**: stage where traffic destined for the router itself can be +> filtered and controlled. This is where all rules for securing the router +> should take place. This includes ipv4 and ipv6 filtering rules, defined +> in: +> +> - `set firewall ipv4 input filter ...`. +> - `set firewall ipv6 input filter ...`. +> +> - **Forward**: stage where transit traffic can be filtered and controlled. +> This includes ipv4 and ipv6 filtering rules, defined in: +> +> - `set firewall ipv4 forward filter ...`. +> - `set firewall ipv6 forward filter ...`. +> +> - **Output**: stage where traffic that originates from the router itself +> can be filtered and controlled. Bear in mind that this traffic can be a +> new connection originated by a internal process running on VyOS router, +> such as NTP, or a response to traffic received externaly through +> **input** (for example response to an ssh login attempt to the router). +> This includes ipv4 and ipv6 filtering rules, defined in: +> +> - `set firewall ipv4 output filter ...`. +> - `set firewall ipv6 output filter ...`. +> +> - **Postrouting**: as in **Prerouting**, several actions defined in +> different parts of VyOS configuration are performed in this +> stage. This includes: +> +> - **Source NAT**: rules defined under `set [nat | nat66] +> destination...`. + +If the interface where the packet was received is part of a bridge, then +the packet is processed at the **Bridge Layer**, which contains a basic setup for +bridge filtering: + +> - **Forward (Bridge)**: stage where traffic that is trespasing through the +> bridge is filtered and controlled: +> +> - `set firewall bridge forward filter ...`. + +The main structure of the VyOS firewall CLI is shown next: + +```none +- set firewall + * bridge + - forward + + filter + * flowtable + - custom_flow_table + + ... + * global-options + + all-ping + + broadcast-ping + + ... + * group + - address-group + - ipv6-address-group + - network-group + - ipv6-network-group + - interface-group + - mac-group + - port-group + - domain-group + * ipv4 + - forward + + filter + - input + + filter + - output + + filter + - name + + custom_name + * ipv6 + - forward + + filter + - input + + filter + - output + + filter + - ipv6-name + + custom_name + * zone + - custom_zone_name + + ... +``` + +Please, refer to appropriate section for more information about firewall +configuration: + +```{eval-rst} +.. toctree:: + :maxdepth: 1 + :includehidden: + + global-options + groups + bridge + ipv4 + ipv6 + flowtables +``` + +:::{note} +**For more information** +of Netfilter hooks and Linux networking packet flows can be +found in [Netfilter-Hooks](https://wiki.nftables.org/wiki-nftables/index.php/Netfilter_hooks) +::: + +## Zone-based firewall + +```{eval-rst} +.. toctree:: + :maxdepth: 1 + :includehidden: + + zone +``` + +With zone-based firewalls a new concept was implemented, in addition to the +standard in and out traffic flows, a local flow was added. This local was for +traffic originating and destined to the router itself. Which means additional +rules were required to secure the firewall itself from the network, in +addition to the existing inbound and outbound rules from the traditional +concept above. + +To configure VyOS with the +{doc}`zone-based firewall configuration </configuration/firewall/zone>` + +As the example image below shows, the device now needs rules to allow/block +traffic to or from the services running on the device that have open +connections on that interface. + +:::{figure} /_static/images/firewall-zonebased.png +::: diff --git a/docs/configuration/firewall/md-ipv4.md b/docs/configuration/firewall/md-ipv4.md new file mode 100644 index 00000000..23ff6c39 --- /dev/null +++ b/docs/configuration/firewall/md-ipv4.md @@ -0,0 +1,2037 @@ +--- +lastproofread: '2023-11-08' +--- + +(firewall-ipv4-configuration)= + +# IPv4 Firewall Configuration + +## Overview + +In this section there's useful information of all firewall configuration that +can be done regarding IPv4, and appropiate op-mode commands. +Configuration commands covered in this section: + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 ... +``` + +From main structure defined in +{doc}`Firewall Overview</configuration/firewall/index>` +in this section you can find detailed information only for the next part +of the general structure: + +```none +- set firewall + * ipv4 + - forward + + filter + - input + + filter + - output + + filter + - name + + custom_name +``` + +For transit traffic, which is received by the router and forwarded, base chain +is **forward**. A simplified packet flow diagram for transit traffic is shown +next: + +:::{figure} /_static/images/firewall-fwd-packet-flow.png +::: + +Where firewall base chain to configure firewall filtering rules for transit +traffic is `set firewall ipv4 forward filter ...`, which happens in stage 5, +highlightened with red color. + +For traffic towards the router itself, base chain is **input**, while traffic +originated by the router, base chain is **output**. +A new simplified packet flow diagram is shown next, which shows the path +for traffic destinated to the router itself, and traffic generated by the +router (starting from circle number 6): + +:::{figure} /_static/images/firewall-input-packet-flow.png +::: + +Base chain is for traffic toward the router is `set firewall ipv4 input +filter ...` + +And base chain for traffic generated by the router is `set firewall ipv4 +output filter ...` + +:::{note} +**Important note about default-actions:** +If default action for any base chain is not defined, then the default +action is set to **accept** for that chain. For custom chains, if default +action is not defined, then the default-action is set to **drop** +::: + +Custom firewall chains can be created, with commands +`set firewall ipv4 name <name> ...`. In order to use +such custom chain, a rule with **action jump**, and the appropiate **target** +should be defined in a base chain. + +## Firewall - IPv4 Rules + +For firewall filtering, firewall rules needs to be created. Each rule is +numbered, has an action to apply if the rule is matched, and the ability +to specify multiple criteria matchers. Data packets go through the rules +from 1 - 999999, so order is crucial. At the first match the action of the +rule will be executed. + +### Actions + +If a rule is defined, then an action must be defined for it. This tells the +firewall what to do if all criteria matchers defined for such rule do match. + +The action can be : + +> - `accept`: accept the packet. +> - `continue`: continue parsing next rule. +> - `drop`: drop the packet. +> - `reject`: reject the packet. +> - `jump`: jump to another custom chain. +> - `return`: Return from the current chain and continue at the next rule +> of the last chain. +> - `queue`: Enqueue packet to userspace. +> - `synproxy`: synproxy the packet. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return | synproxy] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return | synproxy] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return] + + This required setting defines the action of the current rule. If action is + set to jump, then jump-target is also needed. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + jump-target <text> + + To be used only when action is set to ``jump``. Use this command to specify + jump target. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + queue <0-65535> + + To be used only when action is set to ``queue``. Use this command to specify + queue target to use. Queue range is also supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + queue-options bypass + + To be used only when action is set to ``queue``. Use this command to let + packet go through firewall when no userspace software is connected to the + queue. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + queue-options fanout + + To be used only when action is set to ``queue``. Use this command to + distribute packets between several queues. +``` + +Also, **default-action** is an action that takes place whenever a packet does +not match any rule in it's chain. For base chains, possible options for +**default-action** are **accept** or **drop**. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> default-action + [accept | drop | jump | queue | reject | return] + + This set the default action of the rule-set if no rule matched a packet + criteria. If default-action is set to ``jump``, then + ``default-jump-target`` is also needed. Note that for base chains, default + action can only be set to ``accept`` or ``drop``, while on custom chain, + more actions are available. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> default-jump-target <text> + + To be used only when ``defult-action`` is set to ``jump``. Use this + command to specify jump target for default rule. +``` + +:::{note} +**Important note about default-actions:** +If default action for any base chain is not defined, then the default +action is set to **accept** for that chain. For custom chains, if default +action is not defined, then the default-action is set to **drop**. +::: + +### Firewall Logs + +Logging can be enable for every single firewall rule. If enabled, other +log options can be defined. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> log + + Enable logging for the matched packet. If this configuration command is not + present, then log is not enabled. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> default-log + + Use this command to enable the logging of the default action on + the specified chain. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] + + Define log-level. Only applicable if rule log is enable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + log-options group <0-65535> + + Define log group to send message to. Only applicable if rule log is enable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + log-options snapshot-length <0-9000> + + Define length of packet payload to include in netlink message. Only + applicable if rule log is enable and log group is defined. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + log-options queue-threshold <0-65535> + + Define number of packets to queue inside the kernel before sending them to + userspace. Only applicable if rule log is enable and log group is defined. +``` + +### Firewall Description + +For reference, a description can be defined for every single rule, and for +every defined custom chain. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> description <text> + + Provide a rule-set description to a custom firewall chain. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> description <text> + + Provide a description for each rule. +``` + +### Rule Status + +When defining a rule, it is enable by default. In some cases, it is useful to +just disable the rule, rather than removing it. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> disable + + Command for disabling a rule but keep it in the configuration. +``` + +### Matching criteria + +There are a lot of matching criteria against which the packet can be tested. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + connection-status nat [destination | source] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + connection-status nat [destination | source] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + connection-status nat [destination | source] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + connection-status nat [destination | source] + + Match criteria based on nat connection status. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + connection-mark <1-2147483647> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + connection-mark <1-2147483647> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + connection-mark <1-2147483647> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + connection-mark <1-2147483647> + + Match criteria based on connection mark. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination address [address | addressrange | CIDR] + + Match criteria based on source and/or destination address. This is similar + to the network groups part, but here you are able to negate the matching + addresses. + + .. code-block:: none + + set firewall ipv4 name FOO rule 50 source address 192.0.2.10-192.0.2.11 + # with a '!' the rule match everything except the specified subnet + set firewall ipv4 input filter FOO rule 51 source address !203.0.113.0/24 +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination address-mask [address] + + An arbitrary netmask can be applied to mask addresses to only match against + a specific portion. + + This functions for both individual addresses and address groups. + + .. code-block:: none + + # Match any IPv4 address with `11` as the 2nd octet and `13` as the forth octet + set firewall ipv4 name FOO rule 100 destination address 0.11.0.13 + set firewall ipv4 name FOO rule 100 destination address-mask 0.255.0.255 +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination fqdn <fqdn> + + Specify a Fully Qualified Domain Name as source/destination matcher. Ensure + router is able to resolve such dns query. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination geoip inverse-match + + Match IP addresses based on its geolocation. More info: `geoip matching + <https://wiki.nftables.org/wiki-nftables/index.php/GeoIP_matching>`_. + Use inverse-match to match anything except the given country-codes. +``` + +Data is provided by DB-IP.com under CC-BY-4.0 license. Attribution required, +permits redistribution so we can include a database in images(~3MB +compressed). Includes cron script (manually callable by op-mode update +geoip) to keep database and rules updated. + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source mac-address <mac-address> + + Only in the source criteria, you can specify a mac-address. + + .. code-block:: none + + set firewall ipv4 input filter rule 100 source mac-address 00:53:00:11:22:33 + set firewall ipv4 input filter rule 101 source mac-address !00:53:00:aa:12:34 + +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination port [1-65535 | portname | start-end] + + A port can be set with a port number or a name which is here + defined: ``/etc/services``. + + .. code-block:: none + + set firewall ipv4 forward filter rule 10 source port '22' + set firewall ipv4 forward filter rule 11 source port '!http' + set firewall ipv4 forward filter rule 12 source port 'https' + + Multiple source ports can be specified as a comma-separated list. + The whole list can also be "negated" using ``!``. For example: +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination group address-group <name | !name> + + Use a specific address-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination group dynamic-address-group <name | !name> + + Use a specific dynamic-address-group. Prepend character ``!`` for inverted + matching criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination group network-group <name | !name> + + Use a specific network-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination group port-group <name | !name> + + Use a specific port-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination group domain-group <name | !name> + + Use a specific domain-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + destination group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + destination group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + destination group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + destination group mac-group <name | !name> + + Use a specific mac-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + dscp-exclude [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + dscp-exclude [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + dscp-exclude [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + dscp-exclude [0-63 | start-end] + + Match based on dscp value. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + fragment [match-frag | match-non-frag] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + fragment [match-frag | match-non-frag] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + fragment [match-frag | match-non-frag] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + fragment [match-frag | match-non-frag] + + Match based on fragment criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + icmp [code | type] <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + icmp [code | type] <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + icmp [code | type] <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + icmp [code | type] <0-255> + + Match based on icmp code and type. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + icmp type-name <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + icmp type-name <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + icmp type-name <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + icmp type-name <text> + + Match based on icmp type-name criteria. Use tab for information + about what **type-name** criteria are supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + inbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + inbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + inbound-interface name <iface> + + Match based on inbound interface. Wilcard ``*`` can be used. + For example: ``eth2*``. Prepending character ``!`` for inverted matching + criteria is also supportd. For example ``!eth2`` +``` + +:::{note} +If an interface is attached to a non-default vrf, when using +**inbound-interface**, vrf name must be used. For example `set firewall +ipv4 forward filter rule 10 inbound-interface name MGMT` +::: + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + inbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + inbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + inbound-interface group <iface_group> + + Match based on inbound interface group. Prepending character ``!`` for + inverted matching criteria is also supportd. For example ``!IFACE_GROUP`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + outbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + outbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + outbound-interface name <iface> + + Match based on outbound interface. Wilcard ``*`` can be used. + For example: ``eth2*``. Prepending character ``!`` for inverted matching + criteria is also supportd. For example ``!eth2`` +``` + +:::{note} +If an interface is attached to a non-default vrf, when using +**outbound-interface**, real interface name must be used. For example +`set firewall ipv4 forward filter rule 10 outbound-interface name eth0` +::: + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + outbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + outbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + outbound-interface group <iface_group> + + Match based on outbound interface group. Prepending character ``!`` for + inverted matching criteria is also supportd. For example ``!IFACE_GROUP`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + ipsec [match-ipsec | match-none] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + ipsec [match-ipsec | match-none] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + ipsec [match-ipsec | match-none] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + ipsec [match-ipsec | match-none] + + Match based on ipsec criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + limit burst <0-4294967295> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + limit burst <0-4294967295> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + limit burst <0-4294967295> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + limit burst <0-4294967295> + + Match based on the maximum number of packets to allow in excess of rate. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + limit rate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + limit rate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + limit rate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + limit rate <text> + + Match based on the maximum average rate, specified as **integer/unit**. + For example **5/minutes** +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + packet-length-exclude <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + packet-length-exclude <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + packet-length-exclude <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + packet-length-exclude <text> + + Match based on packet length criteria. Multiple values from 1 to 65535 + and ranges are supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + packet-type [broadcast | host | multicast | other] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + packet-type [broadcast | host | multicast | other] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + packet-type [broadcast | host | multicast | other] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + packet-type [broadcast | host | multicast | other] + + Match based on packet type criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] + + Match a protocol criteria. A protocol number or a name which is here + defined: ``/etc/protocols``. + Special names are ``all`` for all protocols and ``tcp_udp`` for tcp and udp + based packets. The ``!`` negate the selected protocol. + + .. code-block:: none + + set firewall ipv4 forward fitler rule 10 protocol tcp_udp + set firewall ipv4 forward fitler rule 11 protocol !tcp_udp +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + recent time [second | minute | hour] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + recent time [second | minute | hour] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + recent time [second | minute | hour] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + recent time [second | minute | hour] + + Match bases on recently seen sources. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + tcp flags [not] <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + tcp flags [not] <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + tcp flags [not] <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + tcp flags [not] <text> + + Allowed values fpr TCP flags: ``ack``, ``cwr``, ``ecn``, ``fin``, ``psh``, + ``rst``, ``syn`` and ``urg``. Multiple values are supported, and for + inverted selection use ``not``, as shown in the example. + + .. code-block:: none + + set firewall ipv4 input filter rule 10 tcp flags 'ack' + set firewall ipv4 input filter rule 12 tcp flags 'syn' + set firewall ipv4 input filter rule 13 tcp flags not 'fin' +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + state [established | invalid | new | related] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + state [established | invalid | new | related] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + state [established | invalid | new | related] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + state [established | invalid | new | related] + + Match against the state of a packet. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + time weekdays <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + time weekdays <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + time weekdays <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + time weekdays <text> + + Time to match the defined rule. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + ttl <eq | gt | lt> <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + ttl <eq | gt | lt> <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + ttl <eq | gt | lt> <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + ttl <eq | gt | lt> <0-255> + + Match time to live parameter, where 'eq' stands for 'equal'; 'gt' stands for + 'greater than', and 'lt' stands for 'less than'. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + recent time <second | minute | hour> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + recent time <second | minute | hour> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + recent time <second | minute | hour> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + recent time <second | minute | hour> + + Match when 'count' amount of connections are seen within 'time'. These + matching criteria can be used to block brute-force attempts. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 forward filter rule <1-999999> + conntrack-helper <module> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 input filter rule <1-999999> + conntrack-helper <module> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 output filter rule <1-999999> + conntrack-helper <module> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 name <name> rule <1-999999> + conntrack-helper <module> + + Match based on connection tracking protocol helper module to secure use of + that helper module. See below for possible completions `<module>`. + + .. code-block:: none + + Possible completions: + ftp Related traffic from FTP helper + h323 Related traffic from H.323 helper + pptp Related traffic from PPTP helper + nfs Related traffic from NFS helper + sip Related traffic from SIP helper + tftp Related traffic from TFTP helper + sqlnet Related traffic from SQLNet helper + +``` + +## Synproxy + +Synproxy connections + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [input | forward] filter rule <1-999999> + action synproxy +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [input | forward] filter rule <1-999999> + protocol tcp +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [input | forward] filter rule <1-999999> + synproxy tcp mss <501-65535> + + Set TCP-MSS (maximum segment size) for the connection +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv4 [input | forward] filter rule <1-999999> + synproxy tcp window-scale <1-14> + + Set the window scale factor for TCP window scaling +``` + +### Example synproxy + +Requirements to enable synproxy: + +> - Traffic must be symmetric +> - Synproxy relies on syncookies and TCP timestamps, ensure these are enabled +> - Disable conntrack loose track option + +```none +set system sysctl parameter net.ipv4.tcp_timestamps value '1' + +set system conntrack tcp loose disable +set system conntrack ignore ipv4 rule 10 destination port '8080' +set system conntrack ignore ipv4 rule 10 protocol 'tcp' +set system conntrack ignore ipv4 rule 10 tcp flags syn + +set firewall global-options syn-cookies 'enable' +set firewall ipv4 input filter rule 10 action 'synproxy' +set firewall ipv4 input filter rule 10 destination port '8080' +set firewall ipv4 input filter rule 10 inbound-interface name 'eth1' +set firewall ipv4 input filter rule 10 protocol 'tcp' +set firewall ipv4 input filter rule 10 synproxy tcp mss '1460' +set firewall ipv4 input filter rule 10 synproxy tcp window-scale '7' +set firewall ipv4 input filter rule 1000 action 'drop' +set firewall ipv4 input filter rule 1000 state invalid +``` + +## Operation-mode Firewall + +### Rule-set overview + +```{eval-rst} +.. opcmd:: show firewall + + This will show you a basic firewall overview, for all ruleset, and not + only for ipv4 + + .. code-block:: none + + vyos@vyos:~$ show firewall + Rulesets Information + + --------------------------------- + ipv4 Firewall "forward filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ----------------------------- + 20 accept all 0 0 ip saddr @N_TRUSTEDv4 accept + 21 jump all 0 0 jump NAME_AUX + default accept all 0 0 + + --------------------------------- + ipv4 Firewall "input filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ------------------------- + 10 accept all 156 14377 iifname != @I_LAN accept + default accept all 0 0 + + --------------------------------- + ipv4 Firewall "name AUX" + + Rule Action Protocol Packets Bytes Conditions + ------ -------- ---------- --------- ------- -------------------------------------------- + 10 accept icmp 0 0 meta l4proto icmp accept + 20 accept udp 0 0 meta l4proto udp ip saddr @A_SERVERS accept + 30 drop all 0 0 ip saddr != @A_SERVERS iifname "eth2" + + --------------------------------- + ipv4 Firewall "output filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ---------------------------------------- + 10 reject all 0 0 oifname @I_LAN + 20 accept icmp 2 168 meta l4proto icmp oifname "eth0" accept + default accept all 72 9258 + + --------------------------------- + ipv6 Firewall "input filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ------------------------------- + 10 accept all 0 0 ip6 saddr @N6_TRUSTEDv6 accept + default accept all 2 112 + + vyos@vyos:~$ +``` + +```{eval-rst} +.. opcmd:: show firewall summary + + This will show you a summary of rule-sets and groups + + .. code-block:: none + + vyos@vyos:~$ show firewall summary + Ruleset Summary + + IPv6 Ruleset: + + Ruleset Hook Ruleset Priority Description + -------------- -------------------- ------------------------- + forward filter + input filter + ipv6_name IPV6-VyOS_MANAGEMENT + ipv6_name IPV6-WAN_IN PUBLIC_INTERNET + + IPv4 Ruleset: + + Ruleset Hook Ruleset Priority Description + -------------- ------------------ ------------------------- + forward filter + input filter + name VyOS_MANAGEMENT + name WAN_IN PUBLIC_INTERNET + + Firewall Groups + + Name Type References Members + ----------------------- ------------------ ----------------------- ---------------- + PBX address_group WAN_IN-100 198.51.100.77 + SERVERS address_group WAN_IN-110 192.0.2.10 + WAN_IN-111 192.0.2.11 + WAN_IN-112 192.0.2.12 + WAN_IN-120 + WAN_IN-121 + WAN_IN-122 + SUPPORT address_group VyOS_MANAGEMENT-20 192.168.1.2 + WAN_IN-20 + PHONE_VPN_SERVERS address_group WAN_IN-160 10.6.32.2 + PINGABLE_ADRESSES address_group WAN_IN-170 192.168.5.2 + WAN_IN-171 + PBX ipv6_address_group IPV6-WAN_IN-100 2001:db8::1 + SERVERS ipv6_address_group IPV6-WAN_IN-110 2001:db8::2 + IPV6-WAN_IN-111 2001:db8::3 + IPV6-WAN_IN-112 2001:db8::4 + IPV6-WAN_IN-120 + IPV6-WAN_IN-121 + IPV6-WAN_IN-122 + SUPPORT ipv6_address_group IPV6-VyOS_MANAGEMENT-20 2001:db8::5 + IPV6-WAN_IN-20 + +``` + +```{eval-rst} +.. opcmd:: show firewall ipv4 [forward | input | output] filter +``` + +```{eval-rst} +.. opcmd:: show firewall ipv4 name <name> + + This command will give an overview of a single rule-set. + + .. code-block:: none + + vyos@vyos:~$ show firewall ipv4 input filter + Ruleset Information + + --------------------------------- + IPv4 Firewall "input filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ----------------------------------------- + 5 jump all 0 0 iifname "eth2" jump NAME_VyOS_MANAGEMENT + default accept all +``` + +```{eval-rst} +.. opcmd:: show firewall ipv4 [forward | input | output] + filter rule <1-999999> +``` + +```{eval-rst} +.. opcmd:: show firewall ipv4 name <name> rule <1-999999> + + This command will give an overview of a rule in a single rule-set, plus + information for default action. +``` + +```none +vyos@vyos:~$show firewall ipv4 output filter rule 20 +Rule Information + +--------------------------------- +ipv4 Firewall "output filter" + +Rule Action Protocol Packets Bytes Conditions +------- -------- ---------- --------- ------- ---------------------------------------- +20 accept icmp 2 168 meta l4proto icmp oifname "eth0" accept +default accept all 286 47614 + +vyos@vyos:~$ +``` + +```{eval-rst} +.. opcmd:: show firewall statistics + + This will show you a statistic of all rule-sets since the last boot. +``` + +### Show Firewall log + +```{eval-rst} +.. opcmd:: show log firewall +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv4 +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv4 [forward | input | output | name] +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv4 [forward | input | output] filter +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv4 name <name> +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv4 [forward | input | output] filter rule <rule> +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv4 name <name> rule <rule> + + Show the logs of all firewall; show all ipv4 firewall logs; show all logs + for particular hook; show all logs for particular hook and priority; + show all logs for particular custom chain; show logs for specific Rule-Set. +``` + +### Example Partial Config + +```none +firewall { + group { + network-group BAD-NETWORKS { + network 198.51.100.0/24 + network 203.0.113.0/24 + } + network-group GOOD-NETWORKS { + network 192.0.2.0/24 + } + port-group BAD-PORTS { + port 65535 + } + } + ipv4 { + forward { + filter { + default-action accept + rule 5 { + action accept + source { + group { + network-group GOOD-NETWORKS + } + } + } + rule 10 { + action drop + description "Bad Networks" + protocol all + source { + group { + network-group BAD-NETWORKS + } + } + } + } + } + } +} +``` + +### Update geoip database + +```{eval-rst} +.. opcmd:: update geoip + + Command used to update GeoIP database and firewall sets. +``` diff --git a/docs/configuration/firewall/md-ipv6.md b/docs/configuration/firewall/md-ipv6.md new file mode 100644 index 00000000..e2db7928 --- /dev/null +++ b/docs/configuration/firewall/md-ipv6.md @@ -0,0 +1,2026 @@ +--- +lastproofread: '2023-11-08' +--- + +(firewall-ipv6-configuration)= + +# IPv6 Firewall Configuration + +## Overview + +In this section there's useful information of all firewall configuration that +can be done regarding IPv6, and appropiate op-mode commands. +Configuration commands covered in this section: + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 ... +``` + +From main structure defined in +{doc}`Firewall Overview</configuration/firewall/index>` +in this section you can find detailed information only for the next part +of the general structure: + +```none +- set firewall + * ipv6 + - forward + + filter + - input + + filter + - output + + filter + - name + + custom_name +``` + +For transit traffic, which is received by the router and forwarded, base chain +is **forward**. A simplified packet flow diagram for transit traffic is shown +next: + +:::{figure} /_static/images/firewall-fwd-packet-flow.png +::: + +Where firewall base chain to configure firewall filtering rules for transit +traffic is `set firewall ipv6 forward filter ...`, which happens in stage 5, +highlightened with red color. + +For traffic towards the router itself, base chain is **input**, while traffic +originated by the router, base chain is **output**. +A new simplified packet flow diagram is shown next, which shows the path +for traffic destinated to the router itself, and traffic generated by the +router (starting from circle number 6): + +:::{figure} /_static/images/firewall-input-packet-flow.png +::: + +Base chain is for traffic toward the router is `set firewall ipv6 input +filter ...` + +And base chain for traffic generated by the router is `set firewall ipv6 +output filter ...` + +:::{note} +**Important note about default-actions:** +If default action for any base chain is not defined, then the default +action is set to **accept** for that chain. For custom chains, if default +action is not defined, then the default-action is set to **drop** +::: + +Custom firewall chains can be created, with commands +`set firewall ipv6 name <name> ...`. In order to use +such custom chain, a rule with **action jump**, and the appropiate **target** +should be defined in a base chain. + +## Firewall - IPv6 Rules + +For firewall filtering, firewall rules needs to be created. Each rule is +numbered, has an action to apply if the rule is matched, and the ability +to specify multiple criteria matchers. Data packets go through the rules +from 1 - 999999, so order is crucial. At the first match the action of the +rule will be executed. + +### Actions + +If a rule is defined, then an action must be defined for it. This tells the +firewall what to do if all criteria matchers defined for such rule do match. + +The action can be : + +> - `accept`: accept the packet. +> - `continue`: continue parsing next rule. +> - `drop`: drop the packet. +> - `reject`: reject the packet. +> - `jump`: jump to another custom chain. +> - `return`: Return from the current chain and continue at the next rule +> of the last chain. +> - `queue`: Enqueue packet to userspace. +> - `synproxy`: synproxy the packet. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return | synproxy] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return | synproxy] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> action + [accept | continue | drop | jump | queue | reject | return] + + This required setting defines the action of the current rule. If action is + set to jump, then jump-target is also needed. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + jump-target <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + jump-target <text> + + To be used only when action is set to ``jump``. Use this command to specify + jump target. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + queue <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + queue <0-65535> + + To be used only when action is set to ``queue``. Use this command to specify + queue target to use. Queue range is also supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + queue-options bypass +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + queue-options bypass + + To be used only when action is set to ``queue``. Use this command to let + packet go through firewall when no userspace software is connected to the + queue. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + queue-options fanout +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + queue-options fanout + + To be used only when action is set to ``queue``. Use this command to + distribute packets between several queues. +``` + +Also, **default-action** is an action that takes place whenever a packet does +not match any rule in it's chain. For base chains, possible options for +**default-action** are **accept** or **drop**. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter default-action + [accept | drop] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> default-action + [accept | drop | jump | queue | reject | return] + + This set the default action of the rule-set if no rule matched a packet + criteria. If default-action is set to ``jump``, then + ``default-jump-target`` is also needed. Note that for base chains, default + action can only be set to ``accept`` or ``drop``, while on custom chain, + more actions are available. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> default-jump-target <text> + + To be used only when ``defult-action`` is set to ``jump``. Use this + command to specify jump target for default rule. +``` + +:::{note} +**Important note about default-actions:** +If default action for any base chain is not defined, then the default +action is set to **accept** for that chain. For custom chains, if default +action is not defined, then the default-action is set to **drop**. +::: + +### Firewall Logs + +Logging can be enable for every single firewall rule. If enabled, other +log options can be defined. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> log + + Enable logging for the matched packet. If this configuration command is not + present, then log is not enabled. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter default-log +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> default-log + + Use this command to enable the logging of the default action on + the specified chain. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + log-options level [emerg | alert | crit | err | warn | notice + | info | debug] + + Define log-level. Only applicable if rule log is enable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + log-options group <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + log-options group <0-65535> + + Define log group to send message to. Only applicable if rule log is enable. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + log-options snapshot-length <0-9000> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + log-options snapshot-length <0-9000> + + Define length of packet payload to include in netlink message. Only + applicable if rule log is enable and log group is defined. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + log-options queue-threshold <0-65535> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + log-options queue-threshold <0-65535> + + Define number of packets to queue inside the kernel before sending them to + userspace. Only applicable if rule log is enable and log group is defined. +``` + +### Firewall Description + +For reference, a description can be defined for every single rule, and for +every defined custom chain. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> description <text> + + Provide a rule-set description to a custom firewall chain. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + description <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> description <text> + + Provide a description for each rule. +``` + +### Rule Status + +When defining a rule, it is enable by default. In some cases, it is useful to +just disable the rule, rather than removing it. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> disable +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> disable + + Command for disabling a rule but keep it in the configuration. +``` + +### Matching criteria + +There are a lot of matching criteria against which the packet can be tested. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + connection-status nat [destination | source] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + connection-status nat [destination | source] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + connection-status nat [destination | source] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + connection-status nat [destination | source] + + Match criteria based on nat connection status. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + connection-mark <1-2147483647> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + connection-mark <1-2147483647> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + connection-mark <1-2147483647> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + connection-mark <1-2147483647> + + Match criteria based on connection mark. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination address [address | addressrange | CIDR] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination address [address | addressrange | CIDR] + + Match criteria based on source and/or destination address. This is similar + to the network groups part, but here you are able to negate the matching + addresses. + + .. code-block:: none + + set firewall ipv6 name FOO rule 100 source address 2001:db8::202 +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination address-mask [address] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination address-mask [address] + + An arbitrary netmask can be applied to mask addresses to only match against + a specific portion. This is particularly useful with IPv6 as rules will + remain valid if the IPv6 prefix changes and the host + portion of systems IPv6 address is static (for example, with SLAAC or + `tokenised IPv6 addresses + <https://datatracker.ietf.org + /doc/id/draft-chown-6man-tokenised-ipv6-identifiers-02.txt>`_) + + This functions for both individual addresses and address groups. + + .. stop_vyoslinter + .. code-block:: none + + # Match any IPv6 address with the suffix ::0000:0000:0000:beef + set firewall ipv6 forward filter rule 100 destination address ::beef + set firewall ipv6 forward filter rule 100 destination address-mask ::ffff:ffff:ffff:ffff + # Address groups + set firewall group ipv6-address-group WEBSERVERS address ::1000 + set firewall group ipv6-address-group WEBSERVERS address ::2000 + set firewall ipv6 forward filter rule 200 source group address-group WEBSERVERS + set firewall ipv6 forward filter rule 200 source address-mask ::ffff:ffff:ffff:ffff + + .. start_vyoslinter +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination fqdn <fqdn> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination fqdn <fqdn> + + Specify a Fully Qualified Domain Name as source/destination matcher. Ensure + router is able to resolve such dns query. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination geoip country-code <country> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination geoip inverse-match +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination geoip inverse-match + + Match IP addresses based on its geolocation. More info: `geoip matching + <https://wiki.nftables.org/wiki-nftables/index.php/GeoIP_matching>`_. + Use inverse-match to match anything except the given country-codes. +``` + +Data is provided by DB-IP.com under CC-BY-4.0 license. Attribution required, +permits redistribution so we can include a database in images(~3MB +compressed). Includes cron script (manually callable by op-mode update +geoip) to keep database and rules updated. + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source mac-address <mac-address> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source mac-address <mac-address> + + Only in the source criteria, you can specify a mac-address. + + .. code-block:: none + + set firewall ipv6 input filter rule 100 source mac-address 00:53:00:11:22:33 + set firewall ipv6 input filter rule 101 source mac-address !00:53:00:aa:12:34 +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination port [1-65535 | portname | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination port [1-65535 | portname | start-end] + + A port can be set with a port number or a name which is here + defined: ``/etc/services``. + + .. code-block:: none + + set firewall ipv6 forward filter rule 10 source port '22' + set firewall ipv6 forward filter rule 11 source port '!http' + set firewall ipv6 forward filter rule 12 source port 'https' + + Multiple source ports can be specified as a comma-separated list. + The whole list can also be "negated" using ``!``. For example: + + .. code-block:: none + + set firewall ipv6 forward filter rule 10 source port '!22,https,3333-3338' +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination group address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination group address-group <name | !name> + + Use a specific address-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination group dynamic-address-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination group dynamic-address-group <name | !name> + + Use a specific dynamic-address-group. Prepend character ``!`` for inverted + matching criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination group network-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination group network-group <name | !name> + + Use a specific network-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination group port-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination group port-group <name | !name> + + Use a specific port-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination group domain-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination group domain-group <name | !name> + + Use a specific domain-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + source group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + destination group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + destination group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + destination group mac-group <name | !name> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + destination group mac-group <name | !name> + + Use a specific mac-group. Prepend character ``!`` for inverted matching + criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + dscp [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + dscp-exclude [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + dscp-exclude [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + dscp-exclude [0-63 | start-end] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + dscp-exclude [0-63 | start-end] + + Match based on dscp value. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + fragment [match-frag | match-non-frag] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + fragment [match-frag | match-non-frag] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + fragment [match-frag | match-non-frag] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + fragment [match-frag | match-non-frag] + + Match based on fragment criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + icmpv6 [code | type] <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + icmpv6 [code | type] <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + icmpv6 [code | type] <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + icmpv6 [code | type] <0-255> + + Match based on icmp|icmpv6 code and type. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + icmpv6 type-name <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + icmpv6 type-name <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + icmpv6 type-name <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + icmpv6 type-name <text> + + Match based on icmpv6 type-name criteria. Use tab for information + about what **type-name** criteria are supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + inbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + inbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + inbound-interface name <iface> + + Match based on inbound interface. Wilcard ``*`` can be used. + For example: ``eth2*``. Prepending character ``!`` for inverted matching + criteria is also supportd. For example ``!eth2`` +``` + +:::{note} +If an interface is attached to a non-default vrf, when using +**inbound-interface**, vrf name must be used. For example `set firewall +ipv6 forward filter rule 10 inbound-interface name MGMT` +::: + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + inbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + inbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + inbound-interface group <iface_group> + + Match based on inbound interface group. Prepending character ``!`` for + inverted matching criteria is also supportd. For example ``!IFACE_GROUP`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + outbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + outbound-interface name <iface> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + outbound-interface name <iface> + + Match based on outbound interface. Wilcard ``*`` can be used. + For example: ``eth2*``. Prepending character ``!`` for inverted matching + criteria is also supportd. For example ``!eth2`` +``` + +:::{note} +If an interface is attached to a non-default vrf, when using +**outbound-interface**, real interface name must be used. For example +`set firewall ipv6 forward filter rule 10 outbound-interface name eth0` +::: + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + outbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + outbound-interface group <iface_group> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + outbound-interface group <iface_group> + + Match based on outbound interface group. Prepending character ``!`` for + inverted matching criteria is also supportd. For example ``!IFACE_GROUP`` +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + ipsec [match-ipsec | match-none] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + ipsec [match-ipsec | match-none] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + ipsec [match-ipsec | match-none] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + ipsec [match-ipsec | match-none] + + Match based on ipsec criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + limit burst <0-4294967295> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + limit burst <0-4294967295> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + limit burst <0-4294967295> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + limit burst <0-4294967295> + + Match based on the maximum number of packets to allow in excess of rate. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + limit rate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + limit rate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + limit rate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + limit rate <text> + + Match based on the maximum average rate, specified as **integer/unit**. + For example **5/minutes** +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + packet-length <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + packet-length-exclude <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + packet-length-exclude <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + packet-length-exclude <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + packet-length-exclude <text> + + Match based on packet length criteria. Multiple values from 1 to 65535 + and ranges are supported. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + packet-type [broadcast | host | multicast | other] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + packet-type [broadcast | host | multicast | other] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + packet-type [broadcast | host | multicast | other] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + packet-type [broadcast | host | multicast | other] + + Match based on packet type criteria. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + protocol [<text> | <0-255> | all | tcp_udp] + + Match a protocol criteria. A protocol number or a name which is here + defined: ``/etc/protocols``. + Special names are ``all`` for all protocols and ``tcp_udp`` for tcp and udp + based packets. The ``!`` negate the selected protocol. + + .. code-block:: none + + set firewall ipv6 input filter rule 10 protocol tcp +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + recent time [second | minute | hour] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + recent time [second | minute | hour] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + recent time [second | minute | hour] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + recent time [second | minute | hour] + + Match bases on recently seen sources. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + tcp flags [not] <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + tcp flags [not] <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + tcp flags [not] <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + tcp flags [not] <text> + + Allowed values fpr TCP flags: ``ack``, ``cwr``, ``ecn``, ``fin``, ``psh``, + ``rst``, ``syn`` and ``urg``. Multiple values are supported, and for + inverted selection use ``not``, as shown in the example. + + .. code-block:: none + + set firewall ipv6 input filter rule 10 tcp flags 'ack' + set firewall ipv6 input filter rule 12 tcp flags 'syn' + set firewall ipv6 input filter rule 13 tcp flags not 'fin' +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + state [established | invalid | new | related] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + state [established | invalid | new | related] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + state [established | invalid | new | related] +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + state [established | invalid | new | related] + + Match against the state of a packet. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + time startdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + time starttime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + time stopdate <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + time stoptime <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + time weekdays <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + time weekdays <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + time weekdays <text> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + time weekdays <text> + + Time to match the defined rule. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + hop-limit <eq | gt | lt> <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + hop-limit <eq | gt | lt> <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + hop-limit <eq | gt | lt> <0-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + hop-limit <eq | gt | lt> <0-255> + + Match hop-limit parameter, where 'eq' stands for 'equal'; 'gt' stands for + 'greater than', and 'lt' stands for 'less than'. +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + recent count <1-255> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 forward filter rule <1-999999> + recent time <second | minute | hour> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 input filter rule <1-999999> + recent time <second | minute | hour> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 output filter rule <1-999999> + recent time <second | minute | hour> +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 name <name> rule <1-999999> + recent time <second | minute | hour> + + Match when 'count' amount of connections are seen within 'time'. These + matching criteria can be used to block brute-force attempts. +``` + +## Synproxy + +Synproxy connections + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [input | forward] filter rule <1-999999> + action synproxy +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [input | forward] filter rule <1-999999> + protocol tcp +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [input | forward] filter rule <1-999999> + synproxy tcp mss <501-65535> + + Set TCP-MSS (maximum segment size) for the connection +``` + +```{eval-rst} +.. cfgcmd:: set firewall ipv6 [input | forward] filter rule <1-999999> + synproxy tcp window-scale <1-14> + + Set the window scale factor for TCP window scaling +``` + +### Example synproxy + +Requirements to enable synproxy: + +> - Traffic must be symmetric +> - Synproxy relies on syncookies and TCP timestamps, ensure these are enabled +> - Disable conntrack loose track option + +```none +set system sysctl parameter net.ipv4.tcp_timestamps value '1' + +set system conntrack tcp loose disable +set system conntrack ignore ipv6 rule 10 destination port '8080' +set system conntrack ignore ipv6 rule 10 protocol 'tcp' +set system conntrack ignore ipv6 rule 10 tcp flags syn + +set firewall global-options syn-cookies 'enable' +set firewall ipv6 input filter rule 10 action 'synproxy' +set firewall ipv6 input filter rule 10 destination port '8080' +set firewall ipv6 input filter rule 10 inbound-interface name 'eth1' +set firewall ipv6 input filter rule 10 protocol 'tcp' +set firewall ipv6 input filter rule 10 synproxy tcp mss '1460' +set firewall ipv6 input filter rule 10 synproxy tcp window-scale '7' +set firewall ipv6 input filter rule 1000 action 'drop' +set firewall ipv6 input filter rule 1000 state invalid +``` + +## Operation-mode Firewall + +### Rule-set overview + +```{eval-rst} +.. opcmd:: show firewall + + This will show you a basic firewall overview + + .. code-block:: none + + vyos@vyos:~$ show firewall + Rulesets Information + + --------------------------------- + IPv4 Firewall "forward filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ----------------------------------------- + 5 jump all 0 0 iifname "eth1" jump NAME_VyOS_MANAGEMENT + 10 jump all 0 0 oifname "eth1" jump NAME_WAN_IN + 15 jump all 0 0 iifname "eth3" jump NAME_WAN_IN + default accept all + + --------------------------------- + IPv4 Firewall "name VyOS_MANAGEMENT" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- -------------------------------- + 5 accept all 0 0 ct state established accept + 10 drop all 0 0 ct state invalid + 20 accept all 0 0 ip saddr @A_GOOD_GUYS accept + 30 accept all 0 0 ip saddr @N_ENTIRE_RANGE accept + 40 accept all 0 0 ip saddr @A_VyOS_SERVERS accept + 50 accept icmp 0 0 meta l4proto icmp accept + default drop all 0 0 + + --------------------------------- + IPv6 Firewall "forward filter" + + Rule Action Protocol + ------- -------- ---------- + 5 jump all + 10 jump all + 15 jump all + default accept all + + --------------------------------- + IPv6 Firewall "input filter" + + Rule Action Protocol + ------- -------- ---------- + 5 jump all + default accept all + + --------------------------------- + IPv6 Firewall "ipv6_name IPV6-VyOS_MANAGEMENT" + + Rule Action Protocol + ------- -------- ---------- + 5 accept all + 10 drop all + 20 accept all + 30 accept all + 40 accept all + 50 accept ipv6-icmp + default drop all +``` + +```{eval-rst} +.. opcmd:: show firewall summary + + This will show you a summary of rule-sets and groups + + .. code-block:: none + + vyos@vyos:~$ show firewall summary + Ruleset Summary + + IPv6 Ruleset: + + Ruleset Hook Ruleset Priority Description + -------------- -------------------- ------------------------- + forward filter + input filter + ipv6_name IPV6-VyOS_MANAGEMENT + ipv6_name IPV6-WAN_IN PUBLIC_INTERNET + + IPv4 Ruleset: + + Ruleset Hook Ruleset Priority Description + -------------- ------------------ ------------------------- + forward filter + input filter + name VyOS_MANAGEMENT + name WAN_IN PUBLIC_INTERNET + + Firewall Groups + + Name Type References Members + ----------------------- ------------------ ----------------------- ---------------- + PBX address_group WAN_IN-100 198.51.100.77 + SERVERS address_group WAN_IN-110 192.0.2.10 + WAN_IN-111 192.0.2.11 + WAN_IN-112 192.0.2.12 + WAN_IN-120 + WAN_IN-121 + WAN_IN-122 + SUPPORT address_group VyOS_MANAGEMENT-20 192.168.1.2 + WAN_IN-20 + PHONE_VPN_SERVERS address_group WAN_IN-160 10.6.32.2 + PINGABLE_ADRESSES address_group WAN_IN-170 192.168.5.2 + WAN_IN-171 + PBX ipv6_address_group IPV6-WAN_IN-100 2001:db8::1 + SERVERS ipv6_address_group IPV6-WAN_IN-110 2001:db8::2 + IPV6-WAN_IN-111 2001:db8::3 + IPV6-WAN_IN-112 2001:db8::4 + IPV6-WAN_IN-120 + IPV6-WAN_IN-121 + IPV6-WAN_IN-122 + SUPPORT ipv6_address_group IPV6-VyOS_MANAGEMENT-20 2001:db8::5 + IPV6-WAN_IN-20 + +``` + +```{eval-rst} +.. opcmd:: show firewall ipv6 [forward | input | output] filter +``` + +```{eval-rst} +.. opcmd:: show firewall ipv6 ipv6-name <name> + + This command will give an overview of a single rule-set. + + .. code-block:: none + + vyos@vyos:~$ show firewall ipv6 input filter + Ruleset Information + + --------------------------------- + ipv6 Firewall "input filter" + + Rule Action Protocol Packets Bytes Conditions + ------- -------- ---------- --------- ------- ------------------------------------------------------------------------------ + 10 jump all 13 1456 iifname "eth1" jump NAME6_INP-ETH1 + 20 accept ipv6-icmp 10 1112 meta l4proto ipv6-icmp iifname "eth0" prefix "[ipv6-INP-filter-20-A]" accept + default accept all 14 1584 + + vyos@vyos:~$ +``` + +```{eval-rst} +.. opcmd:: show firewall ipv6 [forward | input | output] + filter rule <1-999999> +``` + +```{eval-rst} +.. opcmd:: show firewall ipv6 name <name> rule <1-999999> +``` + +```{eval-rst} +.. opcmd:: show firewall ipv6 ipv6-name <name> rule <1-999999> + + This command will give an overview of a rule in a single rule-set +``` + +```{eval-rst} +.. opcmd:: show firewall group <name> + + Overview of defined groups. You see the type, the members, and where the + group is used. + + .. code-block:: none + + vyos@vyos:~$ show firewall group LAN + Firewall Groups + + Name Type References Members + ------------ ------------------ ----------------------- ---------------- + LAN ipv6_network_group IPV6-VyOS_MANAGEMENT-30 2001:db8::0/64 + IPV6-WAN_IN-30 + LAN network_group VyOS_MANAGEMENT-30 192.168.200.0/24 + WAN_IN-30 + +``` + +```{eval-rst} +.. opcmd:: show firewall statistics + + This will show you a statistic of all rule-sets since the last boot. +``` + +### Show Firewall log + +```{eval-rst} +.. opcmd:: show log firewall +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv6 +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv6 [forward | input | output | name] +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv6 [forward | input | output] filter +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv6 name <name> +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv6 [forward | input | output] filter rule <rule> +``` + +```{eval-rst} +.. opcmd:: show log firewall ipv6 name <name> rule <rule> + + Show the logs of all firewall; show all ipv6 firewall logs; show all logs + for particular hook; show all logs for particular hook and priority; + show all logs for particular custom chain; show logs for specific Rule-Set. +``` + +### Example Partial Config + +```none +firewall { + ipv6 { + input { + filter { + rule 10 { + action jump + inbound-interface { + name eth1 + } + jump-target INP-ETH1 + } + rule 20 { + action accept + inbound-interface { + name eth0 + } + log + protocol ipv6-icmp + } + } + } + name INP-ETH1 { + default-action drop + default-log + rule 10 { + action accept + protocol tcp_udp + } + } + } +} +``` + +### Update geoip database + +```{eval-rst} +.. opcmd:: update geoip + + Command used to update GeoIP database and firewall sets. +``` diff --git a/docs/configuration/firewall/md-zone.md b/docs/configuration/firewall/md-zone.md new file mode 100644 index 00000000..40ffd4b4 --- /dev/null +++ b/docs/configuration/firewall/md-zone.md @@ -0,0 +1,177 @@ +--- +lastproofread: '2023-11-01' +--- + +(firewall-zone)= + +# Zone Based Firewall + +## Overview + +:::{note} +Starting from VyOS 1.4-rolling-202308040557, a new firewall +structure can be found on all vyos instalations. Zone based firewall was +removed in that version, but re introduced in VyOS 1.4 and 1.5. All +versions built after 2023-10-22 has this feature. +Documentation for most of the new firewall CLI can be +found in the [firewall](https://docs.vyos.io/en/latest/configuration/firewall/general.html) +chapter. The legacy firewall is still available for versions before +1.4-rolling-202308040557 and can be found in the +{doc}`legacy firewall configuration </configuration/firewall/general-legacy>` +chapter. +::: + +In this section there's useful information of all firewall configuration that +is needed for zone-based firewall. +Configuration commands covered in this section: + +```{eval-rst} +.. cfgcmd:: set firewall zone ... +``` + +From main structure defined in +{doc}`Firewall Overview</configuration/firewall/index>` +in this section you can find detailed information only for the next part +of the general structure: + +```none +- set firewall + * zone + - custom_zone_name + + ... +``` + +In zone-based policy, interfaces are assigned to zones, and inspection policy +is applied to traffic moving between the zones and acted on according to +firewall rules. A zone is a group of interfaces that have similar functions or +features. It establishes the security borders of a network. A zone defines a +boundary where traffic is subjected to policy restrictions as it crosses to +another region of a network. + +Key Points: + +- A zone must be configured before an interface is assigned to it and an + interface can be assigned to only a single zone. +- All traffic to and from an interface within a zone is permitted. +- All traffic between zones is affected by existing policies +- Traffic cannot flow between zone member interface and any interface that is + not a zone member. +- You need 2 separate firewalls to define traffic: one for each direction. + +:::{note} +In {vytask}`T2199` the syntax of the zone configuration was changed. +The zone configuration moved from `zone-policy zone <name>` to `firewall +zone <name>`. +::: + +## Configuration + +As an alternative to applying policy to an interface directly, a zone-based +firewall can be created to simplify configuration when multiple interfaces +belong to the same security zone. Instead of applying rule-sets to interfaces, +they are applied to source zone-destination zone pairs. + +A basic introduction to zone-based firewalls can be found [here](https://support.vyos.io/en/kb/articles/a-primer-to-zone-based-firewall), +and an example at {ref}`examples-zone-policy`. + +### Define a Zone + +To define a zone setup either one with interfaces or a local zone. + +```{eval-rst} +.. cfgcmd:: set firewall zone <name> interface <interface> + + Set interfaces to a zone. A zone can have multiple interfaces. + But an interface can only be a member in one zone. +``` + +```{eval-rst} +.. cfgcmd:: set firewall zone <name> local-zone + + Define the zone as a local zone. A local zone has no interfaces and + will be applied to the router itself. +``` + +```{eval-rst} +.. cfgcmd:: set firewall zone <name> default-action [drop | reject] + + Change the default-action with this setting. +``` + +```{eval-rst} +.. cfgcmd:: set firewall zone <name> description + + Set a meaningful description. +``` + +### Applying a Rule-Set to a Zone + +Before you are able to apply a rule-set to a zone you have to create the zones +first. + +It helps to think of the syntax as: (see below). The 'rule-set' should be +written from the perspective of: *Source Zone*-to->\*Destination Zone\* + +```{eval-rst} +.. cfgcmd:: set firewall zone <Destination Zone> from <Source Zone> + firewall name <rule-set> +``` + +```{eval-rst} +.. cfgcmd:: set firewall zone <name> from <name> firewall name + <rule-set> +``` + +```{eval-rst} +.. cfgcmd:: set firewall zone <name> from <name> firewall ipv6-name + <rule-set> + + You apply a rule-set always to a zone from an other zone, it is recommended + to create one rule-set for each zone pair. + + .. code-block:: none + + set firewall zone DMZ from LAN firewall name LANv4-to-DMZv4 + set firewall zone LAN from DMZ firewall name DMZv4-to-LANv4 +``` + +## Operation-mode + +```{eval-rst} +.. opcmd:: show firewall zone-policy + + This will show you a basic summary of zones configuration. + + .. code-block:: none + + vyos@vyos:~$ show firewall zone-policy + Zone Interfaces From Zone Firewall IPv4 Firewall IPv6 + ------ ------------ ----------- --------------- --------------- + LAN eth1 WAN WAN_to_LAN + eth2 + LOCAL LOCAL LAN LAN_to_LOCAL + WAN WAN_to_LOCAL WAN_to_LOCAL_v6 + WAN eth3 LAN LAN_to_WAN + eth0 LOCAL LOCAL_to_WAN + vyos@vyos:~$ +``` + +```{eval-rst} +.. opcmd:: show firewall zone-policy zone <zone> + + This will show you a basic summary of a particular zone. + + .. code-block:: none + + vyos@vyos:~$ show firewall zone-policy zone WAN + Zone Interfaces From Zone Firewall IPv4 Firewall IPv6 + ------ ------------ ----------- --------------- --------------- + WAN eth3 LAN LAN_to_WAN + eth0 LOCAL LOCAL_to_WAN + vyos@vyos:~$ show firewall zone-policy zone LOCAL + Zone Interfaces From Zone Firewall IPv4 Firewall IPv6 + ------ ------------ ----------- --------------- --------------- + LOCAL LOCAL LAN LAN_to_LOCAL + WAN WAN_to_LOCAL WAN_to_LOCAL_v6 + vyos@vyos:~$ +``` |
