【问题标题】:How do I listen for packets with Racket?如何使用 Racket 监听数据包?
【发布时间】:2013-08-05 02:49:38
【问题描述】:

我正在尝试使用 Racket 来侦听通过我机器上的端口 80 移动的数据包。但是,我似乎对数据包嗅探器如何工作的理解、对 Racket 如何工作的理解,或两者兼而有之。

这是我的代码(大部分来自Racket's Wikipedia entry)。

#lang racket

(require racket/tcp)

(define listener (tcp-listen 80))

(define (echo-server)
  (define-values (in out) (tcp-accept listener))
  (thread (lambda () (copy-port in out) 
                     (print (read in)) 
                     (close-output-port out)))
  (echo-server))

(echo-server)

当我连接到localhost:80 时,我会收到一些反馈 - 但是当我尝试使用我的网络浏览器时,我无法打印任何内容。如何修改此代码,以便它可以侦听从 Web 请求传入和传出的数据包?

【问题讨论】:

  • 通过编写移动我得到的印象是你想拦截到端口 80 的通信,而你的代码只适用于代表它运行的机器的 url,比如localhost/blabla,而不是作为嗅探器。如果您只是在寻找嗅探器,我建议使用wireshark。
  • 我相信你想实现一个代理服务器而不是一个回显服务器:一个位于 HTTP 连接中间并“看到”所有传入/传出流量的进程,同时允许正常通信。
  • @ÓscarLópez 是的,我相信这就是我要找的东西 - 你能否详细说明我所拥有的和代理服务器之间的区别(简而言之,如果我问的太多的话)?
  • @sdasdadas 寻找代理服务器的示例。从本质上讲,它是一个介于两者之间的过程,接收来自客户端的请求,将其重定向到真正的目标,接收目标的响应并将其转发给客户端……然后对发生的请求/响应做任何它想做的事情穿过它
  • packet-socket 库(最后更新于 2017 年)允许访问原始以太网帧。

标签: port racket packet packet-capture packet-sniffers


【解决方案1】:

packet-socket 库(最后更新于 2017 年)允许访问原始以太网帧。 packet-socket 在 pkgd 上

【讨论】:

    【解决方案2】:

    但是,我似乎对数据包嗅探器的工作原理有所了解

    是的。数据包嗅探器使用常规套接字;它使用任何可用的机制来被动地观察网络接口接收或发送的数据包。如果您只想观看端口 80 上的 HTTP 流量,而不响应该流量或更改该流量,您将需要使用类似的东西作为 libpcap/WinPcap,它们使用操作系统上的适当机制来被动地观察数据包。例如,请参阅SPeaCap library for Racket

    但是请注意,如果您被动地嗅探流量,您将看到的是原始链路层数据包;要从中提取 TCP 内容,您必须解析链路层标头、IP 标头和 TCP 标头才能找到内容。我会留给你来弄清楚如何做到这一点。

    【讨论】:

    • 啊,谢谢。我不介意进入数据包之间(就像中间攻击的人?) - 但我不知道是否可以坐在我的 Chrome 客户端和端口 80 之间(并拦截、分析和转发数据包从 Chrome 发送到某个 Web 服务器)。这很容易做到吗?还是这个用例正是存在数据包嗅探的原因?
    • 数据包嗅探涉及拦截和分析;它不涉及转发,例如,窃听电话涉及听到一个人所说的内容并将其重复给另一个人,以便他们听到。另一种选择是编写一个 Web 代理程序,该程序在两个方向上传递所有流量,并对流量进行自己的分析。但是,要使用 that,您必须将 Chrome 配置为通过您的应用程序作为代理服务器。我会留给你来弄清楚如何做到这一点。
    • SPeaCap 已经过时了。 packet-socket 库(最后更新于 2017 年)允许访问原始以太网帧。
    【解决方案3】:

    您的 TCP 服务器只是充当回显服务器,这意味着它不符合 HTTP。您的浏览器期待有效​​的 HTTP 响应,因此它不起作用也就不足为奇了。

    Racket 有各种库。快速搜索文档发现:Web Server: HTTP Server

    【讨论】:

    • 我可能不在基地,但我对 Web 服务器端的事情不太感兴趣。我只是想抓取通过端口 80 传来的网络数据的标头。即使我的浏览器期待 HTTP 响应,我不会仍然拦截发出的请求吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-30
    • 2020-09-23
    • 1970-01-01
    • 1970-01-01
    • 2018-01-22
    相关资源
    最近更新 更多