[Dovecot] max connects per host?

Alex subscriber at viliar.net.ru
Tue Mar 18 19:34:14 EET 2008


Johannes Berg wrote:
> On Mon, 2008-03-17 at 17:45 +0200, Timo Sirainen wrote:
>
>   
>>> I know about
>>> mail_max_userip_connections in dovecot 1.1
>>>       
>> It should be pretty easy to patch this code to ignore the user and just
>> limit IPs. You could basically just remove "user" from struct
>> mail_process_group and fix the code to compile. Or even easier:
>>
>> static struct mail_process_group *
>> mail_process_group_lookup(enum process_type type, const char *user,
>> 			  const struct ip_addr *ip)
>> {
>> 	user = ""; // use the same empty user for everyone
>>
>> // ...
>>
>> static struct mail_process_group *
>> mail_process_group_create(enum process_type type, const char *user,
>> 			  const struct ip_addr *ip)
>> {
>> 	struct mail_process_group *group;
>>
>> 	user = ""; // use the same empty user for everyone
>>     
>
> Sounds like
>
>   
>> Probably in future versions.
>>     
>
> could be trivially implemented with a "mail_process_group_lookup_key"
> setting that defaults to %u :)
>
> johannes
>   
Thank you Timo and Johannes for answers! I have used your 
recommendations and really enough this
small patch:
--- src/master/mail-process.c.orig      2008-03-18 19:55:04.000000000 -0400
+++ src/master/mail-process.c   2008-03-18 19:55:35.000000000 -0400
@@ -75,7 +75,8 @@ mail_process_group_lookup(enum process_t
        struct mail_process_group lookup_group;
 
        lookup_group.process.type = type;
-       lookup_group.user = t_strdup_noconst(user);
+       /*lookup_group.user = t_strdup_noconst(user);*/
+       lookup_group.user = "";
        lookup_group.remote_ip = *ip;
 
        return hash_lookup(mail_process_groups, &lookup_group);
@@ -89,7 +90,8 @@ mail_process_group_create(enum process_t
 
        group = i_new(struct mail_process_group, 1);
        group->process.type = type;
-       group->user = i_strdup(user);
+       /*group->user = i_strdup(user);*/
+       group->user = "";
        group->remote_ip = *ip;
 
        i_array_init(&group->processes, 10);
--- src/login-common/sasl-server.c.orig 2008-03-19 09:36:56.000000000 -0400
+++ src/login-common/sasl-server.c      2008-03-19 09:37:21.000000000 -0400
@@ -51,7 +51,7 @@ master_callback(struct client *client, e
        case MASTER_LOGIN_STATUS_INTERNAL_ERROR:
                break;
        case MASTER_LOGIN_STATUS_MAX_CONNECTIONS:
-               data = "Maximum number of connections from user+IP 
exceeded";
+               data = "Maximum number of connections from ip exceeded";
                break;
        }
        call_client_callback(client, reply, data, NULL);

And it is really work. But for probable future option, I think, it is 
would be wrong way.
Because this solution limit user _logins_, not connections. So, just for 
example, I could make very much connections to server and go to end up 
dovecot connection pool or, if I miss something here, system resources 
like max_files, max_sockets  and so on. IMHO, more truly solution is 
limit connections, and check it _before_ login procedure. I understand, 
that can happen in this case also. But why we will waste our resources 
to check login/pass, make redundant query to myssql/pgsql/sqlite and so 
on?  What are you think about that? Comments are very welcome.

Alex







More information about the dovecot mailing list