mirror of
				https://github.com/vyos/vyos-documentation.git
				synced 2025-10-26 08:41:46 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			190 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
			
		
		
	
	
			190 lines
		
	
	
		
			7.1 KiB
		
	
	
	
		
			ReStructuredText
		
	
	
	
	
	
| :lastproofread: 2024-07-02
 | |
| 
 | |
| .. _firewall-flowtables-configuration:
 | |
| 
 | |
| #################################
 | |
| Flowtables Firewall Configuration
 | |
| #################################
 | |
| 
 | |
| .. note:: **Documentation under development**
 | |
| 
 | |
| ********
 | |
| Overview
 | |
| ********
 | |
| 
 | |
| In this section there's useful information on all firewall configuration that
 | |
| can be done regarding flowtables.
 | |
| 
 | |
| .. cfgcmd:: set firewall flowtables ...
 | |
| 
 | |
| From the 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:
 | |
| 
 | |
| .. code-block:: none
 | |
| 
 | |
|    - set firewall
 | |
|        * flowtable
 | |
|             - custom_flow_table
 | |
|                + ...
 | |
| 
 | |
| 
 | |
| Flowtables allow 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:
 | |
| 
 | |
| .. cfgcmd:: set firewall flowtable <flow_table_name> interface <iface>
 | |
| 
 | |
|    Define interfaces to be used in the flowtable.
 | |
| 
 | |
| .. cfgcmd:: set firewall flowtable <flow_table_name> description <text>
 | |
| 
 | |
| Provide a description to the flow table.
 | |
| 
 | |
| .. 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:
 | |
| 
 | |
| .. cfgcmd:: set firewall [ipv4 | ipv6] forward filter rule <1-999999>
 | |
|    action offload
 | |
| 
 | |
|    Create firewall rule in forward chain, and set action to ``offload``.
 | |
| 
 | |
| .. 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 considered in this setup:
 | |
| 
 | |
|    * Two interfaces are going to be used in the flowtables: eth0 and eth1
 | |
| 
 | |
|    * Minimum firewall ruleset is provided, which includes some filtering rules,
 | |
|      and appropriate rules for using flowtable offload capabilities.
 | |
| 
 | |
| As described, the first packet will be evaluated by the firewall path, so a
 | |
| desired connection should be explicitly accepted. Same thing should be taken
 | |
| into account for traffic in reverse order. In most cases state policies are
 | |
| used in order to accept a connection in the reverse path.
 | |
| 
 | |
| We will only accept traffic coming from interface eth0, protocol tcp and
 | |
| destination port 1122. All other traffic trespassing the router should be
 | |
| blocked.
 | |
| 
 | |
| Commands
 | |
| --------
 | |
| 
 | |
| .. code-block:: 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. Firstly, a 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 an 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. The 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 the traditional path, will be
 | |
|    offloaded and use the **Fast Path**.
 | |
| 
 | |
| Checks
 | |
| ------
 | |
| 
 | |
| It's time to check the conntrack table, to see if any connections were accepted,
 | |
| and if it was properly offloaded
 | |
| 
 | |
| .. code-block:: 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:~$
 |