tcpcopy 使用及采坑记录

RPC 模块的调用测试不像 HTTP 调用那样方便,需要自己写客户端并模拟请求参数,比较麻烦,不过通过 tcpcopy 可以复制线上流量,变相请求 rpc 模块来达到测试目的。

一、概念及安装使用

参考:tcpcopy 的简单用法

二、采坑记录

1. MTU 不匹配

微信图片_20181112145750

日志中出现这个错误的原因是机器网卡的 MTU 值小于1500,ifconfig 查看网卡信息:

微信图片_20181112145821

发现 MTU = 1400,确实是这个问题导致的。

解决办法:使用 tcpcopy 命令的时候手动设置 MTU 的值,让其小于等于 1400 即可。命令如下:

   /opt/tcpcopy/sbin/tcpcopy -x 9201-10.19.80.99:9201 -s 10.19.80.99 -c 10.19.80.81 -M 1400

至于什么是 MTU?参考这篇文章

2. 路由设置未生效

微信图片_20181112145816

这是由于某些机器的安全策略问题,路由设置可能不会生效,导致响应包都回到了真正的客户端。

具体解决办法有两种:

  1. 抛弃第三台辅助机,流量打回到线上机,同时在线上机上屏蔽掉来自测试机的流量。

    • 测试机器和 intercept 部署到一台机器
    • tcpcopy 端 -c 参数采用 tcpcopy 所在的线上机器 ip 地址
    • 在线上机器设置 iptables 黑洞来过滤掉测试服务器的响应包 iptables -I INPUT -p tcp --sport 测试服务的端口 -j DROP -s 测试服务所在机器的ip地址
    • 千万要注意在测试服务器不要设置路由了,否则会受到干扰
  2. 抛弃第三台辅助机,在测试机上屏蔽到返回给线上机的流量。

    • tcpcopy 方式不变,intercept 需要如下改变:

      ./configure --traditional,这种方式等同于1.0以下版本的默认方式,intercept 将采用 iptables 的方式来获取响应包,并干掉响应包。

    • 如果采用 IP Queue 模块(内核 < 3.5,默认采用 IP Queue):
      • modprobe ip_queue # if not running
      • iptables -I OUTPUT -p tcp --sport port -j QUEUE
      • ./intercept
    • 如果采用 NFQueue 模块(内核 >= 3.5,默认采用 NFQueue):
      • iptables -I OUTPUT -p tcp --sport port -j NFQUEUE
      • ./intercept

以上解决方案来自 wangbin679 在 GitHub 上的回答,感谢!

如果 make 的时候报如下错误:

微信图片_20181112152622

说明缺少相应的依赖包,执行 yum install libnetfilter_queue-devel.x86_64 安装即可。