kern/121807: Sugestion: TCP and UDP port_table in ipfw

Ganbold ganbold at micom.mng.net
Thu Sep 25 11:30:04 UTC 2008


The following reply was made to PR kern/121807; it has been noted by GNATS.

From: Ganbold <ganbold at micom.mng.net>
To: bug-followup at FreeBSD.org
Cc: goffredo at gmail.com, Vadim Goncharov <vadim_nuclight at mail.ru>
Subject: Re: kern/121807: Sugestion: TCP and UDP port_table in ipfw
Date: Thu, 25 Sep 2008 19:20:27 +0800

 Hi,
 
 Vadim Goncharov wrote:
 >  
 >  > Why not exist a TCP/UDP port_table for IPFW? It can solve 30 itens limit in ipfw rule. It is good to use in QoS.
 >  > Example
 >  > ipfw add allow { tcp or udp } from any port_table(10) to any
 >  > ipfw port_table 10 add 20,21,25,110,443,993,995,1025-65535
 >  > # Deny bad ports
 >  > ipfw add deny { tcp or udp } from any to any port_table(11)
 >  > ipfw port_table 11 add 135,137-139,445
 >  > ipfw add queue 100 udp from any port_table(20) to any
 >  > ipfw port_table(20) add 123,53
 >  
 >  For what puprose should it _really_ serve? Limit-upping? Per-packet speed
 >  optimisation? More handy config preapring? Should that tables serve as
 >  a collection-only, or do have tableargs, and for what practical purpose that
 >  tableargs would be useful?
 >  
 >  If it is simply annoying to put long list in config several times, then it is
 >  correctly solved by shell vars:
 >  good_ports="20,21,25,110,443,993,995,1025-65535"
 >  
 >  ipfw add allow { tcp or udp } from any $good_ports to any
 >  ipfw add allow { tcp or udp } from ant to $my_server $good_ports
 >  
 >  If you care about both value-repeating, limit of 30 items and slightly about
 >  speed of packet processing, then you'd better classify your traffic with
 >  or-blocks on start of ruleset with tags:
 >  
 >  ipfw add 1 count tag 1 { src-port 20,21,25,110,443,993,995,1025-65535  \
 >       or src-port 1,2,3,4,5,6,7,8,9,10,11,12,13,...long-list2...,29,30  \
 >       or src-port ...list3... } // can have up to 8 full 30-port blocks per rule
 >  ipfw add 2 count tag 2 dst-port 135,137-139,445 // and so on
 >  
 >  Packet can have more than one tag at a time, so then you can write like:
 >  
 >  ipfw add queue 100 udp from any to any tagged 3
 >  ipfw add allow { tcp or udp } from any to any tagged 1,2
 >  
 >  
 >  And if your suggested port table is concerned on a per-packet performance, like
 >  our IP tables do, then how do you suggest it to be implemented in-kernel?
 >  Current tables for IP are radix trees, they consume a lot of kernel memory
 >  (which is a scarce resource) and process in term of mask - but it is not
 >  handy to specify ports in form like "128/8". And any form of tree will consume
 >  to a lot of memory per entry.
 >  
 >  It can be thought as a bit set, one bit for every port, very fast, but will
 >  consume 8K per one table - 1 meg for 128 such tables, unacceptable, again.
 >  
 >  So, I think it is best to use tags for your purposes.
 
 For small number of port entries I thought port lookup table
 functionality is quite useful. It gives benefit like no need to modify 
 existing rule,
 adding/deleting port entries is easy.
 
 I did some small tests and it seems like working.
 
 Patches are at:
 http://people.freebsd.org/~ganbold/ipfw_port_table/
 
 The output of some usage samples is at:
 http://people.freebsd.org/~ganbold/ipfw_port_table/ipfw_port_table_usage_sample.txt 
 
 
 Patches can be successfully applied to CURRENT. Didn't test RELENG_7 due to
 no RELENG_7  PC :)
 Please let me know your thoughts. I'm happy to discuss to improve the 
 patch.
 Correct me if I'm doing something wrong here.
 
 thanks,
 
 Ganbold
 


More information about the freebsd-ipfw mailing list