当前位置: 首页 > 面试题库 >

如何获取重定向的UDP消息的原始目标端口?

仰城
2023-03-14
问题内容

使用这个东西,我可以获得socket(PF_INET, SOCK_DGRAM,0)套接字的原始目标IP地址。

如何获得原始目标端口?


问题答案:

取决于重定向机制。如果使用的是REDIRECT(实际上是NAT),则需要在应用NAT之前使用SO_ORIGINAL_DST或libnetfilter_conntrack来查询连接的原始目标。但是,由于可以使用同一个侦听器套接字为多个连接提供服务,因此必须对每个数据包执行此查找。

您可以使用conntrack命令行工具尝试libnetfilter_conntrack及其提供的服务。

一种替代方法是使用TPROXY进行重定向,这是在这种情况下使用的。在那里,您可以使用recvmsg()使用辅助消息获得数据包的原始目标。查找的关键是IP_RECVORIGDSTsetsockopt。

关于TPROXY的更多信息可以在内核文档目录的tproxy.txt文件中找到。它有点难用,但是由于它是由堆栈而不是数据包过滤子系统实现的,因此工作更可靠。

编辑: 添加如何使用TProxy查询UDP目标地址。

  1. 打开UDP套接字,将其绑定到0.0.0.0或更特定的IP
  2. 您可以通过setsockopt(fd,SOL_IP,IP_RECVORIGDSTADDR,…)启用IP_RECVORIGDST
  3. 您使用recvmsg()代替recvfrom()/ recv()接收帧
  4. recvmsg()将返回数据包和一系列辅助消息,
  5. 迭代辅助消息,并找到级别为SOL_IP,索引为IP_ORIGDSTADDR的CMSG块
  6. 此CMSG块将包含结构sockaddr_in,其中包含IP和端口信息。

编辑: SO_ORIGINAL_DST与udp

SO_ORIGINAL_DST应该与udp套接字一起使用,但是内核不允许您指定连接端点,它将使用您调用SO_ORIGINAL_DST的套接字来获取此地址信息。

这意味着只有将UDP套接字正确绑定(绑定到重定向到的地址/端口)并连接(绑定到有关的客户端),它才会起作用。您的侦听器套接字可能绑定到0.0.0.0,并且不仅为单个客户端提供服务,而且还为多个客户端提供服务。

但是,您不需要使用实际的侦听器套接字来查询目标地址。由于UDP在建立连接时不会传输数据报,因此您可以创建一个新的UDP套接字,将其绑定到重定向地址,然后将其连接到客户端(您知道的地址,因为它无论如何都会将第一个数据包发送给侦听器)。然后,您可以使用此套接字在其上运行SO_ORIGINAL_DST,但是有罪魁祸首:

  1. 一旦打开了这样的套接字,内核将更喜欢客户端在第一个套接字之后发送其他数据包,而不是侦听器套接字
  2. 这是固有的习惯,因为到您的应用程序有机会调用SO_ORIGINAL_DST时,conntrack条目可能已超时。
  3. 它很慢而且开销很大

基于TProxy的方法显然更好。



 类似资料:
  • 问题内容: 我用python解析网站。他们使用大量重定向,并通过调用javascript函数来完成重定向。 因此,当我仅使用urllib解析网站时,它无济于事,因为我无法在返回的html代码中找到目标url。 有没有办法访问DOM并从我的python代码中调用正确的javascript函数? 我需要的只是URL,重定向将我带到了那里。 问题答案: 我看着硒。而且,如果您没有运行纯脚本(这意味着您没

  • 这似乎是一个非常基本的流程,而且Laravel有很多很好的基本解决方案,我觉得我错过了一些东西。 用户单击需要身份验证的链接。Laravel的身份验证过滤器启动并将它们路由到登录页面。用户登录,然后转到他们试图在“身份验证”过滤器启动之前进入的原始页面。 有没有一个好方法可以知道他们最初想要到达的页面?由于Laravel是拦截请求的人,我不知道它是否会在用户登录后跟踪某个地方以方便路由。 如果没有

  • 问题内容: 在Python中,我使用urllib2打开一个URL。该URL重定向到另一个URL,该URL重定向到另一个URL。 我希望在每次重定向后打印出网址。 例如 -> =重定向到 A-> B-> C-> D 我想打印B,C和D的URL(A是已知的,因为它是起始URL)。 问题答案: 最好的方法可能是继承。深入Python的重定向一章可能会有所帮助。

  • 我是谷歌协议缓冲区的新手,并试图通过一个原型消息在java中建模一个原始数组。 目前我正在使用此原型文件: 它编译为一个java类,其中包含一个<代码>列表 我的应用程序必须保存数百万个int值,为了节省内存,我决定使用int而不是Integer。有没有一种方法可以用数据结构在java类中编译protobuf消息描述? 不幸的是,我在协议缓冲区语言指南(proto3)中找不到任何内容。在如何在pr

  • 在我的Laravel应用程序中,我有一个只能由Auth用户访问的私人页面。我也使用社交登录,所以当用户未登录就进入私人页面时,Laravel会将用户发送到登录页面,成功登录后,用户会被发送回原始目的地(私人页面)。只有当用户通过Laravel内置认证系统登录时,但当用户通过社交登录方法登录时,用户将被引导到主页。 这是我登录后的社交登录处理程序: 如果用户在会话中出现,我如何将其发送到原始目的地,

  • 我有Omnipay功能完美地在我的支付网关,但当系统重定向到PayPal我得到以下屏幕上重定向到PayPal之前: 重定向到https://www.sandbox.paypal.com/cgi-bin/webscr?cmd=_express-checkout 我想知道的是,如果有人知道如何停止页面显示并直接重定向到没有这个中间页面的PayPal。我的重定向代码如下: