From bb544a72de018d53ade1e9be1b3b72c8d3e8dd4d Mon Sep 17 00:00:00 2001 From: aixiao Date: Thu, 7 Jul 2022 16:52:24 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BD=BF=E7=94=A8libiptc=E4=B8=8B=E5=8F=91?= =?UTF-8?q?=E8=A7=84=E5=88=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 6 +- conf.c | 232 +++++++++++++++++++++++++++++++++++++++++++++++++++ conf.h | 32 +++++++ conf.o | Bin 0 -> 16592 bytes denyhosts.sh | 49 ++++++----- libiptc.c | 209 ++++++++++++++++++++++++++++++++++++++++++++++ libiptc.h | 38 +++++++++ libiptc.o | Bin 0 -> 19232 bytes rhost | Bin 44240 -> 69184 bytes rhost.c | 126 ++++++++++++++-------------- rhost.conf | 17 ++++ rhost.h | 42 ++++++++++ rhost.o | Bin 52280 -> 55272 bytes 13 files changed, 661 insertions(+), 90 deletions(-) create mode 100644 conf.c create mode 100644 conf.h create mode 100644 conf.o create mode 100644 libiptc.c create mode 100644 libiptc.h create mode 100644 libiptc.o create mode 100644 rhost.conf create mode 100644 rhost.h diff --git a/Makefile b/Makefile index 8736236..0ace1f3 100644 --- a/Makefile +++ b/Makefile @@ -1,10 +1,10 @@ CROSS_COMPILE ?= CC := $(CROSS_COMPILE)gcc -CFLAGS += -g -Wall -LIB += -lcurl +CFLAGS += -g -Wall +LIB += -lcurl -lip4tc OBG = rhost -all: rhost.o +all: conf.o rhost.o libiptc.o $(CC) $(CFLAGS) $^ -o $(OBG) $(LIB) clean: diff --git a/conf.c b/conf.c new file mode 100644 index 0000000..eda3da1 --- /dev/null +++ b/conf.c @@ -0,0 +1,232 @@ +#include "conf.h" + +int8_t copy_new_mem(char *src, int src_len, char **dest) +{ + *dest = (char *)malloc(src_len + 1); + if (*dest == NULL) + return 1; + memcpy(*dest, src, src_len); + *((*dest) + src_len) = '\0'; + + return 0; +} + +/* 在content中,设置变量(var)的首地址,值(val)的位置首地址和末地址,返回下一行指针 */ +static char *set_var_val_lineEnd(char *content, char **var, char **val_begin, char **val_end) +{ + + char *p, *pn, *lineEnd; + ; + int val_len; + + while (1) { + if (content == NULL) + return NULL; + + for (; *content == ' ' || *content == '\t' || *content == '\r' || *content == '\n'; content++) ; + if (*content == '\0') + return NULL; + *var = content; + pn = strchr(content, '\n'); + p = strchr(content, '='); + if (p == NULL) { + if (pn) { + content = pn + 1; + continue; + } else + return NULL; + } + content = p; + //将变量以\0结束 + for (p--; *p == ' ' || *p == '\t'; p--) ; + *(p + 1) = '\0'; + //值的首地址 + for (content++; *content == ' ' || *content == '\t'; content++) ; + if (*content == '\0') + return NULL; + //双引号引起来的值支持换行 + if (*content == '"') { + *val_begin = content + 1; + *val_end = strstr(*val_begin, "\";"); + if (*val_end != NULL) + break; + } else + *val_begin = content; + *val_end = strchr(content, ';'); + if (pn && *val_end > pn) { + content = pn + 1; + continue; + } + break; + } + + if (*val_end) { + **val_end = '\0'; + val_len = *val_end - *val_begin; + lineEnd = *val_end; + } else { + val_len = strlen(*val_begin); + *val_end = lineEnd = *val_begin + val_len; + } + *val_end = *val_begin + val_len; + //printf("var[%s]\nbegin[%s]\n\n", *var, *val_begin); + return lineEnd; +} + +static void parse_global_module(char *content, conf * conf) +{ + char *var, *val_begin, *val_end, *lineEnd; + int val_begin_len; + + while ((lineEnd = set_var_val_lineEnd(content, &var, &val_begin, &val_end)) != NULL) { + if (strcasecmp(var, "DAEMON") == 0) { + val_begin_len = val_end - val_begin; + + if (copy_new_mem(val_begin, val_begin_len, &conf->DAEMON) != 0) + return; + } + + if (strcasecmp(var, "TIME") == 0) { + val_begin_len = val_end - val_begin; + conf->TIME = atoi(val_begin); + + } + + if (strcasecmp(var, "REFUSE_NUMBER") == 0) { + val_begin_len = val_end - val_begin; + conf->REFUSE_NUMBER = atoi(val_begin); + + } + + if (strcasecmp(var, "IS_MAIL") == 0) { + val_begin_len = val_end - val_begin; + conf->IS_MAIL = atoi(val_begin); + + } + + if (strcasecmp(var, "IS_DING_WEBHOOK") == 0) { + val_begin_len = val_end - val_begin; + conf->IS_DING_WEBHOOK = atoi(val_begin); + + } + + if (strcasecmp(var, "PHONE") == 0) { + val_begin_len = val_end - val_begin; + if (copy_new_mem(val_begin, val_begin_len, &conf->PHONE) != 0) + return; + } + + if (strcasecmp(var, "DING_WEBHOOK") == 0) { + val_begin_len = val_end - val_begin; + if (copy_new_mem(val_begin, val_begin_len, &conf->DING_WEBHOOK) != 0) + return; + } + + if (strcasecmp(var, "IS_QQMAIL") == 0) { + val_begin_len = val_end - val_begin; + conf->IS_QQMAIL = atoi(val_begin); + } + + if (strcasecmp(var, "SEND_QQ") == 0) { + val_begin_len = val_end - val_begin; + if (copy_new_mem(val_begin, val_begin_len, &conf->SEND_QQ) != 0) + return; + } + + if (strcasecmp(var, "QQMAIL_KEY") == 0) { + val_begin_len = val_end - val_begin; + if (copy_new_mem(val_begin, val_begin_len, &conf->QQMAIL_KEY) != 0) + return; + } + + if (strcasecmp(var, "RECV_MAIL") == 0) { + val_begin_len = val_end - val_begin; + if (copy_new_mem(val_begin, val_begin_len, &conf->RECV_MAIL) != 0) + return; + } + + content = strchr(lineEnd + 1, '\n'); + } +} + +/* 在buff中读取模块(global http https httpdns httpudp)内容 */ +static char *read_module(char *buff, const char *module_name) +{ + int len; + char *p, *p0; + + len = strlen(module_name); + p = buff; + while (1) { + while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') + p++; + if (strncasecmp(p, module_name, len) == 0) { + p += len; + while (*p == ' ' || *p == '\t' || *p == '\r' || *p == '\n') + p++; + if (*p == '{') + break; + } + if ((p = strchr(p, '\n')) == NULL) + return NULL; + } + + if ((p0 = strchr(++p, '}')) == NULL) + return NULL; + return strndup(p, p0 - p); +} + +void read_conf(char *filename, conf * configure) +{ + char *buff, *global_content; + FILE *file; + long file_size; + int return_val; + + file = fopen(filename, "r"); + if (file == NULL) + perror("cannot open config file."); + fseek(file, 0, SEEK_END); + file_size = ftell(file); + buff = (char *)alloca(file_size + 1); + if (buff == NULL) + perror("out of memory."); + rewind(file); + if (1 > (return_val = fread(buff, file_size, 1, file))) + perror("fread"); + fclose(file); + buff[file_size] = '\0'; + + if ((global_content = read_module(buff, "global")) == NULL) { + perror("read global module error"); + } + parse_global_module(global_content, configure); + free(global_content); +} + +void free_conf(conf * conf) +{ + free(conf->DAEMON); + free(conf->PHONE); + free(conf->DING_WEBHOOK); + free(conf->SEND_QQ); + free(conf->QQMAIL_KEY); + free(conf->RECV_MAIL); + + return; +} + +void ptintf_conf(conf *conf) +{ + printf("%s\n", conf->DAEMON); + printf("%d\n", conf->TIME); + printf("%d\n", conf->REFUSE_NUMBER); + printf("%d\n", conf->IS_MAIL); + printf("%d\n", conf->IS_DING_WEBHOOK); + printf("%s\n", conf->PHONE); + printf("%s\n", conf->DING_WEBHOOK); + printf("%d\n", conf->IS_QQMAIL); + printf("%s\n", conf->SEND_QQ); + printf("%s\n", conf->QQMAIL_KEY); + printf("%s\n", conf->RECV_MAIL); +} diff --git a/conf.h b/conf.h new file mode 100644 index 0000000..75ba8be --- /dev/null +++ b/conf.h @@ -0,0 +1,32 @@ +#ifndef CONF_H +#define CONF_H + +#include +#include +#include +#include +#include + +typedef struct CONF { + char *DAEMON; + int TIME; + + int REFUSE_NUMBER; + + int IS_MAIL; + + int IS_DING_WEBHOOK; + char *PHONE; + char *DING_WEBHOOK; + + int IS_QQMAIL; + char *SEND_QQ; + char *QQMAIL_KEY; + char *RECV_MAIL; +} conf; + +void read_conf(char *filename, conf *configure); +void free_conf(conf * conf); +void ptintf_conf(conf *conf); + +#endif \ No newline at end of file diff --git a/conf.o b/conf.o new file mode 100644 index 0000000000000000000000000000000000000000..baef531771292fda628efec44383b4abbded3c18 GIT binary patch literal 16592 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 ${log_file} - df -am &>> ${log_file} + echo "Read-Only Memory,ROM:" &>> ${LOG_FILE} + df -am &>> ${LOG_FILE} - echo "random access memory,RAM:" &>> ${log_file} - free -hl &>> ${log_file} + echo "random access memory,RAM:" &>> ${LOG_FILE} + free -hl &>> ${LOG_FILE} - echo "System process:" &>> ${log_file} - ps -axjf &>> ${log_file} + echo "System process:" &>> ${LOG_FILE} + ps -axwwjf &>> ${LOG_FILE} - echo "Network Connections" &>> ${log_file} - netstat -tnulp &>> ${log_file} + echo "Network Connections" &>> ${LOG_FILE} + netstat -tnulp &>> ${LOG_FILE} - echo "System SSH authorization information:" &>> ${log_file} - /root/denyhosts/rhost | awk '{a[$1]+=1;} END {for(i in a){print a[i]" "i;}}' &>> ${log_file} + echo "System SSH authorization information:" &>> ${LOG_FILE} + /root/denyhosts/rhost | awk '{a[$1]+=1;} END {for(i in a){print a[i]" "i;}}' &>> ${LOG_FILE} - /sbin/iptables-save > /root/ipv4tables + $IPTABLES_SAVE > /root/ipv4tables - echo "" &>> ${log_file} - echo "Iptables filter table" &>> ${log_file} - /sbin/iptables -L -n --line-numbers &>> ${log_file} - echo "" &>> ${log_file} + echo "" &>> ${LOG_FILE} + echo "Iptables filter table" &>> ${LOG_FILE} + $IPTABLES -L -n --line-numbers &>> ${LOG_FILE} + echo "" &>> ${LOG_FILE} - if test $send_mail = 1; then - mail -s "System Log" ${email_address} < ${log_file} - rm ${log_file} + if test $SEND_MAIL = 1; then + mail -s "System Log" ${EMAIL_ADDRESS} < ${LOG_FILE} + rm ${LOG_FILE} fi sync diff --git a/libiptc.c b/libiptc.c new file mode 100644 index 0000000..8e5c457 --- /dev/null +++ b/libiptc.c @@ -0,0 +1,209 @@ +#include "libiptc.h" + + +int x_get_rule(const char *chain, struct xtc_handle *handle, char *ipv4) +{ + int r=1; + const struct ipt_entry *entry; + + for (entry = iptc_first_rule(chain, handle); entry; entry = iptc_next_rule(entry, handle)) { + iptc_get_target(entry, handle); + + char addr[33]; + memset(addr, 0, 33); + inet_ntop(AF_INET, &(entry->ip.dst), addr, sizeof(addr)); + printf("%s\n", addr); + if (0 == strcmp(ipv4, addr)) + { + r=0; + break; + } + + } + + return r; + +} + +int show_all_rule(char *ipv4) +{ + int r; + struct xtc_handle *handle; + const char *chain = NULL; + struct ipt_counters counter; + + handle = iptc_init("filter"); + + for (chain = iptc_first_chain(handle); chain; chain = iptc_next_chain(handle)) + { + if (chain != NULL && handle != NULL) { + iptc_get_policy(chain, &counter, handle); + } + + r = x_get_rule(chain, handle, ipv4); + if (r==0){ + break; + } + } + + return r; +} + +static u_int16_t parse_port(const char *port) +{ + return atoi(port); +} + +static void parse_ports(const char *portstring, u_int16_t * ports) +{ + char *buffer; + char *cp; + + buffer = strdup(portstring); + if ((cp = strchr(buffer, ':')) == NULL) + ports[0] = ports[1] = parse_port(buffer); + else { + *cp = '\0'; + cp++; + + ports[0] = buffer[0] ? parse_port(buffer) : 0; + ports[1] = cp[0] ? parse_port(cp) : 0xFFFF; + } + free(buffer); +} + +struct ipt_entry_match *get_match(const char *sports, const char *dports, unsigned int *nfcache, char *protocol) +{ + struct ipt_entry_match *match; + struct ipt_udp *udpinfo; + size_t size; + + size = IPT_ALIGN(sizeof(*match)) + IPT_ALIGN(sizeof(*udpinfo)); + match = (struct ipt_entry_match *)calloc(1, size); + match->u.match_size = size; + strncpy(match->u.user.name, protocol, IPT_FUNCTION_MAXNAMELEN); + + udpinfo = (struct ipt_udp *)match->data; + udpinfo->spts[1] = udpinfo->dpts[1] = 0xFFFF; + //printf("sports=%s,dports=%s\n", sports, dports); + if (sports) { + *nfcache |= NFC_IP_SRC_PT; + parse_ports(sports, udpinfo->spts); + } + if (dports) { + *nfcache |= NFC_IP_DST_PT; + parse_ports(dports, udpinfo->dpts); + } + + return match; +} + +int iptc_add_rule(const char *table, const char *chain, int protocol, const char *iniface, const char *outiface, unsigned int src, + unsigned int dest, const char *srcports, const char *destports, const char *target, const char *dnat_to, const int append) +{ + struct xtc_handle *handle; + struct ipt_entry *chain_entry; + struct ipt_entry_match *entry_match = NULL; + struct ipt_entry_target *entry_target; + ipt_chainlabel labelit; + long match_size; + int result = 0; + + chain_entry = (struct ipt_entry *)calloc(1, sizeof(*chain_entry)); + + if (src != 0) { + chain_entry->ip.src.s_addr = src; + chain_entry->ip.smsk.s_addr = 0xFFFFFFFF; + } + if (dest != 0) { + chain_entry->ip.dst.s_addr = dest; + chain_entry->ip.dmsk.s_addr = 0xFFFFFFFF; + } + + if (iniface) + strncpy(chain_entry->ip.iniface, iniface, IFNAMSIZ); + if (outiface) + strncpy(chain_entry->ip.outiface, outiface, IFNAMSIZ); + + chain_entry->ip.proto = protocol; + if (IPPROTO_UDP == protocol) + entry_match = get_match(srcports, destports, &chain_entry->nfcache, "udp"); + if (IPPROTO_TCP == protocol) + entry_match = get_match(srcports, destports, &chain_entry->nfcache, "tcp"); + + if (strcmp(target, "") == 0 || strcmp(target, IPTC_LABEL_ACCEPT) == 0 || strcmp(target, IPTC_LABEL_DROP) == 0 || strcmp(target, IPTC_LABEL_QUEUE) == 0 || strcmp(target, IPTC_LABEL_RETURN) == 0) { + size_t size; + size = IPT_ALIGN(sizeof(struct ipt_entry_target)) + IPT_ALIGN(sizeof(int)); + entry_target = (struct ipt_entry_target *)calloc(1, size); + entry_target->u.user.target_size = size; + strncpy(entry_target->u.user.name, target, IPT_FUNCTION_MAXNAMELEN); + } + if (entry_match) { + match_size = entry_match->u.match_size; + } else + match_size = 0; + + struct ipt_entry *tmp_ipt = chain_entry; + chain_entry = (struct ipt_entry *)realloc(chain_entry, sizeof(*chain_entry) + match_size + entry_target->u.target_size); + if (chain_entry == NULL) { + free(tmp_ipt); + } + + memcpy(chain_entry->elems + match_size, entry_target, entry_target->u.target_size); + chain_entry->target_offset = sizeof(*chain_entry) + match_size; + chain_entry->next_offset = sizeof(*chain_entry) + match_size + entry_target->u.target_size; + if (entry_match) { + memcpy(chain_entry->elems, entry_match, match_size); + } + + handle = iptc_init(table); + if (!handle) { + printf("libiptc error: Can't initialize table %s, %s\n", table, iptc_strerror(errno)); + free(chain_entry); + free(entry_target); + if (entry_match) + free(entry_match); + return 1; + } + + strncpy(labelit, chain, sizeof(ipt_chainlabel)); + //printf("Chain name:%s\n", chain); + result = iptc_is_chain(chain, handle); + if (!result) { + printf("libiptc error: Chain %s does not exist!\n", chain); + free(chain_entry); + free(entry_target); + if (entry_match) + free(entry_match); + return 1; + } + if (append) + result = iptc_append_entry(labelit, chain_entry, handle); + else + result = iptc_insert_entry(labelit, chain_entry, 0, handle); + if (!result) { + printf("libiptc error: Can't add, %s\n", iptc_strerror(errno)); + free(chain_entry); + free(entry_target); + if (entry_match) + free(entry_match); + return 1; + } + result = iptc_commit(handle); + if (!result) { + printf("libiptc error: Commit error, %s\n", iptc_strerror(errno)); + free(chain_entry); + free(entry_target); + if (entry_match) + free(entry_match); + return 1; + } + + + if (entry_match) + free(entry_match); + free(entry_target); + free(chain_entry); + + return 0; +} \ No newline at end of file diff --git a/libiptc.h b/libiptc.h new file mode 100644 index 0000000..3d56ab3 --- /dev/null +++ b/libiptc.h @@ -0,0 +1,38 @@ +#ifndef LIBIPTC_H +#define LIBIPTC_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/* Source port. */ +#define NFC_IP_SRC_PT 0x0200 +/* Dest port. */ +#define NFC_IP_DST_PT 0x0400 + + +#ifndef IPT_MIN_ALIGN +#define IPT_MIN_ALIGN (__alignof__(struct ipt_entry)) +#endif + +#define IPT_ALIGN(s) (((s) + ((IPT_MIN_ALIGN)-1)) & ~((IPT_MIN_ALIGN)-1)) + +#define IPTC_ENTRY_SIZE XT_ALIGN(sizeof(struct ipt_entry)) +#define IPTC_MATCH_SIZE XT_ALIGN(sizeof(struct ipt_entry_match) + sizeof(struct ipt_udp)) +#define IPTC_TARGET_SIZE XT_ALIGN(sizeof(struct ipt_entry_target)) +#define IPTC_FULL_SIZE IPTC_ENTRY_SIZE + IPTC_MATCH_SIZE + IPTC_TARGET_SIZE + + +int show_all_rule(char *ipv4); +int iptc_add_rule(const char *table, const char *chain, int protocol, const char *iniface, const char *outiface, unsigned int src, + unsigned int dest, const char *srcports, const char *destports, const char *target, const char *dnat_to, const int append); + +#endif diff --git a/libiptc.o b/libiptc.o new file mode 100644 index 0000000000000000000000000000000000000000..db649b9d571f6fcafae0d83314c25d8df028d8c7 GIT binary patch literal 19232 zcmcIr4Rn;%nZ7fV%S`@tt5me}nc+fqf3uG-et{;X16HU3nzYZcvU=|5-1N{ij1cF(dcE&IOjeecYdYi3VR zw|mdY{qFm`?|uL7&v(CXzTDuye67>r5V|=YRGpZU#avb-~P-U0vECHRNpFcn1Kljpe98fC+^kU$s{|t5x9FTO$MsW%(oyu4SHK#jCku?i0r-U^X ztepxR=r{&)VDXiV=t$>_fsqdEZik2c=Z5y46IPX}mXxONJMB1Vcg_pWodwaeTCH+> zGYmvMu#Uq(pkcUX(oPOPwH$-Vf+s-z36Y)yvd01kwmP--FF-PShFztPl_RHT*n9da zXq%&C;k9Qt=!Dc97uH-LUmOwpUUrh|7f~||EajGF z^-X_)u0wl|39DX<=4C~}z=2>MFplx8>_l;}&oSQk?m_Zx@0~DY2ZuXvhbZ@5K78{a zq-f1>$88ue2#BNplX!V*0IG3OA0OI#o3JX-p^?tpDDLA&TRoWKp}k&VO;H^0FnIy2 zB4mNX`-D}EJV+8IYv1EuP#qY~CTZwNbV67)EaeM~kXxqUi2rtq_c$aiIJEcn$uyln zZ*WUsBn`d%(*g&I(R7+;N(b=_263V#w}}nXWjN*bh`Z0~gp|vZDzoD}`a&irmu2 z(6LjFV_EzvumBFv$V_pi@9cO*FjX_V${6$*6X_7eGa@n!T!tX`LU!Y%t-%&{*8hw; zGLGSaLB&3T3;Z|FKn;85LAV7Re%yznGHyQ|gB}NMsT%g59NK$Qq=O3o`}nXDd>Gn$ zF)bRr&2&Jr{fBLifYsBmRFIcu-fNG8ubEk|-MY%m)!)a#Lud*%JDoah?#llcbEg-n zsWNV~z&y;k%)lPkZ5sNQp2K7a(G!hXk)%j>4+twfAXc}v`GZ@;noS#n;)+gxr(bOH zZ|U5$LByilqXSmh7fB`)$>qMbP<+1Si^ii?G!%>OiTJG0_E^MMm%0%C3P7(Z-xrF; zf#vH?L{h$Z!tzB1qbaMl;6s9>IMm(EicCF;{{AR*MlY1aK%o#)I6N54bgX7#WiJbf zrx0p7Uz>_I-h7W6!F(rOX5`6e+!Cb$fZW$2?wAC%DBVVF>X@IWdMHl5lTIPTan)C^ z207JUSQ*1U9%5H}+^C`Q-VFQosmLbLyt^xIBvGYT^(a93e}}&!^s+`t%IOscfTCWL zYNvc%x81YKP!y6NM4r3G2kQb)W5Qiq`bWHqneIF^=U(9Y3GiHmQSG4GNp&98lc@Gk zT}1U{sw=6UNp&sN3#e|Sx{2z=R9{5()l^?Y^>(Uzsg6;76Vp>VhISi;rp?&|H95FYqD5*hl4y^b7mag!_AZb{x0mECgcjRq@gmG_-vUkL zHihcVk3S5Eawg%ShYlu6knpIiKM69F^-@6&|4`EoHH`}jsvLQ&reL}U#g)#28ARlf z&Vp(;j-*HR*;45L3iK&SCBvd{-Q-EY5hdLz3y4Z2RG-3j;^2_Ml4+lcoFYZ6ccbfG zCZ;3dQ^aLn)Vzp^dL&vEvB87G98|;=IH3bLZT1D*fR)OLHQHmyMV$}n!M#znF zw0Mg0N?r#$?l$0+E`y3@He6vEd|3wIat#m;|rm33v&t>?luv-QEiIU45MQHnHnpeXr?{1A~)a+ca5G^?4B|t zoukT7&s-FCj(SK_&vHe16?KK8rYS0-D4(JRH&VZP7*!$qreSQZ(MN6|GCCClagGLv zx^8BWs6L{0%<3fSTB2eV4b<_V>eyfKMbf&JnDKlJ(>c0@s5?lhYxKwsRcI2+T6Gb` zztxMQ;v8*-)r8xI8}Dsyyi-uhFRMZ?bUDcl$DtE|Qbdbz>~?HYYhr8%!f&8ovpu2D|hiB3!!=Y)GEu07}IwVA1rV(sKrQ3;yB@e-mA52bV$ z^FhX?XfKD3#llsxyzr93WrgkK7o%uB0M+Q0L{6y6v`S0QuWBz}QRM&? zla`o*?ov@$>p}INN}GB(4b2sWg{ul(C2(tVINHmxdttf5RZ>_;KGb>;DXIn6n!tr( za;`RCxd8VUpgneHOXpD#-f{;hAh}u>YM9KPD(}(N$&NC2>$Fdi!)4{*)C$N~IT~7u z_kfB_XmVL$Hnb@anrB=NDwmSQsgxy1{Isc#!df5OcB1X7LI)ay$v4?iS5jW+s+m!P zfENzMGdO;a5Y><)2ytefV^v`xaQvth6@nZdD| z(+F8rI_Fo}gP&_>jL%CQ4hfjO5dNI-$7c;{VP$^^%Ye{mgPAVjT=D?49S+BzV3^*^EAt9&o-IAAF8q^WRa&)mRv4ZyLKIvi-j}K0YXKt(yvR$ zs%AO)Nm+8UEb}aq@_kvfNX|e3OBSa+QRp}-F9F)=+T9~BM8^BF_)b|gS2|WU%c3Ww z6#`m&yv-45m|!Ft%|o_%2i-%mn`t?mh*>XmFF@!{Us^)%VN(ex!?&|cbBZ(FFiNO zvb3D*DVO={rRUcfV!teUM>;NBEN43FrpWwTXgVHmE5;NALmXdd*=L2~q#IV&lzZ}N>2^dD{eL~86V3aUs zm=nF8yKNlLVOiD-8Sr?1EL*|YR?piuZpmTkd0V!92=@%4QTYUj{tL`QNWnIz6V}N< z5?)^Ph*)TQBo?&kh)7wtDE18Z(6f+%XzfmA7J`T?IQ&!L)5$_3y z!hNg-J7X66Lsqy?^hf$JH0lO%(iVuTPYcWeC(w6d)q*dl2Heg+}SVz3{hJ}D0~VwQMhV6U$Gi{1 z3H3)rcgPB51UI+AXsc;Ku8-4?K8bZ3I(==;OMT7FjTbd8@-_5Z>3C#iZzLW`M#Dgc zK=aDMi(496miQWaeGNUK)b2PKOT-iDR6{zxD;n=^ptpl5o`xCYU^<*g$Km~BN~n30 zVRZzzz-*&=W9FfAO;BtP>ygG+kOI!@YA&i;&tz1g1`D#8v81^jtG8y%`L_i8n>P5j zVA@p=7|C5-p;%1KA{u3w5sK0pHf{bGj7S%ZX>$vVsfI80`?mxGVvrUfO~UR-%2KX% z$3rl%iHvM}@MA6b@--UoNr-d`-o$Dx!OoxuvaurnFkbJ-0C$2!NbBscg6N}PY<{gjqmJ z8|M)@1WnSX)=4#47l!R%~VB2u`Z$?vYN?7G%5_}A&NR>@Zjg_7FU z1uH9_=!zx6Aq#gIh*eDsB^r&xii}%{fo#}qxS`+%7>z?hSzPoaBN6Bv?&=H0yCLF? z9%GrU+vHch)#{}2qeyvAgLO~ogSn9iqZWL14(qEsopqrjc==|b(xyXP9T03-BkjTV zAZ(sW&j3zn&4C$ydHWW>ZSa&wxcRWR6d$A>UWSVukz_m)168SX%o4Qq@fh>Ano$e} z`F(n0STyy=t)_5OC*&yA6pyBNr(>}DG_8rGc0f9tdZSijC^{GoB^vu9P2G|B?!H6{ zroi9YEuBg>f$^r^aJUJ!i>{U>4PY-l*w7nKH#IjmMdRUEx;rA8P>_ia3vQ313;(M~ zYPTT)GX!VJ_->(8e*bGgaPN+E1FkKDMlg^71g0@e0cvyu7yCjY;6iHbJySl`Ci?gkGlJjMdP`nk2t)8Sa{5v!J ztC>$v=9=G0Y~cgmrPZ@dQz4H_CT=*fW#c&bxB~||5$7)YEkq^bw=u3?eqd*pdVs;^xZ+ap zd&gl&xYRrI3GmFjm2o_mfM;%_%m%v57MFf4(EvDpx?q--08E5;(@@KY9kJpCJvEj9h>v5k8JS>eidBn8; z%Wb&b|Ft>rZ8`8y+HiZ`K5N74YFXV6fEDi$=m(JpL((2u-X0mK@R*EIdJvm zk=g`ccpQm?$WH>Oy`Zev&u(gn^%8{W}d@_t*1O>%W!d_Z#wh zKmDwM-_P=TzGyvNj6ZD1f0g~$=L9Xkhy6cl$m{z(p5w7-`E!aCZ}C;*L#+Sz2L23Xye~agp9v|(05$lN<@(;884g>$Va$j6;;E%A~T?XFI_+A6Ql;a&T za5vi>Ht;X9{O1h3js5w8fvc}2h4`|8-^cR$yr=W9k?{u%`JXZUuz{=Z+JyLyfq$R< z{GNf|!Z`ic1K84bmvVl-Z^*yT_`e$Xi=3a=4g3O@f7`(6V?wa^o`Ju_@&4Js_4!PF z(U+kk@%w zVckM4m-E82CId9h)xX#0^242JT=M8*}^&B?v-*a5A82BK||J1;zv-~>-zMaSG z4+g%CaVKAOp37NJy@4NQ`XdJZDv$4_2L7&|&jvoq<8rluw=x|y@Y|W*Y2dv~>-(7Y z|MPl28}d5dZy5M8_VWb;*U!WMX5e#~K4IVmd|&&Wf$w4Zj|P5(^Xz7Swf_#r8x8y~ zJbr5od_L3d27ZR=E(7;6J#64NaULEr@Lw|iyn!<;es18qd3@hD@Skw}F3yvVH_7sI z4EzZ9|EPigBOC5A@atJ#KWAzE@X-+!{hX!o8qV`WhMpT({%HgM73cpA1K00UP8)bB z`&r0`Y;E@ujO7n|8LIo9R_|K$MtOkKf(A94SWORrwqJ{ z^YA|7=pMSR-{0o*;ayo2>84IKXo0n0uE zzl-gD*1+}s<&c3t$nsw`@Ml>65d*)E^Lf<3@e_C~Zy5Nq?EhN^{wC{x&%k*&_*1g% zeNf-WOYq?biXIoe4yz6P4@yj2z_=dYH`$*RhWtwQ=i>&B@4vA`3_beyf=?OpmJ%1A zG4Ou2d#8cx{rLd{*YoF51J~!J=M9|x>jP}RZs0nu(*~|Swie=j#&v%5?`8RzU?@7z z&u|{58n~P1Po05p;&|5@_!~S=u3%i-)xY2M8S*;MyA1pawtJ(YNB=%`ry>6``~MvS z*Yo)q1J~>NRRdqlasAT3^?B$N<2o*tMIp``@>+ihzfeUs4u$q-rh#k!@v~tpTK+CY zinWYuyGt3r(vaW8dEjlH^yoHr(Z5w`J*-B|<_6luztv37Gw?yC7aI6IOg9?%^Gxga zC0hTl8E-M<_4E941Fzt?RvCCR5Kgakk1K0ECQwIJT%in0=KWF?F1Am9{5d;5#@q-3_ zp7Adjcp>k%Uo!A1jNfhG`uX!d1J}=A4;gq9>-mO(w=jN$adeL%LVS!PX2)9%T<UI?%X2hls}1?tb`81+G?7UHfz^8Ht4&E%NnA!UWaJ6K7iud64CUr+vDiw_jw7)>%1wK8pfC(qL@BRvCJdGObo zK~&>Ry}GLZX@-AK022H1aYW#6gjnXmAL4wwL5RwAT2KRgHSOc~{V4jk_HTy1sM9_d zffNI5{~07~#dHhzL(?Y|Z|3{H#rFrT!j#45%8BxKwn_D9#UKBmVE%B7w0)gF+(%8F z0Ezo6u!i4wjKECUPk@YxVZSkcalZ%&TQOy~0&gP!FJ7%W>Hg?Hro{CBdcaJb*z*kA z*Y8;n!(z(D0Gr5uAKO30@uPhl3e!HmuScEQPiRtE%0EynFcyZkudla(^hEuy^(j58 za^zq4zcWYwyJoBY`n{5(vhnNw_i%sB*ViYxzozw7_tW&F&_K*^Q;c!{6Izh3I)57e z7BnWxe{hYG(Dy6MKTc)cU(er(Y-7*EbFdcTI4^9R&J&Fv&M9;4W52=qSPNkp0UIRw RG*SN(?Ee^P$yR3n{{d%XU`YS~ literal 0 HcmV?d00001 diff --git a/rhost b/rhost index 90f79e1cacbb8addbe659dd452e4b759dea4e4bd..f181f44b6a492c7f7531a5b5955e950472120f4d 100644 GIT binary patch literal 69184 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�R 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 literal 44240 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≫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 -#include -#include -#include -#include -#include -#include -#include -#include -#define CENTOS_SYSTEM 1 -#define DEBISN_SYSTEM 2 -#define UNKNOWN_SYSTEM 3 +#include "conf.h" +#include "rhost.h" +#include "libiptc.h" -#define BUFFER 1024 -#define LONG_BUFFER 1024*100 -#define TOP_IP 10 -#define AWK " | awk -v num=%d '{a[$1]+=1;} END {for(i in a){if (a[i] >= num) {print i;}}}' " -#define GE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\").$(LC_ALL=\"C\" date \"+%d\")\" /var/log/auth.log | grep failure | grep rhost" -#define LE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\")..$(LC_ALL=\"C\" date | awk '{print $3}')\" /var/log/auth.log | grep failure | grep rhost" - -#define CENTOS_GE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\").$(LC_ALL=\"C\" date \"+%d\")\" /var/log/secure | grep failure | grep rhost" -#define CENTOS_LE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\")..$(LC_ALL=\"C\" date | awk '{print $3}')\" /var/log/secure | grep failure | grep rhost" - -#define IPTABLES "iptables -I INPUT -s %s -j DROP" -#define IPTABLES_CHECK "iptables -C INPUT -s %s -j DROP" - -#define TIME 60 - -#define IS_DIND 1 -#define PHONE "155659790" -#define DING_CURL "https://oapi.dingtalk.com/robot/send?access_token=7f069c672cb878987aa6772cca336740eece4ce36bde12b51b45e9f440e" - -#define IS_MAIL 0 - -#define IS_QQMAIL 0 -#define QQMAIL "qqMail -l smtp.qq.com -p 25 -f 1605227279 -e caczsjchvyibi -q NIUYULING -r 1605227279@QQ.COM -n NIUYULING -s \"System ban IP\" -t \"%s\"" // 存储公网IP char public_ip[BUFFER]; @@ -112,8 +80,14 @@ int strReplaceAll(char *str, char *sub, char *replace) } // 钉钉告警 -int dingding_warning(char *illegal_ip, char *public_ip) +int dingding_warning(char *illegal_ip, char *public_ip, conf *conf) { + FILE *fp; + if ((fp = fopen("libcurl_ding.log", "wt+")) == NULL){ + + return 1; + } + CURL *curl; CURLcode res; @@ -135,28 +109,30 @@ int dingding_warning(char *illegal_ip, char *public_ip) }"; strReplaceAll(jsonObj, "IP", illegal_ip); - strReplaceAll(jsonObj, "PHONE", PHONE); + strReplaceAll(jsonObj, "PHONE", conf->PHONE); strReplaceAll(jsonObj, "PUBLIC", public_ip); - printf("%s\n", jsonObj); + //printf("%s\n", jsonObj); struct curl_slist *headers = NULL; headers = curl_slist_append(headers, "Accept: application/json"); headers = curl_slist_append(headers, "Content-Type: application/json"); headers = curl_slist_append(headers, "charset: utf-8"); - curl_easy_setopt(curl, CURLOPT_URL, DING_CURL); + curl_easy_setopt(curl, CURLOPT_URL, conf->DING_WEBHOOK); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0); curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 0); curl_easy_setopt(curl, CURLOPT_POST, 1); curl_easy_setopt(curl, CURLOPT_HTTPHEADER, headers); curl_easy_setopt(curl, CURLOPT_POSTFIELDS, jsonObj); curl_easy_setopt(curl, CURLOPT_USERAGENT, "libcurl/0.1"); - + curl_easy_setopt(curl, CURLOPT_WRITEDATA, fp); + res = curl_easy_perform(curl); curl_easy_cleanup(curl); curl_global_cleanup(); - + fclose(fp); + return res; } @@ -188,17 +164,18 @@ int mail_warning(char *illegal_ip, char *public_ip) } // 第三方邮箱告警 -int QQ_mail_warning(char *illegal_ip, char *public_ip) +int QQ_mail_warning(char *illegal_ip, char *public_ip, conf *conf) { char string[BUFFER+(sizeof(QQMAIL))]; - char text[BUFFER] = "主机:HOST, 禁止IP访问!"; + char text[BUFFER] = "主机:HOST, 禁止IP访问"; strReplaceAll(text, "IP", illegal_ip); strReplaceAll(text, "HOST", public_ip); memset(string, 0, BUFFER+(sizeof(QQMAIL))); - sprintf(string, QQMAIL, text); + + sprintf(string, QQMAIL, conf->SEND_QQ, conf->QQMAIL_KEY, conf->RECV_MAIL, text); system(string); @@ -206,10 +183,10 @@ int QQ_mail_warning(char *illegal_ip, char *public_ip) } // 封禁非法IP -int rule() +int rule(conf *conf) { FILE *fp, *fc; - char p[2], splice_command[LONG_BUFFER], command[LONG_BUFFER], *temp, buffer[BUFFER], awk[BUFFER], iptables[BUFFER + (sizeof(IPTABLES))], iptables_check[BUFFER + (sizeof(IPTABLES))]; + char p[2], splice_command[LONG_BUFFER], command[LONG_BUFFER], *temp, buffer[BUFFER], awk[BUFFER], iptables[BUFFER + (sizeof(IPTABLES))], iptables_check[BUFFER + (sizeof(IPTABLES_CHECK))]; time_t timep; struct tm *tp; @@ -220,7 +197,7 @@ int rule() memset(buffer, 0, BUFFER); memset(awk, 0, BUFFER); memset(iptables, 0, BUFFER+(sizeof(IPTABLES))); - memset(iptables_check, 0, BUFFER+(sizeof(IPTABLES))); + memset(iptables_check, 0, BUFFER+(sizeof(IPTABLES_CHECK))); fp = NULL; fc = NULL; @@ -263,54 +240,63 @@ int rule() strcat(splice_command, "\n"); } } - printf("%s", splice_command); // 打印所有非法IP + printf("%s", splice_command); // 打印所有非法IP // 拼接命令 - sprintf(awk, AWK, TOP_IP); + sprintf(awk, AWK, conf->REFUSE_NUMBER); strcpy(command, "echo \""); strcat(command, splice_command); strcat(command, "\""); strcat(command, awk); - if ((fp = popen(command, "r")) == NULL) // 执行命令 + if ((fp = popen(command, "r")) == NULL) // 执行命令 { perror("popen command"); return 1; } - while (fgets(buffer, BUFFER, fp) != NULL) // 执行命令后, 为空时就不会 + while (fgets(buffer, BUFFER, fp) != NULL) // 执行命令后, 为空时就不会 { - buffer[strlen(buffer) - 1] = '\0'; // 去除回车 + buffer[strlen(buffer) - 1] = '\0'; // 去除回车 sprintf(iptables, IPTABLES, buffer); sprintf(iptables_check, IPTABLES_CHECK, buffer); - - if (0 != system(iptables_check)) // 判断是否存在规则, 不存在时再添加规则 + //if (0 != system(iptables_check)) // 判断是否存在规则, 不存在时再添加规则 + if (0 != show_all_rule(buffer)) { - if (IS_DIND == 1) // 钉钉告警 + if (conf->IS_DING_WEBHOOK == 1) // 钉钉告警 { - dingding_warning(buffer, public_ip); + dingding_warning(buffer, public_ip, conf); sleep(3); } - if (IS_MAIL == 1) // 邮件告警 + if (conf->IS_MAIL == 1) // 邮件告警 { mail_warning(buffer, public_ip); sleep(3); } - if (IS_QQMAIL == 1) // 邮件告警 + if (conf->IS_QQMAIL == 1) // 邮件告警 { - QQ_mail_warning(buffer, public_ip); + QQ_mail_warning(buffer, public_ip, conf); sleep(3); } - + + /* if ((fc = popen(iptables, "r")) == NULL) { perror("popen iptables"); return 1; } + */ + + + // libiptc 库插入规则 + unsigned int destIp; + inet_pton(AF_INET, buffer, &destIp); + iptc_add_rule("filter", "INPUT", IPPROTO_TCP, NULL, NULL, 0, destIp, NULL, NULL, "DROP", NULL, 1); + } } @@ -336,16 +322,23 @@ static void sig_child(int signo) int main(int argc, char *argv[], char **env) { + conf *conf = (struct CONF *)malloc(sizeof(struct CONF)); + read_conf("rhost.conf", conf); + //ptintf_conf(conf); + memset(public_ip, 0, BUFFER); get_public_ip(public_ip); - - signal(SIGCHLD, sig_child); // 创建捕捉子进程退出信号 + if (0 == strcmp(conf->DAEMON, "on")) + { + goto goto_daemon; + } if (argv[1] != NULL && 0 == strcmp(argv[1], "-d")) { +goto_daemon: if (daemon(1, 1)) // 守护进程 { perror("daemon"); @@ -353,17 +346,20 @@ int main(int argc, char *argv[], char **env) } while (1) { - rule(); + rule(conf); - sleep(TIME); + sleep(conf->TIME); } } else { - rule(); + rule(conf); } + free_conf(conf); + free(conf); + return 0; } diff --git a/rhost.conf b/rhost.conf new file mode 100644 index 0000000..13b007b --- /dev/null +++ b/rhost.conf @@ -0,0 +1,17 @@ +global { + DAEMON = "off"; // on开启后台运行,off不开启 + TIME = "60"; // 睡眠时间 + + REFUSE_NUMBER = 5; // 拒绝攻击次数 + + IS_MAIL = 0; // 开启邮件告警 + + IS_DING_WEBHOOK = 1; // 开启叮叮告警 + PHONE = "15565979082"; // @的人手机号 + DING_WEBHOOK = "https://oapi.dingtalk.com/robot/send?access_token=7f069c672cb878987aa6772cca336740eece4ce36bde12b51b45e9f440e0565a"; // 钉钉WEBHOOK + + IS_QQMAIL = 0; // 开启QQ邮箱告警 + SEND_QQ = "1605227279"; // 发送者QQ + QQMAIL_KEY = "caczsjchvyibiabe"; // 发送者QQ密钥 + RECV_MAIL = "1605227279"; // 接收者QQ +} diff --git a/rhost.h b/rhost.h new file mode 100644 index 0000000..38ad78a --- /dev/null +++ b/rhost.h @@ -0,0 +1,42 @@ +#ifndef RHOST_H +#define RHOST_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + + +#define CENTOS_SYSTEM 1 +#define DEBISN_SYSTEM 2 +#define UNKNOWN_SYSTEM 3 + +#define BUFFER 1024 +#define LONG_BUFFER 1024*100 + +#define AWK " | awk -v num=%d '{a[$1]+=1;} END {for(i in a){if (a[i] >= num) {print i;}}}' " +#define GE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\").$(LC_ALL=\"C\" date \"+%d\")\" /var/log/auth.log | grep failure | grep rhost" +#define LE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\")..$(LC_ALL=\"C\" date | awk '{print $3}')\" /var/log/auth.log | grep failure | grep rhost" + +#define CENTOS_GE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\").$(LC_ALL=\"C\" date \"+%d\")\" /var/log/secure | grep failure | grep rhost" +#define CENTOS_LE_10 "grep -E \"^$(LC_ALL=\"C\" date \"+%h\")..$(LC_ALL=\"C\" date | awk '{print $3}')\" /var/log/secure | grep failure | grep rhost" + +#define IPTABLES "`which iptables` -t filter -I INPUT -s %s -j DROP" +#define IPTABLES_CHECK "`which iptables` -t filter -C INPUT -s %s -j DROP 2> /dev/null" + +#define QQMAIL "qqMail -l smtp.qq.com -p 25 -f %s -e %s -q NIUYULING -r %s@QQ.COM -n NIUYULING -s \"System ban IP\" -t \"%s\"" + + +extern void read_conf(char *filename, conf *configure); +extern void free_conf(conf * conf); +extern void ptintf_conf(conf *conf); + + +#endif \ No newline at end of file diff --git a/rhost.o b/rhost.o index ab1531c7cfed6ba4f92e9f567869b13bc332a7d2..3d47e356ce5aa3ab1b318c9b9ed34aac7292ba18 100644 GIT binary patch literal 55272 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 literal 52280 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 I#9Ds;2R;~|FaQ7m