|
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”也行, 找一个你不用的模块名字替换即可.

Recent Comments