fail2ban_rule.c 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256
  1. #include<stdio.h>
  2. #include<stdlib.h>
  3. #include<strings.h>
  4. #include<string.h>
  5. #include<mysql/mysql.h>
  6. #include<mysql/mysqld_error.h>
  7. #include<stdarg.h>
  8. #include<ctype.h>
  9. #include<sys/types.h>
  10. #include<ifaddrs.h>
  11. #include<netinet/in.h>
  12. #include<arpa/inet.h>
  13. #include<net/if.h>
  14. #include <sys/ioctl.h>
  15. #include <sys/socket.h>
  16. #include <fcntl.h>
  17. #include <unistd.h>
  18. #define CONFIG_FILE "/etc/fail2ban/jail.conf"
  19. #define DBCONFIG "/etc/asterisk/exten_gen.ini"
  20. #define NETCONFIG "/etc/rc.conf"
  21. #define WEBCONFIG "/usr/local/rest-server/config/application.properties"
  22. #define SIZE 256
  23. #define SIZE_K 1024
  24. /*该程序的功能是从数据库中读取fail2ban的配置信息然后写到fail2ban的配置文件中然后重启fail2ban服务使配置生效,界面配置fail2ban的时候调用,需要编译*/
  25. int connect_mysql(MYSQL *conn)
  26. {
  27. char dbserver[64];
  28. char dbuser[64];
  29. char dbpasswd[64];
  30. char dbname[64];
  31. unsigned int dbport = 3306;
  32. strcpy(dbserver,getenv("MYSQL"));
  33. strcpy(dbuser,getenv("MYSQL_USER"));
  34. strcpy(dbpasswd,getenv("MYSQL_PASSWORD"));
  35. strcpy(dbname,getenv("MYSQL_DATABASE"));
  36. conn = mysql_init(NULL);
  37. if(!mysql_real_connect(conn, dbserver, dbuser, dbpasswd, dbname,dbport,NULL,0)){
  38. printf("error:%s\n",mysql_error(conn));
  39. return -1;
  40. }
  41. // 是否连接已经可用
  42. if (mysql_query(conn,"set names utf8")) // 如果失败
  43. return -1;
  44. return 0;
  45. }
  46. int netmask_str2len(char* mask)
  47. {
  48. int netmask = 0;
  49. unsigned int mask_tmp;
  50. mask_tmp = ntohl((int)inet_addr(mask));
  51. while (mask_tmp & 0x80000000)
  52. {
  53. netmask++;
  54. mask_tmp = (mask_tmp << 1);
  55. }
  56. return netmask;
  57. }
  58. char * get_addr(char *addr, int flag, char *dev)
  59. {
  60. int sockfd = 0;
  61. struct sockaddr_in *sin;
  62. struct ifreq ifr;
  63. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  64. {
  65. perror("socket error!\n");
  66. return NULL;
  67. }
  68. memset(&ifr, 0, sizeof(ifr));
  69. snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", dev);
  70. if(ioctl(sockfd, flag, &ifr) < 0 )
  71. {
  72. perror("ioctl error!\n");
  73. close(sockfd);
  74. return NULL;
  75. }
  76. close(sockfd);
  77. sin = (struct sockaddr_in *)&ifr.ifr_addr;
  78. snprintf((char *)addr, 32, "%s", inet_ntoa(sin->sin_addr));
  79. return addr;
  80. }
  81. char *get_fb_config(char *buf)
  82. {
  83. MYSQL *conn;
  84. MYSQL_RES *res;
  85. MYSQL_ROW row;
  86. MYSQL_RES *res1;
  87. MYSQL_ROW row1;
  88. char sql[SIZE] = {0};
  89. char tmp[SIZE_K*3] = {0};
  90. char ignored[SIZE_K*2] = {0};
  91. int len1 = 16, len2 = 16, len3 = 16,len4 = 16;
  92. /*
  93. char wanip[32] = {0};
  94. char lanip[32] = {0};
  95. char virip[32] = {0};
  96. char virip_lan[32] = {0};
  97. char netmask_wan[32] = {0};
  98. char netmask_lan[32] = {0};
  99. char netmask_vir[32] = {0};
  100. char netmask_vir_lan[32] = {0};
  101. get_addr(wanip, SIOCGIFADDR,"eth0");
  102. get_addr(lanip, SIOCGIFADDR,"eth1");
  103. get_addr(virip, SIOCGIFADDR,"eth0:0");
  104. get_addr(virip_lan, SIOCGIFADDR,"eth1:0");
  105. get_addr(netmask_wan, SIOCGIFNETMASK,"eth0");
  106. get_addr(netmask_lan, SIOCGIFNETMASK,"eth1");
  107. get_addr(netmask_vir, SIOCGIFNETMASK,"eth0:0");
  108. get_addr(netmask_vir_lan, SIOCGIFNETMASK,"eth1:0");
  109. if(strlen(netmask_wan))
  110. len1 = netmask_str2len(netmask_wan);
  111. if(strlen(netmask_lan))
  112. len2 = netmask_str2len(netmask_lan);
  113. if(strlen(netmask_vir))
  114. len3 = netmask_str2len(netmask_vir);
  115. if(strlen(netmask_vir_lan))
  116. len4 = netmask_str2len(netmask_vir_lan);
  117. */
  118. /*set default rules
  119. strcat(buf,"[DEFAULT]\n");
  120. strcat(buf,"ignoreip = 127.0.0.1/32\n");
  121. strcat(buf,"bantime = 3600\n");
  122. strcat(buf,"maxretry = 3\n");
  123. strcat(buf,"backend = auto\n");
  124. strcat(buf,"banaction = iptables-multiport\n");
  125. strcat(buf,"mta = mail\n");
  126. strcat(buf,"protocol = tcp\n");
  127. strcat(buf,"chain = INPUT\n");
  128. strcat(buf,"action_ = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  129. strcat(buf,"action_mw = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  130. strcat(buf,"action_mwl = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  131. strcat(buf,"action = \%(action_)s\n\n");
  132. */
  133. printf("connect mysql!\n");
  134. if(connect_mysql(conn))
  135. return 0;
  136. sprintf(sql, "select name,enable,max_retry,find_time,ban_time from t_pbx_fail2ban_basic");
  137. if(mysql_real_query(conn, sql, strlen(sql))){
  138. printf("select data from table t_pbx_fail2ban_basic faild !\n");
  139. return 0;
  140. }
  141. printf("sql result for '%s'!\n", sql);
  142. res = mysql_store_result(conn);
  143. char in[10] = {0};
  144. while(row = mysql_fetch_row(res))
  145. {
  146. printf("datainfo %s,%s,%s,%s,%s !\n", row[0], row[1], row[2], row[3], row[4]);
  147. bzero(in, 10);
  148. bzero(tmp,strlen(tmp));
  149. bzero(ignored,strlen(ignored));
  150. if(!strcmp((const char *)row[1], "1"))
  151. strcpy(in, "true");
  152. else
  153. strcpy(in, "false");
  154. /*
  155. if(strlen(virip) && strlen(virip_lan))
  156. sprintf(ignored,"%s/%d %s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3,virip_lan,len4);
  157. else if(strlen(virip))
  158. sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3);
  159. else if(strlen(virip_lan))
  160. sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip_lan,len4);
  161. else
  162. sprintf(ignored,"%s/%d %s/%d ",wanip,len1, lanip,len2);
  163. */
  164. if(!strcmp((const char*)row[0], "sip")){
  165. bzero(sql,strlen(sql));
  166. sprintf(sql, "select ip,netmask_length from t_pbx_fail2ban_ignored where protocol_sip='1' and enable='1'");
  167. if(mysql_real_query(conn, sql, strlen(sql))){
  168. printf("select data from table t_pbx_fail2ban_ignored faild !\n");
  169. return 0;
  170. }
  171. printf("sql result for '%s'!\n", sql);
  172. res1 = mysql_store_result(conn);
  173. while(row1 = mysql_fetch_row(res1))
  174. {
  175. strcat(ignored,(char *)row1[0]);
  176. strcat(ignored,"/");
  177. strcat(ignored,(char *)row1[1]);
  178. strcat(ignored," ");
  179. }
  180. sprintf(tmp,"[sip-iptables]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nfilter = sip\naction = iptables-allports[name=VOIP, protocol=all]\nlogpath = /var/log/asterisk/messages\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n", in, ignored, row[2], row[3], row[4]);
  181. mysql_free_result(res1);
  182. }
  183. else if(!strcmp((const char*)row[0], "ssh")){
  184. bzero(sql,strlen(sql));
  185. sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_ssh='1' and enable='1'");
  186. if(mysql_real_query(conn, sql, strlen(sql))){
  187. printf("select data from table t_fail2ban_ignored faild !\n");
  188. return 0;
  189. }
  190. res1 = mysql_store_result(conn);
  191. while(row1 = mysql_fetch_row(res1))
  192. {
  193. strcat(ignored,(char *)row1[0]);
  194. strcat(ignored,"/");
  195. strcat(ignored,(char *)row1[1]);
  196. strcat(ignored," ");
  197. }
  198. sprintf(tmp,"[SSH]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = 22\nfilter = sshd\nlogpath = /var/log/auth.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, row[2], row[3], row[4]);
  199. //sprintf(tmp,"[SSH]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = %s\nfilter = sshd\nlogpath = /var/log/auth.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, sshport, row[2], row[3], row[4]);
  200. //free(sshport);
  201. mysql_free_result(res1);
  202. }
  203. strcat(buf,tmp);
  204. }
  205. mysql_free_result(res);
  206. mysql_close(conn);
  207. return buf;
  208. }
  209. int main(int argc, char *argv[])
  210. {
  211. char buf[SIZE_K*8]={0};
  212. char cmd[SIZE] = {0};
  213. FILE *fp = NULL;
  214. #if 1
  215. get_fb_config(buf);
  216. printf("%s",buf);
  217. fp = fopen(CONFIG_FILE, "w");
  218. if(strlen(buf))
  219. fputs(buf, fp);
  220. fclose(fp);
  221. sprintf(cmd,"echo \"\" > /var/log/auth.log;echo \"\" > /var/log/fail2ban.log ;echo \"\" >/var/log/invalid_web_visit.log;echo \"\" > /var/log/asterisk/messages;asterisk -rx \"logger reload\";service fail2ban restart");
  222. system(cmd);
  223. #endif
  224. return 0;
  225. }