1.连接数限制的实现:最大连接数的限制
-
vsftpd服务连接数限制的实现,vim /etc/vsftpd.conf
第四次连接连不上了
-
将当前连接数保存于变量num_clients变量中,然后与配置项tunable_max_clients进行比较,如果超过了就不让登录。当一个客户登录的时候num_clients加1,当一个客户端退出的时候,num_clients减1。
-
eg:miniftpd26\main.c,miniftpd26\ftpproto.h
signal(SIGCHLD, handle_sigchld);
void check_limits(session_t *sess)
void handle_sigchld(int sig)
void ftp_reply(session_t *sess, int status, const char *text);
- 测试:设置当前的最大连接数是2
连接3个客户端会失败
2.连接数限制的实现:每个IP的连接数的限制
-
vsftpd每个IP的连接数的限制,vim /etc/vsftpd.conf
某个特点的ip,它的连接数不能超过2次
因为同一台机器上客户端的ip都是一样的,每个ip的连接数,到达限制了,所以无法登录了
-
维护护两个哈希表
static hash_t *s_ip_count_hash;//ip与对应连接数的哈希表,ip是key,count是value
static hash_t *s_pid_ip_hash;//进程pid与ip对应关系的哈希表
-
将当前ip的连接数保存在变量num_this_ip中,然后与配置项tunable_max_per_ip进行比较,如果超过了就不让登录。当一个客户登录的时候,要在s_ip_count_hash更新这个表中的对应表项,即该ip对应的连接数要加1,如果这个表项还不存在,要在表中添加一条记录,并且将ip对应的连接数置1。
-
当一个客户端退出的时候,那么该客户端对应ip的连接数要减1,处理过程是这样的,首先是客户端退出的时候,父进程需要知道这个客户端的ip,这可以通过在s_pid_ip_hash查找得到,得到了ip进而我们就可以在s_ip_count_hash表中找到对应的连接数,进而进行减1操作。
-
eg:miniftpd27\main.c
static hash_t *s_ip_count_hash;//ip与对应连接数的哈希表,ip是key,count是value
static hash_t *s_pid_ip_hash;//进程pid与ip对应关系的哈希表
void handle_sigchld(int sig)
void drop_ip_count(void *ip)
void check_limits(session_t *sess)
- 测试:最大连接数max_clients改为3,每个ip的最大连接数max_per_ip改为2个
当前ip不可以连接三次