fail2ban_rule.c 8.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292
  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. char *getconfig(const char *file_path, const char *name)
  26. {
  27. char str[SIZE] = {0};
  28. char *p = NULL, *value = NULL;
  29. int tmp = 0, len = 0;
  30. FILE *fp = fopen(file_path, "r");
  31. while(fgets(str, SIZE, fp)){
  32. if(strstr(str, name)){
  33. p = strstr(str, "=");
  34. len = p - str;
  35. value = malloc(50);
  36. bzero(value, 50);
  37. while(str[len] != '\n'){
  38. if(str[len] == ' ' || str[len] == '='){
  39. len++;
  40. continue;
  41. }else
  42. value[tmp++] = str[len++];
  43. }
  44. //printf("%s : %s\n",name, value);
  45. break;
  46. }
  47. }
  48. return value;
  49. }
  50. int connect_mysql(MYSQL *conn)
  51. {
  52. //char *dbserver = getconfig(DBCONFIG, "dbserverip");
  53. //char *dbuser = getconfig(DBCONFIG, "dbuser");
  54. //char *dbpasswd = getconfig(DBCONFIG, "dbpasswd");
  55. //char *dbname = getconfig(DBCONFIG, "dbname");
  56. char dbserver[64];
  57. char dbuser[64];
  58. char dbpasswd[64];
  59. char dbname[64];
  60. unsigned int dbport = 3306;
  61. strcpy(dbserver,getenv("MYSQL"));
  62. strcpy(dbuser,getenv("MYSQL_USER"));
  63. strcpy(dbpasswd,getenv("MYSQL_PASSWORD"));
  64. strcpy(dbname,getenv("MYSQL_DATABASE"));
  65. printf("connect---1\n");
  66. conn = mysql_init(NULL);
  67. printf("connect---2\n");
  68. if(!mysql_real_connect(conn, dbserver, dbuser, dbpasswd, dbname,dbport,NULL,0)){
  69. printf("error:%s\n",mysql_error(conn));
  70. return -1;
  71. }
  72. // 是否连接已经可用
  73. if (mysql_query(conn,"set names utf8")) // 如果失败
  74. return -1;
  75. printf("connect---3\n");
  76. return 0;
  77. }
  78. int netmask_str2len(char* mask)
  79. {
  80. int netmask = 0;
  81. unsigned int mask_tmp;
  82. mask_tmp = ntohl((int)inet_addr(mask));
  83. while (mask_tmp & 0x80000000)
  84. {
  85. netmask++;
  86. mask_tmp = (mask_tmp << 1);
  87. }
  88. return netmask;
  89. }
  90. char * get_addr(char *addr, int flag, char *dev)
  91. {
  92. int sockfd = 0;
  93. struct sockaddr_in *sin;
  94. struct ifreq ifr;
  95. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  96. {
  97. perror("socket error!\n");
  98. return NULL;
  99. }
  100. memset(&ifr, 0, sizeof(ifr));
  101. snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", dev);
  102. if(ioctl(sockfd, flag, &ifr) < 0 )
  103. {
  104. perror("ioctl error!\n");
  105. close(sockfd);
  106. return NULL;
  107. }
  108. close(sockfd);
  109. sin = (struct sockaddr_in *)&ifr.ifr_addr;
  110. snprintf((char *)addr, 32, "%s", inet_ntoa(sin->sin_addr));
  111. return addr;
  112. }
  113. char *get_fb_config(char *buf)
  114. {
  115. MYSQL *conn;
  116. MYSQL_RES *res;
  117. MYSQL_ROW row;
  118. MYSQL_RES *res1;
  119. MYSQL_ROW row1;
  120. char sql[SIZE] = {0};
  121. char tmp[SIZE_K*3] = {0};
  122. char ignored[SIZE_K*2] = {0};
  123. int len1 = 16, len2 = 16, len3 = 16,len4 = 16;
  124. /*
  125. char wanip[32] = {0};
  126. char lanip[32] = {0};
  127. char virip[32] = {0};
  128. char virip_lan[32] = {0};
  129. char netmask_wan[32] = {0};
  130. char netmask_lan[32] = {0};
  131. char netmask_vir[32] = {0};
  132. char netmask_vir_lan[32] = {0};
  133. get_addr(wanip, SIOCGIFADDR,"eth0");
  134. get_addr(lanip, SIOCGIFADDR,"eth1");
  135. get_addr(virip, SIOCGIFADDR,"eth0:0");
  136. get_addr(virip_lan, SIOCGIFADDR,"eth1:0");
  137. get_addr(netmask_wan, SIOCGIFNETMASK,"eth0");
  138. get_addr(netmask_lan, SIOCGIFNETMASK,"eth1");
  139. get_addr(netmask_vir, SIOCGIFNETMASK,"eth0:0");
  140. get_addr(netmask_vir_lan, SIOCGIFNETMASK,"eth1:0");
  141. if(strlen(netmask_wan))
  142. len1 = netmask_str2len(netmask_wan);
  143. if(strlen(netmask_lan))
  144. len2 = netmask_str2len(netmask_lan);
  145. if(strlen(netmask_vir))
  146. len3 = netmask_str2len(netmask_vir);
  147. if(strlen(netmask_vir_lan))
  148. len4 = netmask_str2len(netmask_vir_lan);
  149. */
  150. /*set default rules
  151. strcat(buf,"[DEFAULT]\n");
  152. strcat(buf,"ignoreip = 127.0.0.1/32\n");
  153. strcat(buf,"bantime = 3600\n");
  154. strcat(buf,"maxretry = 3\n");
  155. strcat(buf,"backend = auto\n");
  156. strcat(buf,"banaction = iptables-multiport\n");
  157. strcat(buf,"mta = mail\n");
  158. strcat(buf,"protocol = tcp\n");
  159. strcat(buf,"chain = INPUT\n");
  160. strcat(buf,"action_ = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  161. strcat(buf,"action_mw = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  162. strcat(buf,"action_mwl = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  163. strcat(buf,"action = \%(action_)s\n\n");
  164. */
  165. printf("connect mysql!\n");
  166. if(connect_mysql(conn))
  167. return 0;
  168. sprintf(sql, "select name,enable,max_retry,find_time,ban_time from t_pbx_fail2ban_basic");
  169. if(mysql_real_query(conn, sql, strlen(sql))){
  170. printf("select data from table t_pbx_fail2ban_basic faild !\n");
  171. return 0;
  172. }
  173. printf("sql result for '%s'!\n", sql);
  174. res = mysql_store_result(conn);
  175. char in[10] = {0};
  176. while(row = mysql_fetch_row(res))
  177. {
  178. printf("datainfo %s,%s,%s,%s,%s !\n", row[0], row[1], row[2], row[3], row[4]);
  179. bzero(in, 10);
  180. bzero(tmp,strlen(tmp));
  181. bzero(ignored,strlen(ignored));
  182. if(!strcmp((const char *)row[1], "1"))
  183. strcpy(in, "true");
  184. else
  185. strcpy(in, "false");
  186. /*
  187. if(strlen(virip) && strlen(virip_lan))
  188. sprintf(ignored,"%s/%d %s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3,virip_lan,len4);
  189. else if(strlen(virip))
  190. sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3);
  191. else if(strlen(virip_lan))
  192. sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip_lan,len4);
  193. else
  194. sprintf(ignored,"%s/%d %s/%d ",wanip,len1, lanip,len2);
  195. */
  196. if(!strcmp((const char*)row[0], "sip")){
  197. bzero(sql,strlen(sql));
  198. sprintf(sql, "select ip,netmask_length from t_pbx_fail2ban_ignored where protocol_sip='1' and enable='1'");
  199. if(mysql_real_query(conn, sql, strlen(sql))){
  200. printf("select data from table t_pbx_fail2ban_ignored faild !\n");
  201. return 0;
  202. }
  203. printf("sql result for '%s'!\n", sql);
  204. res1 = mysql_store_result(conn);
  205. while(row1 = mysql_fetch_row(res1))
  206. {
  207. strcat(ignored,(char *)row1[0]);
  208. strcat(ignored,"/");
  209. strcat(ignored,(char *)row1[1]);
  210. strcat(ignored," ");
  211. }
  212. 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]);
  213. mysql_free_result(res1);
  214. }
  215. else if(!strcmp((const char*)row[0], "ssh")){
  216. bzero(sql,strlen(sql));
  217. sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_ssh='1' and enable='1'");
  218. if(mysql_real_query(conn, sql, strlen(sql))){
  219. printf("select data from table t_fail2ban_ignored faild !\n");
  220. return 0;
  221. }
  222. res1 = mysql_store_result(conn);
  223. while(row1 = mysql_fetch_row(res1))
  224. {
  225. strcat(ignored,(char *)row1[0]);
  226. strcat(ignored,"/");
  227. strcat(ignored,(char *)row1[1]);
  228. strcat(ignored," ");
  229. }
  230. //char *sshport = getconfig("/etc/asterisk/service.conf","ssh_port");
  231. 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]);
  232. //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]);
  233. //free(sshport);
  234. mysql_free_result(res1);
  235. }
  236. strcat(buf,tmp);
  237. }
  238. mysql_free_result(res);
  239. mysql_close(conn);
  240. return buf;
  241. }
  242. int main(int argc, char *argv[])
  243. {
  244. char buf[SIZE_K*8]={0};
  245. char cmd[SIZE] = {0};
  246. FILE *fp = NULL;
  247. #if 1
  248. get_fb_config(buf);
  249. printf("%s",buf);
  250. fp = fopen(CONFIG_FILE, "w");
  251. if(strlen(buf))
  252. fputs(buf, fp);
  253. fclose(fp);
  254. 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");
  255. system(cmd);
  256. #endif
  257. return 0;
  258. }