Mar 25

首先, 向各位订阅游戏开发博客(benegg.com)的朋友道歉, 4个月都没有发表新文章了.

最近, 想给Lighttpd做一个用来封IP的插件, 当然, 后期还会有其它功能, 比如连接限制, 防火墙等. 那么, 首先要明白Lighttpd的结构, 知道在哪里加入代码. 了解如下:

// network.c
handler_t network_server_handle_fdevent(void *s, void *context, int revents){
	con = connection_accept(srv, srv_socket);
	connection_state_machine(srv, con);
	plugins_call_handle_joblist(srv, con);
}

// server.c
main(){
	foreach(connection as con){
		connection_state_machine(srv, con);
		plugins_call_handle_joblist(srv, con);
	}
}

connection_state_machine 是其核心的连接处理函数, 可以忽略. 要实现的这个功能, 显然是用plugin(插件, 模块)来实现更好.

plugins_call_handle_joblist的定义是通过宏来定义的: PLUGIN_TO_SLOT(PLUGIN_FUNC_HANDLE_JOBLIST, handle_joblist), 如果直接查找这个函数, 你只能找到声明. 其实就是依次调用所有plugin的handle_joblist方法.

所以, 只需要实现了handle_joblist方法, 在这个方法中关闭指定的连接, 便达到了目的. 因为socket被accept之后会很快调用handle_joblist方法, 所以, 被关闭的连接只占用了非常少的资源.

我计划不是通过配置文件来配置白名单和黑名单, 而是提供一个网络接口, 接受指令对名单进行增删操作, 这样即时性和性能也更高. 当服务器出现异常连接时, 我们通过一个界面, 不断地把异常IP加入到黑名单中, 进行反击.

开发完插件(模块)后, 修改src/Makefile.am, 加入

lib_LTLIBRARIES += mod_firewall.la
mod_firewall_la_SOURCES = mod_firewall.c
mod_firewall_la_LDFLAGS = -module -export-dynamic -avoid-version -no-undefined
mod_firewall_la_LIBADD = $(common_libadd)

然后 ./configure –prefix=/path/to/

如果生成的src/Makefile不包含”firewall”字符串, 官方说明中的”autoreconf -fi”也可能没有用, 那就用文本编辑器把src/Makefile中的”rrdtool”替换为”firewall”, 不用”rrdtool”也行, 找一个你不用的模块名字替换即可.

Related posts:

  1. sunrpc 函数功能分析
  2. 用脚本语言开发网游 – C整合Python
  3. 一种网络通讯二进制数据格式
  4. Mangos源码总体结构
  5. lighttpd源码学习资料

Written by benegg at 2010-03-25 13:44:01 | Views: 3405

Leave a Reply

必须登录, 或者浏览器开启JavaScript支持才可以评论!