Re: libipset usability suggestions/advise

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi,

On Mon, 26 Dec 2011, Jaco Kroon wrote:

> I've spent most of the day trying to hook directly into libipset, and 
> eventually gave up settling for interacting with ipset via system() and 
> popen() using the command line.

That's bad, the intention at writing the library was to make possible 
creating other interfaces to ipset.
 
> I may be a special case, but I suspect it would be useful to firewall 
> like applications to be able to interact with ipset's via a library 
> interface, especially if it becomes possible to get notifications etc on 
> when things happen.  As I understand it it's possible to do a lot of 
> this via libnml, however, this is still a "generic" interface, and 
> libipset seems like the logical choice when required to interact with 
> ipset.
> 
> Firstly, I must say that the overall design is very nice and mostly very 
> clean, and extremely generic, it's easy to follow and would be very easy 
> to add new options etc to the codebase.  My stumbling blocks however was 
> as follows:
> 
> 1.  I need to duplicate the various ipset_type structures into my own 
> code in which I'm interested.  I would suggest that this goes into the 
> library and get loaded as part of some library initialization call 
> (possibly even internal to ipset_session_init).

Yes, the set types are missing from the library - which makes hard to 
create another interface. I'll move the types into libipset.
 
> 2.  The ability to retrieve set information into a structure and query 
> it from there would be awesome.  As it stands I need to invoke 
> ipset_cmd() to get anything done, this handles a few internal 
> intialization routines and so forth, which is all fair and well, but 
> then makes assumptions about the way in which I'd like to have the data 
> returned from the kernel handled.  In my case I don't care about 
> outputting things, my program takes a -s setname and I'd like to check 
> that:
> 
>   a)  the type is correctly set as hash:ip.
>   b)  it has timeout support enabled.

Everything is get done by commands issued via ipset_cmd(). And if I 
understand you above correctly, then you can already get that information 
via the HEADER command. The result is stored in a private structure and 
can be checked/retrieved by ipset_data_get().
 
> 3.  In my particular case I simply want to periodically add entries to 
> the ipset in question, so the concept of a line number in ipset_cmd 
> makes no sense to me, just passing zero is an easy workaround.

ipset itself does the same when line numbers are irrelevant. I don't think 
it's so important to introduce a macro like

#define IPSET_SIMPLE_CMD(session, cmd)	ipset_cmd(session, cmd, 0)
 
> 4.  The fact that the session gets reset after every ipsec_cmd call 
> makes perfect sense an "interactive" use case where a user types 
> multiple commands one after the other on a prompt, but it requires me to 
> have to re-set the options I care about every single invocation where 
> I'd prefer to just set up the setname and timeout options beforehand, 
> and then just alter the IPSET_OPT_IP value every time before invoking 
> libipset to make the actual work happen.

Command aggregation is there, for restore mode, but what you intent to do 
is a little bit different. If you just want to add elements to the same 
set again and again, then you could commit the individual ADD commands 
manually in a pseudo restore mode, which skips resetting the data blob.
Leaving out error checking it could go like this:

	/* initialization is aleady done */
	while (1) {
		/* Unset just the set element specific part of set data */
		ipset_data_flags_unset(data,
			IPSET_FLAG(IPSET_OPT_IP) | ...);
		/* Parse data for the set element and add to set data */
		...
		/* Issue ADD command in restore mode and commit it */
		ipset_cmd(session, IPSET_CMD_ADD, lineno++);
		ipset_commit(session);
	} 
 
> Based on what I've seen I can envision that this should all be possible.  
> In particular I think if one can split ipset_cmd into smaller (exposed) 
> parts it would make sense, in particular transport initialization and 
> pre-call initialization really, then the invocation of commands 
> (possibly with custom call-backs so one can for example get hold of the 
> type data and the like, basically this info:
> 
> Name: foo
> Type: hash:ip
> Header: family inet hashsize 1024 maxelem 65536
> Size in memory: 16504
> References: 0
> 
> in a structured way (even if one have to query it using the various
> ipset_data_test/get functions, in fact - that would be very cool).
> 
> I would like to extend my help in this regards if it would make sense to 
> do so.  I don't think I'm capable to do all of the above, but I may at 
> least be capable of performing at least some of the above.  I would 
> however (before I proceed) like to know whether such patches would be 
> welcome and whether they would stand a chance of being merged.
> 
> If I am missing the boat completely and what I want is already possible in
> some way, please do point me in the right direction.

Best regards,
Jozsef
-
E-mail  : kadlec@xxxxxxxxxxxxxxxxx, kadlec@xxxxxxxxxxxx
PGP key : http://www.kfki.hu/~kadlec/pgp_public_key.txt
Address : KFKI Research Institute for Particle and Nuclear Physics
          H-1525 Budapest 114, POB. 49, Hungary
--
To unsubscribe from this list: send the line "unsubscribe netfilter" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Netfilter Development]     [Linux Kernel Networking Development]     [Netem]     [Berkeley Packet Filter]     [Linux Kernel Development]     [Advanced Routing & Traffice Control]     [Bugtraq]

  Powered by Linux