如何监控所有传入的http请求?

79
我需要从外部和有时是内部机器发起的HTTP POSTGET 请求中监视我的应用程序。
这可行吗?
我一直在使用 Fiddler,但它仅监视出站请求,而不是传入请求(来自机器外部),或者是我的配置不正确吗?
这是针对我的 Web 应用程序,旨在接收来自外部服务器的 POST
9个回答

67
您需要做的是配置Fiddler作为"反向代理"
Fiddler网站上有两种不同的方法可以实现此操作。以下是步骤说明:

第0步

在使用以下选项之前,您必须允许其他计算机连接到Fiddler。为此,请单击“工具”>“Fiddler选项”>“连接”,并选中“允许远程计算机连接”的复选框。然后关闭Fiddler。

选项1:将Fiddler配置为反向代理

可以配置Fiddler,以便自动将发送到http://127.0.0.1:8888的任何流量发送到同一台计算机上的不同端口。设置此配置方式:

  1. 启动REGEDIT
  2. 在HKCU\SOFTWARE\Microsoft\Fiddler2内创建一个名为ReverseProxyForPort的新DWORD。
  3. 将DWORD设置为要重新路由入站流量的本地端口(通常为标准HTTP服务器的端口80)
  4. 重新启动Fiddler
  5. 在浏览器中导航至http://127.0.0.1:8888

选项2:编写FiddlerScript规则

或者,您可以编写一个执行相同操作的规则。

