lockless in-kernel NAT master
authorbycn82 <bycn82@web>
Tue, 21 Jun 2016 09:11:52 +0000 (09:11 +0000)
committerCharlie Root <root@leaf.dragonflybsd.org>
Tue, 21 Jun 2016 09:11:52 +0000 (09:11 +0000)
docs/ipfw3/index.mdwn

index 0ef48a6..fc1fb7c 100644 (file)
@@ -4,7 +4,7 @@
 
 bycn82
 
-9 Jun. 2016 (Dragon Boat Festival)
+21 Jun, 2016
 
 ---
 
@@ -24,13 +24,13 @@ This ipfw was rewritten from scratch for DragonflyBSD and named 'ipfw3', it is i
 ## Brief notes on design
 Ipfw3 was in modular design. all the functionalities are implemented in different loadable modules, it can be loaded when it is required. the core framework of the ipfw3 only comes with default'accept' or 'deny' actions. by triggering below command, the core module will be loaded.
 
-        kldload ipfw3
+    kldload ipfw3
 
 the fundamental core framework is loaded now. 
 
 More basic firewall filtering features like 'filtering based on source IP' are implemented in basic module, so basic module need to be loaded before we start to the features. and below is the command to load the basic module, the basic module is relying on the core framework, so the core framework will be loaded automatically if it is not loaded yet,
 
-        kldload ipfw3_basic
+    kldload ipfw3_basic
 
 The basic module is loaded now. then the user can start to use the filters which was implemented in the basic module. besides the basic module, there are layer2 module, layer4 module, in-kernel NAT module, dummynet module.
 
@@ -179,15 +179,15 @@ where multiple enable or disable sections can be specified.  Command execution i
 In the following example, We need to create several rules in order to block ICMP traffic from whole range of the network 192.168.0.0/24.
 
     ipfw3 add deny icmp from 192.168.0.1
- ipfw3 add deny icmp from 192.168.0.2
- ipfw3 add deny icmp from 192.168.0.3
- ...
- ipfw3 add deny icmp from 192.168.0.254
   ipfw3 add deny icmp from 192.168.0.2
   ipfw3 add deny icmp from 192.168.0.3
   ...
   ipfw3 add deny icmp from 192.168.0.254
 
 The firewall need to process the 254 lines of rule line by line. in this situation, the lookup table was introduced in order to increase the performance and enhance the usability.
 
     ipfw3 table 1 append range 192.168.0.0/24
- ipfw3 add deny icmp from table 1
   ipfw3 add deny icmp from table 1
  
 and lookup table are supported by multiple filters.
 
@@ -245,11 +245,13 @@ Above example can immediately  insert a state which will link to rule 1000 for t
   
 ## In-Kernel NAT
 
-Ipfw3 supports NAT using the kernel version of libalias which is a moderately portable set of functions designed to assist in the process of IP masquerading and network address translation. Out-going packets from a local network with unregistered IP addresses can be aliased to appear as if they came from an accessible IP address. Incoming packets are then de-aliased so that they are sent to the correct machine on the local network.
+Ipfw3 supports in-kernel NAT using the kernel version of libalias which is a moderately portable set of functions designed to assist in the process of IP masquerading and network address translation. Out-going packets from a local network with unregistered IP addresses can be aliased to appear as if they came from an accessible IP address. Incoming packets are then de-aliased so that they are sent to the correct machine on the local network. 
 
-A certain amount of flexibility is built into the packet aliasing engine.In the simplest mode of operation, a many-to-one address mapping takes place between the local network and the packet aliasing host.  This is known as IP masquerading. In addition, one-to-one mappings between local and public addresses can also be implemented, which is known as static NAT.  In between these extremes, different groups of private addresses can be linked to different public addresses, comprising several distinct many-to-one mappings.  Also, a given public address and port can be statically redirected to a private address/port.
+A certain amount of flexibility is built into the packet aliasing engine. In the simplest mode of operation, a many-to-one address mapping takes place between the local network and the packet aliasing host.  This is known as IP masquerading. In addition, one-to-one mappings between local and public addresses can also be implemented, which is known as static NAT.  In between these extremes, different groups of private addresses can be linked to different public addresses, comprising several distinct many-to-one mappings.  Also, a given public address and port can be statically redirected to a private address/port.
 
-Due to the nature of the behaviour in NAT, the packet is possible will be handled by different CPUs before and after the NAT. Ipfw3 will automatically manipulate the NAT records in different context of the relevant CPUs. so in-kernel NAT in DragonflyBSD is the only true lockless in-kernel NAT amount all common opensource operating systems.
+In ipfw3, each CPU has its own context, and by storing the alias link records into different context according to the CPU, the lock can be removed in order to acheve the best performance. and due to the nature of NAT, the outgoing and returnning packets are possible to be handled by different CPUs, to ensure the return traffic and be translated back to the correct address, the newly created alias_link are required to be duplicated and inserted into contexts of both CPUs. 
+
+So this in-kernel NAT in DragonflyBSD is the only true lockless in-kernel NAT amount all common opensource operating systems.
 
 ## Ipfwsync
 
@@ -275,11 +277,11 @@ Below command to verify whether the ipfw3 centre can send the test message to al
 
 Ipfw3 support 10 pseudo ipfw interfaces for logging. and the pseudo intercaces can be create with below command:
 
-        ifconfig ipfw1 create
+    ifconfig ipfw1 create
 
 Traffic matching a rule with the 'log' action will be captured by the BPF and duplicated into an ipfw pseudo interface accordingly. e.g.
 
-        ipfw add 100 allow log 1 icmp from 8.8.8.8
+    ipfw3 add 100 allow log 1 icmp from 8.8.8.8
 
 Above rule will attach the ICMP packet to the ipfw1 interface and the ICMP packets are from 8.8.8.8.