IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

使用tcpdump搞定一个替换问题

火丁笔记 2013-04-07 13:04:38 累计浏览 3,367 次
本机暂存

   今天碰到一个替换问题:需要把全部接口中出现的一个链接改成另一个链接。虽然链接地址是保存在数据库中的,但是由于某些原因,不能直接修改数据库中的内容,只能在渲染结果的时候再进行替换。

   如果有很好的逻辑封装的话,这个问题并不是什么难事儿,可恰恰代码一团乱,搞不清楚到底哪些接口需要修改。我本打算依靠蛮力挨个文件查,但试了试发现工作量实在太大了,没办法只能想想别的招儿。

   最后找到的招儿就是「tcpdump」,通过它可以直接过滤服务器渲染的内容:

shell> tcpdump -i eth0 src port 80 -l -s 0 -w - | strings | grep www.foo.com -B 100

   好在访问量大,通过一段不长时间的采样,就可以捕捉到绝大部分有问题的请求。

   不过仅仅这样还不够,因为虽然我们过滤出了有问题的内容,但是我们并不知道其对应的地址是什么,所以我们需要想办法把地址放到响应结果里去。

   如果用PHP的话,可以借助「auto_prepend_file」为所有的PHP响应增加一个头:

<?php

header('X-Request-URI: ' . $_SERVER['REQUEST_URI']);

?>

   如果用Nginx的话,可以借助「add_header」为所有的响应增加一个头:

http {
    add_header X-Request-URI $request_uri;
}

   有了这些铺垫工作,再用「tcpdump」过滤内容的时候,就能直观的看到地址了:

HTTP/1.1 200 OK
Server: nginx
Date: Fri, 22 Mar 2013 07:50:39 GMT
Content-Type: text/html
Transfer-Encoding: chunked
Connection: close
X-Powered-By: PHP
X-Request-URI: /path/to/foo

   找到了地址,剩下的工作就简单了。这个替换问题并不难,不过如果选错了方法,那么耗费的时间可能会多很多,可见即便是简单的问题也值得深思熟虑。

   BTW:Nginx有一个「Substitution」模块能完成替换,但对本例而言有点太重了。

同分类推荐文章

  1. 等了十年的 Go 链式管道,终于来了:seq 让你像写 Scala 一样写 Go (2026-06-25 18:38:18)
  2. Go 实验特性详解 (2026-06-21 10:05:27)
  3. amd64 微架构级别对 Go 程序性能提升多少? (2026-06-21 09:38:49)

查看更多 后端 文章 →

建议继续学习

  1. 网络数据包调试利器之wireshark (累计阅读 19,814)
  2. 神探tcpdump第一招 (累计阅读 9,655)
  3. 使用wireshark分析网络报文 (累计阅读 7,904)
  4. POST与GET的区别及RESTful (累计阅读 7,863)
  5. 记一次丢包网络故障 (累计阅读 6,559)
  6. 实时监控Android设备网络封包 (累计阅读 6,557)
  7. Google短网址的API (累计阅读 6,522)
  8. 神探tcpdump第二招 (累计阅读 5,875)
  9. 理解JSON:3分钟课程 (累计阅读 5,792)
  10. 5分钟搞定你的Rest Server (累计阅读 5,744)