内容摘要:netfilter的架构就是在整个网络流程的若干位置放置了一些检测点(HOOK ),而在每个检测点上上登记了一些处理函数进行处理(如包过滤,NAT等,甚至可以是用户自定义的功能)。
iptables: Invalid argument
这会在内核和用户空间之间的结构大小发生变化是发生,你需要重新编译iptables用户空间程序,使用包括你新内核的文件进行编译,如果你已经应用了一些只针对旧或新内核的补丁也会发生,使用kernel.org上的内核一般不会发生,如果发生了,请到netfilter-devel邮件列表寻求支持。
关于netfilter开发的问题
1、我不知道如何从用户空间使用QUEUE target
一个叫做libipq的库被提供用于用户空间数据包处理,请查看它的帮助文档获取更多的信息,你需要编译和安装iptables开发组件:
make install-devel
然后查看libipq(3)【译者注:man libipq 3】
你也可能对Perl绑定libipq有兴趣,Perlipq在http://www.intercode.com.au/jmorris/perlipq/,绑定它自己是使用libipq的一个例子。
其他代码例子包括:
来自netfilter CVS的testsuite/tools/intercept.c
ipqmpd(查看http://www.gnumonks.org/projects/)
nfqtest,netfilter-tools的一部分(查看http://www.gnumonks.org/projects/)
Jerome Etienne的WAN模拟器(查看http://www.off.net/~jme/)
2、我的libipq应用程序报"Failed to received netlink message: No buffer space available"
这意味着内核方Netlink套接字缓冲区超出了空间范围,用户空间应用程序不能控制从内核出来的大量数据。
增大那些内核缓冲区让我不再遇到这个问题是可能的吗?
是的,这些标准的Netlink套接字,你可以通过/proc/sys/net/core,sysctl或在描述符文件上使用SO_RCVBUF选项来调整它们的接收缓冲区大小。
你还可以尝试确保你的应用程序尽可能快地读取任何接收到的数据,如果你不需要完整的数据包,尝试拷贝少量的数据到用户空间(查看ipq_set_mode(3))
3、我想贡献一些代码,但是我还不知道该怎么做
netfilter核心团队维护了一个TODO列表,它里面列出了所有想要的修改/新特征,你看通过匿名CVS检索这个列表,具体指令在netfilter的主页上,你还可以用CVSweb去http://cvs.netfilter.org/cgi-bin/cvsweb/netfilter/TODO/看看。
4、我已经修复了一个bug或编写了一个扩展,我如何提交它?
如果你想发布它,请将其发送到netfilter-devel邮件列表,订阅说明在http://lists.netfilter.org/mailman/listinfo/netfilter-devel/。
正确的发送一个补丁的方法如下:
邮件主题以[PATCH]开头
直接包括在消息的主体中,不是MIME`d
一个cvs-checkin/Changelog条目
diff –u old new表格,来自root目录外部(如当进入未解压的目录时用-p1)
如果你编写了一个新的扩展,或给一个旧的扩展增加了一些新的选项,同时更新netfilter-extension-HOWTO将新的扩展/功能描述包括进来是一个很不错的主意,另外,它将引出更多用户使用你的扩展,你将会得到更多的反馈。
5、提供了增加/移除规则的c/c++ API吗?
不幸的是还没有。
你或许会想libiptc如何?已经在邮件列表中多次指出,libiptc从来就不是被作为一个公共接口使用的,我们不能保证一个稳定的接口,它已经计划在下一个Linux包过滤器中被移除出去,libiptc是太底层的东西。
我们已经注意到缺少一个最基本的API,我们已经开始在这方面努力改进了,到那时,要么使用system()或打开一个管道进入iptables-restore标准输入,今后将给你提供一套性能更好的方法。
来源:51CTO.com 作者:黄永兵 责编:豆豆技术应用