Tcpcopy两种架构原理详解 2

发表于:2014-6-16 10:45

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:左琴    来源:51Testing软件测试网采编

  Tcpcopy传统架构在产品中实践遇到一些问题,要理解和解决问题深入了解Tcpcopy两种的架构的原理是必须的。当了解的越多就发现它不仅仅是一个工具,而需要掌握不仅仅是简单的几个使用命令。
  Tcpcopy传统架构与新架构最大的区别:传统架构的intercept进程与测试服务器在同一台机器上,新架构的intercept进程从测试服务器上offload出来,单独部署在辅助服务器上。下面分别对两种结构的原理详细介绍。
  传统架构
  Tcpcopy
  传统架构下,在线机器上面抓取请求数据包,默认采用raw socket input 接口。raw socket(原始套接字)可以接收本机网卡上的数据帧或者数据包,可监听网络的流量和分析。可以通过3种方式创建这类socket ,这里只详细讲tcpcopy使用的函数。Raw_socket的原理和其它使用方式,可参考 http://blog.sina.com.cn/s/blog_9599e95101010w2g.html
  抓包函数:int sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP)。 第一个参数表示协议簇, AF_INET 代表TCP/IP协议。第二个参数表示SOCKET类型。第三个参数表协议类型。该套接字可以接收协议类型为tcp(也可以设置其它协议类型)发往本机的IP数据包,不能收到非发往本机IP的数据包(IP软过滤会丢弃这些不是发往本机的数据包)。Tcpcopy利用Raw Socket只抓进来的包,而不能收到从本机发送出去的数据包这一特点,实现抓包的功能。系统在IP层会检查有没有进程创建这种类型的raw socket,如果有,这个包就会被复制一份并发送到这个socket的缓冲区,Tcpcopy就是通过这种方式来复制访问流量的。
  在发包前,调用函数sock = socket(AF_INET, SOCK_RAW,IPPROTO_RAW),并且设置setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &n, sizeof(n)),这样IP数据包头部就可以由用户自己编写(在不设置这个选项的情况下,IP协议会自动填充IP数据包的首部),Tcpcopy利用此函数将数据包的目的IP和端口改为测试机的IP和端口,如下:tcp_header->dest = remote_port;
  ip_header->daddr = remote_ip;最后调用sendto函数发送包到测试前端机:
  send_len = sendto(sock,(char *)ip_header,tot_len,0,(struct sockaddr *)&toaddr,sizeof(toaddr));
  Intercept
  测试机上Intercept进程主要完成的是对复制请求的响应包进行处理。复制的请求到达测试机经应用程序处理后的响应包如果不经处理,将会返回给线上客户端。Tcpcopy传统架构的使用需要Iptable这一工具辅助实现对响应包的处理。
  modprobe ip_queue
  iptables -I OUTPUT -p tcp –sport 2080 -j QUEUE
  以上iptable命令,表示OUTPUT链从2080端口发出的包在IP层会被匹配发往目标QUEUE,而QUEUE是由ip_queue模块实现(http://bbs.chinaunix.net/thread-1941806-1-1.shtml).因此在使用iptable命令前,内核需要使用modprobbe命令加载ip_queue模块。有了以上两个步骤, 所有匹配到iptable命令的报文将会调用IP Queue模块的相关函数。
  Tcpcopy服务器端的Intercept进程用如下方式创建Netlink socket:
  int sock = socket(AF_NETLINK,SOCK_RAW,NETLINK_FIREWALL);
  Netlink详细介绍http://linux.chinaunix.net/techdoc/beginner/2008/11/12/1044982.shtml。
  NETLINK_FIREWALL协议有三种消息类型:IPQM_MODE,IPQM_PACKET,IPQM_VERDICT.其中内核通过IPQM_PACKET消息将刚才截获的返回结果包发送到Inercept。Intercept给内核发送一个IPQM_VERDICT消息告诉内核对这个包的裁决结果(DROP,ACCEPT)。Tcpcopy通过这样的办法将测试机上应用返回的结果截获丢弃,并由Intercept返回一个Ip header。 Tcpcopy利用这个特点保留了一个允许访问的ip列表,因为默认情况下访问测试前端机上应用服务所得到的结果会在IP层被drop掉,造成在2080端口上无法访问应用服务。有了这个白名单,即使是设置了iptables规则,在白名单内的机器上也是可以正常访问测试前端机上的应用服务的。
21/212>
《2023软件测试行业现状调查报告》独家发布~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号