假设您正在运行WEBSERVER机器上80端口的网站。您使用Windows SmartPhone设备上的Internet Explorer移动版连接到该网站,且无法配置Web代理。您想捕获来自手机和服务器响应的流量。

  1. 在默认端口8888上启动WEBSERVER上的Fiddler。
  2. 单击“工具”|“Fiddler选项”,并确保选中了“允许远程客户端连接”复选框。如有必要,请重新启动。
  • 选择规则|自定义规则。
  • 在OnBeforeRequest处理程序中,添加一行新代码:
    if (oSession.host.toLowerCase() == "webserver:8888") oSession.host = "webserver:80";
  • 在智能手机上,导航到http://webserver:8888
  • 来自智能手机的请求将出现在Fiddler中。请求从端口8888转发到运行Web服务器的端口80。响应通过Fiddler发送回智能手机,智能手机不知道内容最初来自端口80。


    8
    为什么这么难呢?肯定有一个程序可以查看我所有的网络接口并只读取http数据包。貌似无法让Wireshark或网络监视器做到这一点,... - Exitos
    Wireshark非常强大,我个人在过去几个月才开始学习如何使用它。如果它不能做类似的事情,我会感到惊讶的。这可能只是在正确的接口上设置正确的过滤器的问题。如果我能找出如何使用Wireshark完成它,我将发布另一个答案。 - Saul Dolgin
    嗨,索尔,你看到我下面的回复了吗?如果你在Windows中添加一个路由,它会强制所有流量出去然后再返回。 - Exitos
    我看了你的回答,对于使用Wireshark捕获本地主机流量的方法感到有道理。我想我应该指出Fiddler也能够捕获“localhost”流量...但是有一个问题。您必须使用主机名而不是“localhost”或127.0.0.1环回地址向Web服务器发出请求。 - Saul Dolgin
    @SaulDolgin 如果Web服务运行在11000端口上,我们该如何配置Fiddler?例如:http://mywebserver:11000/mywebservice.asmx。 - FMFF
    我不得不使用 oSession.host.ToLower() - David

    34

    我会安装Microsoft Network Monitor,配置工具只查看HTTP数据包(过滤端口),并开始捕获数据包。

    您可以在这里下载它。


    1
    哇,这是一个很棒的工具!我曾尝试使用 Fiddler 并设置远程代理,但从未成功。使用网络监视器,我可以看到我的 Web 服务是如何被调用以及请求是什么。 - Oleg D.
    我和上面的发帖者遇到了同样的问题,从未能够正确地使用Fiddler。不过,微软网络监视器工具却表现得非常出色。 - bulltorious
    1
    这个工具能很好地工作,但是我似乎无法检查安全的SSL调用负载。我只收到了一个“SSLApplicationData: Binary Large Object (304 Bytes)” 的信息。有什么方法可以查看这些数据吗? - atconway
    1
    SSL流量不应该容易被解密。这就是使用SSL的目的,以防止窃听者检查流量。无论如何,如果您有服务器SSL私钥,可以使用MS Network Monitor中的解密工具进行SSL解密:http://blogs.technet.com/b/netmon/archive/2010/03/08/expert-to-decrypt-tls-ssl-traffic.aspx。Fiddler通过使用伪证书来实现此功能,从而有效地自行执行中间人攻击。 - YudhiWidyatama
    1
    "Network Monitor 3.4是存档版本的协议分析器,不再进行开发。微软消息分析器是Network Monitor 3.4的替代品。" - styfle

    13

    在Windows上将Fiddler配置为“反向代理”

    (对于Mac,请参见Partizano下面的链接)

    我知道已经有一个答案建议这样做,但我想提供说明和指令,Telerik应该提供,还要涵盖一些注意事项,所以开始吧:

    将Fiddler配置为“反向代理”是什么意思?

    • 默认情况下,Fiddler仅监视从运行Fiddler的计算机发出的请求
    • 要监视传入请求,需要将Fiddler配置为工作为“反向代理”
    • 这意味着您需要设置Fiddler作为“代理”,以拦截发送到要监听传入请求的计算机上特定端口(8888)的传入HTTP请求。 Fiddler将随后通过将它们发送到HTTP请求的常规端口(通常是80或HTTPS的443端口)将这些请求转发给同一台计算机上的Web服务器。实际上非常快速和容易做到!
    • 使用Fiddler设置这样做的标准方法是让Fiddler拦截发送到Port '8888'的所有请求(因为通常不会被其他任何东西使用,尽管您可以轻松地使用另一个端口)
    • 然后,您需要使用注册表编辑器使Fiddler将其接收到的任何HTTP请求,以便将它们转发到标准HTTP端口(80端口,对于HTTPS请求的443端口,或另一个您的Web服务器设置为监听的自定义端口)

    注意:要使此项工作,您想要拦截的任何请求都必须发送到端口8888

    您可以通过在主机名后面添加:8888来完成这项工作,例如,对于MVC路由,可以像这样:

    http://myhostname:8888/controller/action


    步骤

    确保Fiddler可以接受端口8888的远程http请求:

    以管理员身份运行Fiddler。转到“工具”>“Fiddler选项”>“连接”,确保勾选“允许远程计算机连接”,并将“Fiddler侦听端口”设置为8888:

    进入图像描述

    将Fiddler配置为将在端口8888收到的请求转发到端口80:

    • 关闭Fiddler
    • 启动REGEDIT
    • 在HKEY_CURRENT_USER\SOFTWARE\Microsoft\Fiddler2中创建一个名为ReverseProxyForPort的新DWORD。
      • 现在将DWORD值设置为您想要重新路由入站流量的本地端口(通常为标准HTTP服务器的80端口)
    • 为此,请右键单击所创建的DWORD,然后选择“修改”。确保“基数”设置为“十进制”,并输入“80”(或其他端口)作为“值数据”:

    确保防火墙上已打开端口8888

    • 您必须确保端口8888对外部请求开放(如果您的服务器受到防火墙保护,则默认情况下不会)

    就这样! Fiddler现在应该设置为反向代理,以拦截来自端口8888的所有请求(以便您可以在Fiddler中查看它们),然后将它们转发到您的Web服务器以实际处理。

    测试请求

    • 重新启动Fiddler
    • 为了测试 Fiddler 是否拦截外部请求,请在已设置 Fiddler 作为反向代理的同一计算机上打开一个浏览器。在浏览器中,导航到 http://127.0.0.1:8888
    • 这将测试对端口 8888 的基本请求。
    • 您应该看到 Fiddler 拦截了该请求。
    • 现在您可以测试来自另一台计算机的请求,例如通过从另一台计算机的浏览器发出请求(其中 'remoteHostname' 是您已设置 Fiddler 为反向代理的计算机上的主机名):

    http://remoteHostname:8888/controller/action

    • 或者,您可以使用另一个 Fiddler 实例在远程计算机上,使用类似上面的 URL 组合请求。这将允许您进行 GET 或 POST 请求。

    重要提示:查看请求后,请返回到“工具” > “Fiddler 选项” > “连接”,并取消选中“允许远程计算机连接”的选项,否则第三方将能够通过您的服务器弹跳流量。


    在没有注册表编辑器的操作系统中(如Mac OS X和Linux),应该采取什么等效步骤? - partizanos
    1
    我在这里找到了它:http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/ConfigureForMac - partizanos

    9

    大家发现了一种完美的方式来监控从我的计算机到我的计算机之间流动的所有本地流量:

    1. Install Wireshark

    2. When you need to capture traffic that is flowing from a localhost to a localhost then you will struggle to use wireshark as this only monitors incoming traffic on the network card. The way to do this is to add a route to windows that will force all traffic through a gateway and this be captured on the network interface.

      To do this, add a route with <ip address> <gateway>:

       cmd> route add 192.168.20.30 192.168.20.1
      
    3. Then run a capture on wireshark (make sure you select the interface that has bytes flowing through it) Then filter.

    新增的路由将以黑色显示。(因为它们是本地地址)

    6

    微软消息分析器是微软网络监视器3.4的继任者。

    如果您的http传入流量将进入58000端口的Web服务器,请以管理员模式启动分析器并点击新会话:

    使用过滤器:tcp.Port = 58000和HTTP

    跟踪场景:“本地网络接口(Win 8及更早版本)”或“本地网络接口(Win 8.1及更高版本)”,取决于您的操作系统

    解析级别:完整


    3
    你可以考虑将 Fiddler 作为反向代理运行,这样客户端就可以连接到 Fiddler 的地址,然后由 Fiddler 转发请求到你的应用程序。根据你的需求,这将需要一些端口操作或客户端配置。如何操作的详细信息可以在这里找到:http://www.fiddler2.com/Fiddler/Help/ReverseProxy.asp

    1
    链接已移至http://docs.telerik.com/fiddler/Configure-Fiddler/Tasks/UseFiddlerAsReverseProxy。 - daniel

    2
    使用 TcpView 工具查看正在监听的端口和连接。但是这并不能提供请求信息。
    要查看请求信息,您需要使用反向代理,但我不知道有哪些工具可用。
    使用跟踪功能获取请求的部分信息(请求的前1KB)。

    2
    使用Wireshark...
    我没有尝试过这个方法: http://wiki.wireshark.org/CaptureSetup/Loopback 如果这个方法可行,你可以过滤出http/http contains GET/http contains POST的流量。
    你可能需要运行两个Wireshark实例,一个捕获本地流量,另一个捕获远程流量。我不确定。

    1
    你可以尝试使用HTTP Debugger,它具有内置显示传入HTTP请求的能力,不需要对系统配置进行任何更改。

    HTTP Debugger


    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接