* How to modify conntrack accounting? @ 2013-04-02 19:11 Ed W 2013-04-02 20:46 ` Eric Leblond 0 siblings, 1 reply; 5+ messages in thread From: Ed W @ 2013-04-02 19:11 UTC (permalink / raw) To: netfilter-devel Hi, I have a requirement to account for "bytes I pay for" over some link, and conntrack very nearly gives me the right answer... This link uses accounting somewhat like ATM, where the IP data is sliced into fixed size cells and you have to pay for the overhead per cell, plus the wasted space in the extra cell. I look at the latest kernel sources and all the packet size accounting seems to be performed in: nf_conntrack_core.c / __nf_ct_refresh_acct() and __nf_ct_kill_acct(). I see several options: 1) Modify the accounting procedure in nf_conntrack_core.c so that certain connections will use a different accounting formula. However, how would I mark from userspace that a certain interface has this unusual accounting property? 2) Could/Should I produce a new netfilter module which operates per packet, looks up the connection object for a given packet, and then adds a "fudge" to the connection accounting number to correct for the effect of the odd packetisation? Presumably from userspace you would then simply create an iptables rule tagging packets out of a certain interface with "-m my_odd_accounting". I don't yet know how to build option 2), but it seems appealing (anyone got any consultancy time and want to bill me to build it?) I would appreciate feedback from those more knowledgeable? Given the small niche of the solution a modification to nf_conntrack_core.c is appealing, but I'm unsure how to indicate which are the peculiar interfaces, only userspace will know this. Thanks for your thoughts/hints Ed W ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to modify conntrack accounting? 2013-04-02 19:11 How to modify conntrack accounting? Ed W @ 2013-04-02 20:46 ` Eric Leblond 2013-04-02 22:45 ` Ed W 0 siblings, 1 reply; 5+ messages in thread From: Eric Leblond @ 2013-04-02 20:46 UTC (permalink / raw) To: Ed W; +Cc: netfilter-devel [-- Attachment #1: Type: text/plain, Size: 2146 bytes --] Hello, Le mardi 02 avril 2013 à 20:11 +0100, Ed W a écrit : > Hi, I have a requirement to account for "bytes I pay for" over some > link, and conntrack very nearly gives me the right answer... This link > uses accounting somewhat like ATM, where the IP data is sliced into > fixed size cells and you have to pay for the overhead per cell, plus the > wasted space in the extra cell. I'm not sure I really understood your ATM comparison but why not use the new accounting system like described here: https://home.regit.org/2012/07/flow-accounting-with-netfilter-and-ulogd2/ BR, > > I look at the latest kernel sources and all the packet size accounting > seems to be performed in: nf_conntrack_core.c / __nf_ct_refresh_acct() > and __nf_ct_kill_acct(). > > I see several options: > > 1) Modify the accounting procedure in nf_conntrack_core.c so that > certain connections will use a different accounting formula. However, > how would I mark from userspace that a certain interface has this > unusual accounting property? > > 2) Could/Should I produce a new netfilter module which operates per > packet, looks up the connection object for a given packet, and then adds > a "fudge" to the connection accounting number to correct for the effect > of the odd packetisation? Presumably from userspace you would then > simply create an iptables rule tagging packets out of a certain > interface with "-m my_odd_accounting". > > I don't yet know how to build option 2), but it seems appealing (anyone > got any consultancy time and want to bill me to build it?) > > I would appreciate feedback from those more knowledgeable? Given the > small niche of the solution a modification to nf_conntrack_core.c is > appealing, but I'm unsure how to indicate which are the peculiar > interfaces, only userspace will know this. > > Thanks for your thoughts/hints > > Ed W > -- > To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html [-- Attachment #2: This is a digitally signed message part --] [-- Type: application/pgp-signature, Size: 190 bytes --] ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to modify conntrack accounting? 2013-04-02 20:46 ` Eric Leblond @ 2013-04-02 22:45 ` Ed W 2013-04-03 9:05 ` Eric Leblond 0 siblings, 1 reply; 5+ messages in thread From: Ed W @ 2013-04-02 22:45 UTC (permalink / raw) To: Eric Leblond; +Cc: netfilter-devel On 02/04/2013 21:46, Eric Leblond wrote: > Hello, > > Le mardi 02 avril 2013 à 20:11 +0100, Ed W a écrit : >> Hi, I have a requirement to account for "bytes I pay for" over some >> link, and conntrack very nearly gives me the right answer... This link >> uses accounting somewhat like ATM, where the IP data is sliced into >> fixed size cells and you have to pay for the overhead per cell, plus the >> wasted space in the extra cell. > I'm not sure I really understood your ATM comparison but why not use the > new accounting system like described here: > > https://home.regit.org/2012/07/flow-accounting-with-netfilter-and-ulogd2/ > Thanks - I really need the raw conntrack detail so that I can do my own aggregations (its quite a complex requirement for accounting) Apologies for the ATM assumptions. OK, ATM works by encapsulating the data into small fixed sized packets of 48 bytes with a 5 byte header. So for example if you send a 1000 byte IP packet then it will consume 21 ATM cells, which means a total bandwidth you pay for of 21 x (48+5) = 1,113 bytes. Annoyingly even the last (part filled) packet still has to be 48 bytes, plus you have that 5 byte header on each packet. The above is how ADSL connections work, and why using standard QOS fails to work as expected when you have a bunch of small packets (ATM bandwidth becomes large compared with IP bandwidth). I believe newer kernels have some options to correctly compute the overheads for ATM encapsulation, effectively I need to implement something similar for conntrack Thanks for further thoughts Ed W -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to modify conntrack accounting? 2013-04-02 22:45 ` Ed W @ 2013-04-03 9:05 ` Eric Leblond 2013-04-03 9:58 ` Ed W 0 siblings, 1 reply; 5+ messages in thread From: Eric Leblond @ 2013-04-03 9:05 UTC (permalink / raw) To: Ed W; +Cc: netfilter-devel Hi, On Tue, 2013-04-02 at 23:45 +0100, Ed W wrote: > On 02/04/2013 21:46, Eric Leblond wrote: > > Hello, > > > > Le mardi 02 avril 2013 à 20:11 +0100, Ed W a écrit : > >> Hi, I have a requirement to account for "bytes I pay for" over some > >> link, and conntrack very nearly gives me the right answer... This link > >> uses accounting somewhat like ATM, where the IP data is sliced into > >> fixed size cells and you have to pay for the overhead per cell, plus the > >> wasted space in the extra cell. > > I'm not sure I really understood your ATM comparison but why not use the > > new accounting system like described here: > > > > https://home.regit.org/2012/07/flow-accounting-with-netfilter-and-ulogd2/ > > > > Thanks - I really need the raw conntrack detail so that I can do my own > aggregations (its quite a complex requirement for accounting) > > Apologies for the ATM assumptions. OK, ATM works by encapsulating the > data into small fixed sized packets of 48 bytes with a 5 byte header. > So for example if you send a 1000 byte IP packet then it will consume 21 > ATM cells, which means a total bandwidth you pay for of 21 x (48+5) = > 1,113 bytes. Annoyingly even the last (part filled) packet still has > to be 48 bytes, plus you have that 5 byte header on each packet. > > The above is how ADSL connections work, and why using standard QOS fails > to work as expected when you have a bunch of small packets (ATM > bandwidth becomes large compared with IP bandwidth). OK that is what I was fearing. You want to do ATM accounting at the IP level ;) > I believe newer kernels have some options to correctly compute the > overheads for ATM encapsulation, effectively I need to implement > something similar for conntrack > > Thanks for further thoughts You said you want a per-interface accounting but conntrack is not interface aware. So a better solution may be to update nfacct modue to increment counter with ATM-rounded value at each packet. Given the type of patch this will require, it should be easy to maintain other time. This will provide a more performant and easy to use framework. By the way, if you want consulting time, I've got some available ;) BR, > > Ed W > > -- > To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html -- Eric Leblond <eric@regit.org> Blog: https://home.regit.org/ -- To unsubscribe from this list: send the line "unsubscribe netfilter-devel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 5+ messages in thread
* Re: How to modify conntrack accounting? 2013-04-03 9:05 ` Eric Leblond @ 2013-04-03 9:58 ` Ed W 0 siblings, 0 replies; 5+ messages in thread From: Ed W @ 2013-04-03 9:58 UTC (permalink / raw) To: Eric Leblond; +Cc: netfilter-devel On 03/04/2013 10:05, Eric Leblond wrote: >> Thanks - I really need the raw conntrack detail so that I can do my own >> aggregations (its quite a complex requirement for accounting) >> >> Apologies for the ATM assumptions. OK, ATM works by encapsulating the >> data into small fixed sized packets of 48 bytes with a 5 byte header. >> So for example if you send a 1000 byte IP packet then it will consume 21 >> ATM cells, which means a total bandwidth you pay for of 21 x (48+5) = >> 1,113 bytes. Annoyingly even the last (part filled) packet still has >> to be 48 bytes, plus you have that 5 byte header on each packet. >> >> The above is how ADSL connections work, and why using standard QOS fails >> to work as expected when you have a bunch of small packets (ATM >> bandwidth becomes large compared with IP bandwidth). > OK that is what I was fearing. You want to do ATM accounting at the IP > level ;) Actually, although others probably want this, my requirements are very slightly different. I have to account for charged bandwidth over an (expensive) satellite network, the specification is a bit peculiar, but I suspect that it's a type of MLPPP (same basic scenario though, cells of xx bytes with a y byte overhead) > You said you want a per-interface accounting but conntrack is not > interface aware. Yes, so I need to tag my flows in some way that conntrack can see. > So a better solution may be to update nfacct modue to > increment counter with ATM-rounded value at each packet. Given the type > of patch this will require, it should be easy to maintain other time. > This will provide a more performant and easy to use framework. OK, can I run the larger requirements past you because I like the idea of nfacct, but unsure that it will do what I desire - I have a router with multiple internet connections. Could be anything, but lets assume we have 1) wifi to the internet, 2) 3G datacard (cellular) and 3) a relatively expensive satellite link. - Customer is mobile so any of the above may work and roughly they will want to choose the cheapest wherever they are - We provide a web interface which allows the customer to indicate a route preference and after that we use forced routing to put all the customers data out of the correct internet connection (interestingly this means two clients can use different internet connections at the same time, there is not a single primary internet connection at any moment) - For now I need to log bandwidth consumed during a session (start/end time) using the tuple (customer, inet), IP/MAC+Time will be good enough to identify the customer for this scenario. This will be dumped into some radius accounting server. - We will need interim updates on bandwidth consumed during a session in order to implement access control such that if the user exceeds xxMB or so much time online, etc. - In the future we require more detailed bandwidth breakdown, eg we can plot some pretty graphs of usage by customer / protocol / inet choice / time. Essentially we want to be able to show that "bob" was surfing facebook during his lunchbreak, over the expensive satellite connection. Conntrack accounting gives me fairly close to the flows I want (seems to drop a few ICMP packets, but ...). What I need is to be able to adjust for the services where we have some funny accounting due to being rounded into "cells". It's not quite close enough to just guess. I updated the nDPI module a month or so back to give some L7 capabilities to the kernel. However, its a bit icky and I'm still not sure how to approach proper integration there though: - I think I can see how to extend conntrack so that nDPI netfilter can store it's tracking info in the conntrack. This means we can tag all connections with L7 info. However, I haven't figured out how to extend this to userspace so that it's emitted as part of the connection accounting info? - Also nDPI is moving in the direction of being extremely flexible and emitting full info about a flow, eg "this is an HTTPS connection with a cert for somewhere.com". So now I'm thinking that the netfilter integration should instead match the connection but emit the details of that match through nflog? After all the design of nDPI is to categorise a connection and once categorised that's the end of it, no point dragging around that info in kernel space - Alternatively we could leave all connection marking to userspace, ie the netfilter module could match packets and based on that I tag the flow with some connmark or assign it to pfacct category? So, in theory how well would pfacct handle the situation of: Separate accounting bin for: - Source IP (either class C or possibly class B) - Output inet interface (up to 32 of them) - this changes the byte counting forumula - L7 protocol used (up to 255) I have a captive portal which notices users arriving and so some of the above can be build dynamically, however, I'm trying to build everything such that it's setup once at boot and stays static thereafter Could I trouble you for your thoughts please? > By the way, if you want consulting time, I've got some available ;) Sure - I'm interested Cheers Ed W ^ permalink raw reply [flat|nested] 5+ messages in thread
end of thread, other threads:[~2013-04-03 9:58 UTC | newest] Thread overview: 5+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-04-02 19:11 How to modify conntrack accounting? Ed W 2013-04-02 20:46 ` Eric Leblond 2013-04-02 22:45 ` Ed W 2013-04-03 9:05 ` Eric Leblond 2013-04-03 9:58 ` Ed W
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).