5.6.3 用anvil_clnt_connect函数统计客户端并发连接数和连接频率

来源:互联网 发布:ubuntu重启搜狗输入法 编辑:程序博客网 时间:2024/06/06 14:12

anvil模块在5.2节已经做了介绍。在实际的协议解析开始前,先要将“恶意”客户排除在外。

/smtpd/smtpd.c48414842        /*4843          * XXX The client connection count/ratecontrol must be consistent in4844          * its use of client addressinformation in connect and disconnect4845          * events. For now we exclude xclientauthorized hosts from4846          * connection count/rate control.4847          *4848          * XXX Must send connect/disconnectevents to the anvil server even when4849          * this service is not connectioncount or rate limited, otherwise it4850          * will discard client message orrecipient rate information too4851         * early or too late.4852          */4853        if (SMTPD_STAND_ALONE(state) == 04854             && !xclient_allowed4855             && anvil_clnt4856             &&!namadr_list_match(hogger_list, state->name, state->addr)4857             &&anvil_clnt_connect(anvil_clnt, state->service, state->addr,4858                                  &state->conn_count, &state->conn_rate)4859             == ANVIL_STAT_OK) {4860             if (var_smtpd_cconn_limit > 04861                 && state->conn_count> var_smtpd_cconn_limit) {4862                 state->error_mask |=MAIL_ERROR_POLICY;4863                 msg_warn("Connectionconcurrency limit exceeded: %d from %s for service %s",4864                          state->conn_count,state->namaddr, state->service);4865                 smtpd_chat_reply(state,"421 4.7.0 %s Error: too many connections from %s",4866                                 var_myhostname, state->addr);4867                 break;4868             }4869             if (var_smtpd_crate_limit > 04870                 && state->conn_rate> var_smtpd_crate_limit) {4871                 msg_warn("Connection ratelimit exceeded: %d from %s for service %s",4872                          state->conn_rate,state->namaddr, state->service);4873                 smtpd_chat_reply(state,"421 4.7.0 %s Error: too many connections from %s",4874                                 var_myhostname, state->addr);4875                 break;4876             }4877        }
 

4857 用anvil_clnt_connect统计客户端并发连接数与连接频率,结果放在SMTPD_STATE结构体conn_count和conn_rate字段中。同时还要保证其他条件:xclient是客户端测试命令,所以不算作真实的客户端连接。hogger_list,即smtpd_client_event_limit_exceptions参数,在pre_jail_init函数中被初始化,表示不作频率控制检测的地址。所以我们要确保我们现在检测的地址不在这些地址中。

 

       4860-4877如果统计结果超出smtpd_client_connection_count_limit和smtpd_client_connection_rate_limit参数限制则报错。

         anvil模块的统计功能在接下来的解析中还会被使用。统计函数anvil_clnt_mail,anvil_clnt_rcpt在mail_cmd函数和rcpt_cmd函数中的应用方法与此类似,我们不在重复列出代码。
0 0