diff --git a/common.h b/common.h index f551ec5..b22833c 100644 --- a/common.h +++ b/common.h @@ -129,6 +129,25 @@ struct address_t //TODO scope id inner.ipv4.sin_addr.s_addr=ip; return 0; } + + int from_ip_port_new(int type, void * ip, int port) + { + clear(); + if(type==AF_INET) + { + inner.ipv4.sin_family=AF_INET; + inner.ipv4.sin_port=htons(port); + inner.ipv4.sin_addr.s_addr=*((u32_t *)ip); + } + else if(type==AF_INET6) + { + inner.ipv6.sin6_family=AF_INET; + inner.ipv6.sin6_port=htons(port); + inner.ipv6.sin6_addr=*((in6_addr*)ip); + } + return 0; + } + int from_str(char * str); int from_sockaddr(sockaddr *,socklen_t); @@ -138,7 +157,9 @@ struct address_t //TODO scope id inline u32_t get_type() { - return ((sockaddr*)&inner)->sa_family; + u32_t ret=((sockaddr*)&inner)->sa_family; + assert(ret==AF_INET||ret==AF_INET6); + return ret; } inline u32_t get_len() diff --git a/connection.cpp b/connection.cpp index 6f42dc5..405a01f 100644 --- a/connection.cpp +++ b/connection.cpp @@ -333,7 +333,7 @@ int conn_manager_t::clear_inactive0() } else { - mylog(log_info,"[%s:%d]inactive conn cleared \n",my_ntoa(it->second->raw_info.recv_info.src_ip),it->second->raw_info.recv_info.src_port); + mylog(log_info,"[%s:%d]inactive conn cleared \n",it->second->raw_info.recv_info.new_src_ip.get_str1(),it->second->raw_info.recv_info.src_port); old_it=it; it++; erase(old_it); diff --git a/main.cpp b/main.cpp index a3a03fb..ee2e640 100755 --- a/main.cpp +++ b/main.cpp @@ -52,11 +52,11 @@ int client_on_timer(conn_info_t &conn_info) //for client. called when a timer is - address_t new_addr; + address_t tmp_addr; //u32_t new_ip=0; if(!force_source_ip) { - if(get_src_adress2(new_addr,remote_addr)!=0) + if(get_src_adress2(tmp_addr,remote_addr)!=0) { mylog(log_warn,"get_src_adress() failed\n"); return -1; @@ -64,7 +64,7 @@ int client_on_timer(conn_info_t &conn_info) //for client. called when a timer is //source_addr=new_addr; //source_addr.set_port(0); - mylog(log_info,"source_addr is now %s\n",new_addr.get_ip()); + mylog(log_info,"source_addr is now %s\n",tmp_addr.get_ip()); /* if(new_ip!=source_ip_uint32) @@ -78,12 +78,16 @@ int client_on_timer(conn_info_t &conn_info) //for client. called when a timer is } else { - new_addr=source_addr; + tmp_addr=source_addr; } - if(new_addr.get_type()==AF_INET) + if(tmp_addr.get_type()==raw_ip_version&&raw_ip_version==AF_INET) { - send_info.src_ip=new_addr.inner.ipv4.sin_addr.s_addr; + send_info.new_src_ip.v4=tmp_addr.inner.ipv4.sin_addr.s_addr; + } + else if(tmp_addr.get_type()==raw_ip_version&&raw_ip_version==AF_INET6) + { + send_info.new_src_ip.v6=tmp_addr.inner.ipv6.sin6_addr; } else { @@ -92,7 +96,7 @@ int client_on_timer(conn_info_t &conn_info) //for client. called when a timer is if (force_source_port == 0) { - send_info.src_port = client_bind_to_a_new_port2(bind_fd,new_addr); + send_info.src_port = client_bind_to_a_new_port2(bind_fd,tmp_addr); } else { @@ -319,9 +323,9 @@ int client_on_raw_recv(conn_info_t &conn_info) //called when raw fd received a p { return -1; } - if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port) + if(!recv_info.new_src_ip.equal(send_info.new_dst_ip)||recv_info.src_port!=send_info.dst_port) { - mylog(log_debug,"unexpected adress %x %x %d %d\n",recv_info.src_ip,send_info.dst_ip,recv_info.src_port,send_info.dst_port); + mylog(log_debug,"unexpected adress %s %s %d %d\n",recv_info.new_src_ip.get_str1(),send_info.new_dst_ip.get_str2(),recv_info.src_port,send_info.dst_port); return -1; } if(data_len==0&&raw_info.recv_info.syn==1&&raw_info.recv_info.ack==1) @@ -352,9 +356,9 @@ int client_on_raw_recv(conn_info_t &conn_info) //called when raw fd received a p mylog(log_debug,"recv_bare failed!\n"); return -1; } - if(recv_info.src_ip!=send_info.dst_ip||recv_info.src_port!=send_info.dst_port) + if(!recv_info.new_src_ip.equal(send_info.new_dst_ip)||recv_info.src_port!=send_info.dst_port) { - mylog(log_debug,"unexpected adress %x %x %d %d\n",recv_info.src_ip,send_info.dst_ip,recv_info.src_port,send_info.dst_port); + mylog(log_debug,"unexpected adress %s %s %d %d\n",recv_info.new_src_ip.get_str1(),send_info.new_dst_ip.get_str2(),recv_info.src_port,send_info.dst_port); return -1; } if(data_len raw_mode_tostring = {{mode_faketcp, "faketcp"}, {mode_udp, "udp"}, {mode_icmp, "icmp"}}; int about_to_exit=0; @@ -714,6 +714,14 @@ void process_arg(int argc, char *argv[]) //process all options print_help(); myexit(-1); } + if(program_mode==client_mode) + { + raw_ip_version=remote_addr.get_type(); + } + else + { + raw_ip_version=local_addr.get_type(); + } //if(lower_level) //process_lower_level_arg(); diff --git a/misc.h b/misc.h index b26506f..f2afbcc 100644 --- a/misc.h +++ b/misc.h @@ -65,7 +65,6 @@ enum server_current_state_t {server_idle=0,server_handshake1,server_ready}; //s enum client_current_state_t {client_idle=0,client_tcp_handshake,client_handshake1,client_handshake2,client_ready};//client state machine enum raw_mode_t{mode_faketcp=0,mode_udp,mode_icmp,mode_end}; -enum ip_version_t{version_unset=0,version_ipv4,version_ipv6,version_end}; enum program_mode_t {unset_mode=0,client_mode,server_mode}; union current_state_t @@ -111,7 +110,7 @@ extern char fifo_file[1000]; extern raw_mode_t raw_mode; -extern ip_version_t ip_version; +extern u32_t raw_ip_version; extern program_mode_t program_mode; extern unordered_map raw_mode_tostring ; diff --git a/network.cpp b/network.cpp index 941c058..0acc8e3 100644 --- a/network.cpp +++ b/network.cpp @@ -154,6 +154,45 @@ tcpdump -i eth1 ip and icmp -dd */ +bool packet_info_t::tmp_ip_t::equal (const tmp_ip_t &b) const +{ + //extern int raw_ip_version; + if(raw_ip_version==AF_INET) + { + return v4==b.v4; + }else if(raw_ip_version==AF_INET) + { + return memcmp(&v6,&b.v6,sizeof(v6)); + } + assert(0==1); + return 0; +} +char * packet_info_t::tmp_ip_t::get_str1() const +{ + static char res[max_addr_len]; + if(raw_ip_version==AF_INET6) + { + assert(inet_ntop(AF_INET6, &v6, res,max_addr_len)!=0); + } + else if(raw_ip_version==AF_INET) + { + assert(inet_ntop(AF_INET, &v4, res,max_addr_len)!=0); + } + return res; +} +char * packet_info_t::tmp_ip_t::get_str2() const +{ + static char res[max_addr_len]; + if(raw_ip_version==AF_INET6) + { + assert(inet_ntop(AF_INET6, &v6, res,max_addr_len)!=0); + } + else if(raw_ip_version==AF_INET) + { + assert(inet_ntop(AF_INET, &v4, res,max_addr_len)!=0); + } + return res; +} packet_info_t::packet_info_t() { src_port=0; @@ -607,7 +646,7 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) if(raw_info.disabled) { - mylog(log_debug,"[%s,%d]connection disabled, no packet will be sent\n",my_ntoa(recv_info.src_ip),recv_info.src_port); + mylog(log_debug,"[%s,%d]connection disabled, no packet will be sent\n",recv_info.new_src_ip.get_str1(),recv_info.src_port); assert(max_rst_allowed>=0); return 0; } @@ -633,8 +672,8 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) iph->ttl = (unsigned char)ttl_value; iph->protocol = send_info.protocol; iph->check = 0; //Set to 0 before calculating checksum - iph->saddr = send_info.src_ip; //Spoof the source ip address - iph->daddr = send_info.dst_ip; + iph->saddr = send_info.new_src_ip.v4; //Spoof the source ip address + iph->daddr = send_info.new_dst_ip.v4; uint16_t ip_tot_len=sizeof (struct iphdr)+payloadlen; if(lower_level)iph->tot_len = htons(ip_tot_len); //this is not necessary ,kernel will always auto fill this //http://man7.org/linux/man-pages/man7/raw.7.html @@ -654,7 +693,7 @@ int send_raw_ip(raw_info_t &raw_info,const char * payload,int payloadlen) struct sockaddr_in sin={0}; sin.sin_family = AF_INET; //sin.sin_port = htons(info.dst_port); //dont need this - sin.sin_addr.s_addr = send_info.dst_ip; + sin.sin_addr.s_addr = send_info.new_dst_ip.v4; ret = sendto(raw_send_fd, send_raw_ip_buf, ip_tot_len , 0, (struct sockaddr *) &sin, sizeof (sin)); } @@ -699,7 +738,7 @@ int peek_raw(packet_info_t &peek_info) mylog(log_trace,"%s\n ",strerror(errno)); return -1; } - peek_info.src_ip=iph->saddr; + peek_info.new_src_ip.v4=iph->saddr; unsigned short iphdrlen =iph->ihl*4; char *payload=ip_begin+iphdrlen; @@ -811,8 +850,8 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) iph = (struct iphdr *) (ip_begin); - recv_info.src_ip=iph->saddr; - recv_info.dst_ip=iph->daddr; + recv_info.new_src_ip.v4=iph->saddr; + recv_info.new_dst_ip.v4=iph->daddr; recv_info.protocol=iph->protocol; if(lower_level) @@ -821,7 +860,7 @@ int recv_raw_ip(raw_info_t &raw_info,char * &payload,int &payloadlen) } - if(bind_addr_used && recv_info.dst_ip!=bind_addr.inner.ipv4.sin_addr.s_addr) + if(bind_addr_used && recv_info.new_dst_ip.v4!=bind_addr.inner.ipv4.sin_addr.s_addr) { mylog(log_trace,"bind adress doenst match, dropped\n"); //printf(" bind adress doenst match, dropped\n"); @@ -933,8 +972,8 @@ int send_raw_udp(raw_info_t &raw_info, const char * payload, int payloadlen) memcpy(send_raw_udp_buf+sizeof(udphdr),payload,payloadlen); - psh->source_address = send_info.src_ip; - psh->dest_address = send_info.dst_ip; + psh->source_address = send_info.new_src_ip.v4; + psh->dest_address = send_info.new_dst_ip.v4; psh->placeholder = 0; psh->protocol = IPPROTO_UDP; psh->tcp_length = htons(uint16_t(udp_tot_len)); @@ -1054,8 +1093,8 @@ int send_raw_tcp(raw_info_t &raw_info,const char * payload, int payloadlen) { memcpy(tcp_data, payload, payloadlen); - psh->source_address = send_info.src_ip; - psh->dest_address = send_info.dst_ip; + psh->source_address = send_info.new_src_ip.v4; + psh->dest_address = send_info.new_dst_ip.v4; psh->placeholder = 0; psh->protocol = IPPROTO_TCP; psh->tcp_length = htons(tcph->doff * 4 + payloadlen); @@ -1358,8 +1397,8 @@ int recv_raw_udp(raw_info_t &raw_info, char *&payload, int &payloadlen) pseudo_header tmp_header={0}; struct pseudo_header *psh=&tmp_header ; - psh->source_address = recv_info.src_ip; - psh->dest_address = recv_info.dst_ip; + psh->source_address = recv_info.new_src_ip.v4; + psh->dest_address = recv_info.new_dst_ip.v4; psh->placeholder = 0; psh->protocol = IPPROTO_UDP; psh->tcp_length = htons(ip_payloadlen); @@ -1506,8 +1545,8 @@ int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen) pseudo_header tmp_header; struct pseudo_header *psh=&tmp_header ; - psh->source_address = recv_info.src_ip; - psh->dest_address = recv_info.dst_ip; + psh->source_address = recv_info.new_src_ip.v4; + psh->dest_address = recv_info.new_dst_ip.v4; psh->placeholder = 0; psh->protocol = IPPROTO_TCP; psh->tcp_length = htons(ip_payloadlen); @@ -1615,29 +1654,29 @@ int recv_raw_tcp(raw_info_t &raw_info,char * &payload,int &payloadlen) { if(raw_info.rst_received < max_rst_to_show) { - mylog(log_warn,"[%s,%d]rst==1,cnt=%d\n",my_ntoa(recv_info.src_ip),recv_info.src_port,(int)raw_info.rst_received); + mylog(log_warn,"[%s,%d]rst==1,cnt=%d\n",recv_info.new_src_ip.get_str1(),recv_info.src_port,(int)raw_info.rst_received); } else if(raw_info.rst_received == max_rst_to_show) { - mylog(log_warn,"[%s,%d]rst==1,cnt=%d >=max_rst_to_show, this log will be muted for current connection\n",my_ntoa(recv_info.src_ip),recv_info.src_port,(int)raw_info.rst_received); + mylog(log_warn,"[%s,%d]rst==1,cnt=%d >=max_rst_to_show, this log will be muted for current connection\n",recv_info.new_src_ip.get_str1(),recv_info.src_port,(int)raw_info.rst_received); } else { - mylog(log_debug,"[%s,%d]rst==1,cnt=%d\n",my_ntoa(recv_info.src_ip),recv_info.src_port,(int)raw_info.rst_received); + mylog(log_debug,"[%s,%d]rst==1,cnt=%d\n",recv_info.new_src_ip.get_str1(),recv_info.src_port,(int)raw_info.rst_received); } } else if(max_rst_to_show==0) { - mylog(log_debug,"[%s,%d]rst==1,cnt=%d\n",my_ntoa(recv_info.src_ip),recv_info.src_port,(int)raw_info.rst_received); + mylog(log_debug,"[%s,%d]rst==1,cnt=%d\n",recv_info.new_src_ip.get_str1(),recv_info.src_port,(int)raw_info.rst_received); } else { - mylog(log_warn,"[%s,%d]rst==1,cnt=%d\n",my_ntoa(recv_info.src_ip),recv_info.src_port,(int)raw_info.rst_received); + mylog(log_warn,"[%s,%d]rst==1,cnt=%d\n",recv_info.new_src_ip.get_str1(),recv_info.src_port,(int)raw_info.rst_received); } if(max_rst_allowed>=0 && raw_info.rst_received==max_rst_allowed+1 ) { - mylog(log_warn,"[%s,%d]connection disabled because of rst_received=%d > max_rst_allow=%d\n",my_ntoa(recv_info.src_ip),recv_info.src_port,(int)raw_info.rst_received,(int)max_rst_allowed ); + mylog(log_warn,"[%s,%d]connection disabled because of rst_received=%d > max_rst_allow=%d\n",recv_info.new_src_ip.get_str1(),recv_info.src_port,(int)raw_info.rst_received,(int)max_rst_allowed ); raw_info.disabled=1; } } @@ -1832,7 +1871,7 @@ int send_raw0(raw_info_t &raw_info,const char * payload,int payloadlen) packet_info_t &send_info=raw_info.send_info; packet_info_t &recv_info=raw_info.recv_info; - mylog(log_trace,"send_raw : from %x %d to %x %d\n",send_info.src_ip,send_info.src_port,send_info.dst_ip,send_info.dst_port); + mylog(log_trace,"send_raw : from %s %d to %s %d\n",send_info.new_src_ip.get_str1(),send_info.src_port,send_info.new_dst_ip.get_str2(),send_info.dst_port); switch(raw_mode) { case mode_faketcp:return send_raw_tcp(raw_info,payload,payloadlen); diff --git a/network.h b/network.h index 07c7e7e..d9d59b8 100644 --- a/network.h +++ b/network.h @@ -50,11 +50,22 @@ struct pseudo_header { struct packet_info_t //todo change this to union { uint8_t protocol; - //ip_part: - u32_t src_ip; - uint16_t src_port; - u32_t dst_ip; + union tmp_ip_t + { + u32_t v4; + in6_addr v6; + + bool equal (const tmp_ip_t &b) const; + + char * get_str1() const; + char * get_str2() const; + }ip; + + tmp_ip_t new_src_ip; + tmp_ip_t new_dst_ip; + + uint16_t src_port; uint16_t dst_port; //tcp_part: