fail2ban_rule.bak.c 9.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321
  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. #define CONFIG_FILE "/etc/fail2ban/jail.conf"
  18. #define DBCONFIG "/etc/asterisk/exten_gen.ini"
  19. #define NETCONFIG "/etc/rc.conf"
  20. #define WEBCONFIG "/usr/local/rest-server/config/application.properties"
  21. #define SIZE 256
  22. #define SIZE_K 1024
  23. /*该程序的功能是从数据库中读取fail2ban的配置信息然后写到fail2ban的配置文件中然后重启fail2ban服务使配置生效,界面配置fail2ban的时候调用,需要编译*/
  24. char *getconfig(const char *file_path, const char *name)
  25. {
  26. char str[SIZE] = {0};
  27. char *p = NULL, *value = NULL;
  28. int tmp = 0, len = 0;
  29. FILE *fp = fopen(file_path, "r");
  30. while(fgets(str, SIZE, fp)){
  31. if(strstr(str, name)){
  32. p = strstr(str, "=");
  33. len = p - str;
  34. value = malloc(50);
  35. bzero(value, 50);
  36. while(str[len] != '\n'){
  37. if(str[len] == ' ' || str[len] == '='){
  38. len++;
  39. continue;
  40. }else
  41. value[tmp++] = str[len++];
  42. }
  43. //printf("%s : %s\n",name, value);
  44. break;
  45. }
  46. }
  47. return value;
  48. }
  49. MYSQL *connect_mysql(MYSQL *conn)
  50. {
  51. char *dbserver = getconfig(DBCONFIG, "dbserverip");
  52. char *dbuser = getconfig(DBCONFIG, "dbuser");
  53. char *dbpasswd = getconfig(DBCONFIG, "dbpasswd");
  54. char *dbname = getconfig(DBCONFIG, "dbname");
  55. mysql_init(conn);
  56. if(!mysql_real_connect(conn, dbserver, dbuser, dbpasswd, dbname,0,"",0)){
  57. printf("error:%s\n",mysql_error(conn));
  58. return NULL;
  59. }
  60. if(dbserver)free(dbserver);
  61. if(dbuser)free(dbuser);
  62. if(dbpasswd)free(dbpasswd);
  63. if(dbname)free(dbname);
  64. int utf8;
  65. utf8=mysql_query(conn,"set names utf8");
  66. return conn;
  67. }
  68. int netmask_str2len(char* mask)
  69. {
  70. int netmask = 0;
  71. unsigned int mask_tmp;
  72. mask_tmp = ntohl((int)inet_addr(mask));
  73. while (mask_tmp & 0x80000000)
  74. {
  75. netmask++;
  76. mask_tmp = (mask_tmp << 1);
  77. }
  78. return netmask;
  79. }
  80. char * get_addr(char *addr, int flag, char *dev)
  81. {
  82. int sockfd = 0;
  83. struct sockaddr_in *sin;
  84. struct ifreq ifr;
  85. if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
  86. {
  87. perror("socket error!\n");
  88. return NULL;
  89. }
  90. memset(&ifr, 0, sizeof(ifr));
  91. snprintf(ifr.ifr_name, (sizeof(ifr.ifr_name) - 1), "%s", dev);
  92. if(ioctl(sockfd, flag, &ifr) < 0 )
  93. {
  94. perror("ioctl error!\n");
  95. close(sockfd);
  96. return NULL;
  97. }
  98. close(sockfd);
  99. sin = (struct sockaddr_in *)&ifr.ifr_addr;
  100. snprintf((char *)addr, 32, "%s", inet_ntoa(sin->sin_addr));
  101. return addr;
  102. }
  103. char *get_fb_config(char *buf)
  104. {
  105. MYSQL conn;
  106. MYSQL_RES *res;
  107. MYSQL_ROW row;
  108. MYSQL conn1;
  109. MYSQL_RES *res1;
  110. MYSQL_ROW row1;
  111. char sql[SIZE] = {0};
  112. char tmp[SIZE_K*2] = {0};
  113. char ignored[SIZE_K*2] = {0};
  114. int len1 = 16, len2 = 16, len3 = 16,len4 = 16;
  115. char wanip[32] = {0};
  116. char lanip[32] = {0};
  117. char virip[32] = {0};
  118. char virip_lan[32] = {0};
  119. char netmask_wan[32] = {0};
  120. char netmask_lan[32] = {0};
  121. char netmask_vir[32] = {0};
  122. char netmask_vir_lan[32] = {0};
  123. get_addr(wanip, SIOCGIFADDR,"eth0");
  124. get_addr(lanip, SIOCGIFADDR,"eth1");
  125. get_addr(virip, SIOCGIFADDR,"eth0:0");
  126. get_addr(virip_lan, SIOCGIFADDR,"eth1:0");
  127. #if 0
  128. get_addr(netmask_wan, SIOCGIFNETMASK,"eth0");
  129. get_addr(netmask_lan, SIOCGIFNETMASK,"eth1");
  130. get_addr(netmask_vir, SIOCGIFNETMASK,"eth0:0");
  131. get_addr(netmask_vir_lan, SIOCGIFNETMASK,"eth1:0");
  132. if(strlen(netmask_wan))
  133. len1 = netmask_str2len(netmask_wan);
  134. if(strlen(netmask_lan))
  135. len2 = netmask_str2len(netmask_lan);
  136. if(strlen(netmask_vir))
  137. len3 = netmask_str2len(netmask_vir);
  138. if(strlen(netmask_vir_lan))
  139. len4 = netmask_str2len(netmask_vir_lan);
  140. #endif
  141. /*set default rules*/
  142. strcat(buf,"[DEFAULT]\n");
  143. strcat(buf,"ignoreip = 127.0.0.1/32\n");
  144. strcat(buf,"bantime = 3600\n");
  145. strcat(buf,"maxretry = 3\n");
  146. strcat(buf,"backend = auto\n");
  147. strcat(buf,"banaction = iptables-multiport\n");
  148. strcat(buf,"mta = mail\n");
  149. strcat(buf,"protocol = tcp\n");
  150. strcat(buf,"chain = INPUT\n");
  151. strcat(buf,"action_ = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  152. strcat(buf,"action_mw = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  153. strcat(buf,"action_mwl = \%(banaction)s[name=\%(__name__)s, port=\"\%(port)s\", protocol=\"\%(protocol)s\", chain=\"\%(chain)s\"]\n");
  154. strcat(buf,"action = \%(action_)s\n\n");
  155. MYSQL *conn_mysql = &conn;
  156. if(!connect_mysql(conn_mysql))
  157. return 0;
  158. sprintf(sql, "select name,enable,max_retry,find_time,ban_time from t_fail2ban_basic");
  159. if(mysql_real_query(conn_mysql, sql, strlen(sql))){
  160. printf("select data from table t_fail2ban_basic faild !\n");
  161. return 0;
  162. }
  163. res = mysql_store_result(conn_mysql);
  164. char in[10] = {0};
  165. MYSQL *conn_mysql1 = &conn1;
  166. if(!connect_mysql(conn_mysql1))
  167. return 0;
  168. while(row = mysql_fetch_row(res))
  169. {
  170. bzero(in, 10);
  171. bzero(tmp,strlen(tmp));
  172. bzero(ignored,strlen(ignored));
  173. if(!strcmp((const char *)row[1], "1"))
  174. strcpy(in, "true");
  175. else
  176. strcpy(in, "false");
  177. if(strlen(virip) && strlen(virip_lan))
  178. sprintf(ignored,"%s/%d %s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3,virip_lan,len4);
  179. else if(strlen(virip))
  180. sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip,len3);
  181. else if(strlen(virip_lan))
  182. sprintf(ignored,"%s/%d %s/%d %s/%d ",wanip,len1, lanip,len2,virip_lan,len4);
  183. else
  184. sprintf(ignored,"%s/%d %s/%d ",wanip,len1, lanip,len2);
  185. if(!strcmp((const char*)row[0], "sip")){
  186. bzero(sql,strlen(sql));
  187. sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_sip='1' and enable='1'");
  188. if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
  189. printf("select data from table t_fail2ban_ignored faild !\n");
  190. return 0;
  191. }
  192. res1 = mysql_store_result(conn_mysql1);
  193. while(row1 = mysql_fetch_row(res1))
  194. {
  195. strcat(ignored,(char *)row1[0]);
  196. strcat(ignored,"/");
  197. strcat(ignored,(char *)row1[1]);
  198. strcat(ignored," ");
  199. }
  200. 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]);
  201. mysql_free_result(res1);
  202. }
  203. else if(!strcmp((const char*)row[0], "ssh")){
  204. bzero(sql,strlen(sql));
  205. sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_ssh='1' and enable='1'");
  206. if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
  207. printf("select data from table t_fail2ban_ignored faild !\n");
  208. return 0;
  209. }
  210. res1 = mysql_store_result(conn_mysql1);
  211. while(row1 = mysql_fetch_row(res1))
  212. {
  213. strcat(ignored,(char *)row1[0]);
  214. strcat(ignored,"/");
  215. strcat(ignored,(char *)row1[1]);
  216. strcat(ignored," ");
  217. }
  218. char *sshport = getconfig("/etc/asterisk/service.conf","ssh_port");
  219. 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]);
  220. free(sshport);
  221. mysql_free_result(res1);
  222. }
  223. else if(!strcmp((const char*)row[0], "https")){
  224. #if 1
  225. bzero(sql,strlen(sql));
  226. sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_https='1' and enable='1'");
  227. if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
  228. printf("select data from table t_fail2ban_ignored faild !\n");
  229. return 0;
  230. }
  231. res1 = mysql_store_result(conn_mysql1);
  232. while(row1 = mysql_fetch_row(res1))
  233. {
  234. strcat(ignored,(char *)row1[0]);
  235. strcat(ignored,"/");
  236. strcat(ignored,(char *)row1[1]);
  237. strcat(ignored," ");
  238. }
  239. char *web_port=getconfig(WEBCONFIG, "server.port");
  240. sprintf(tmp,"[HTTPS]\nenabled = %s\nignoreip = 127.0.0.1/32 %s \nport = %s\nfilter = https\nlogpath = /var/log/invalid_web_visit.log\nmaxretry = %s\nfindtime = %s\nbantime = %s\n\n",in, ignored, web_port, row[2], row[3], row[4]);
  241. free(web_port);
  242. mysql_free_result(res1);
  243. #endif
  244. }
  245. else if(!strcmp((const char*)row[0], "iax")){
  246. bzero(sql,strlen(sql));
  247. sprintf(sql, "select ip,netmask_length from t_fail2ban_ignored where protocol_iax='1' and enable='1'");
  248. if(mysql_real_query(conn_mysql1, sql, strlen(sql))){
  249. printf("select data from table t_fail2ban_ignored faild !\n");
  250. return 0;
  251. }
  252. res1 = mysql_store_result(conn_mysql1);
  253. while(row1 = mysql_fetch_row(res1))
  254. {
  255. strcat(ignored,(char *)row1[0]);
  256. strcat(ignored,"/");
  257. strcat(ignored,(char *)row1[1]);
  258. strcat(ignored," ");
  259. }
  260. sprintf(tmp, "[iax-iptables]\nenabled = %s\nignoreip = 127.0.0.1/32 %s\nfilter = iax2\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]);
  261. mysql_free_result(res1);
  262. }
  263. strcat(buf,tmp);
  264. }
  265. mysql_free_result(res);
  266. mysql_close(conn_mysql);
  267. mysql_close(conn_mysql1);
  268. return buf;
  269. }
  270. int main(int argc, char *argv[])
  271. {
  272. char buf[SIZE_K*8]={0};
  273. char cmd[SIZE] = {0};
  274. FILE *fp = NULL;
  275. #if 1
  276. get_fb_config(buf);
  277. printf("%s",buf);
  278. fp = fopen(CONFIG_FILE, "w");
  279. if(strlen(buf))
  280. fputs(buf, fp);
  281. fclose(fp);
  282. 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");
  283. system(cmd);
  284. #endif
  285. return 0;
  286. }