在cherrypy中获取原始目标ip

Posted

技术标签:

【中文标题】在cherrypy中获取原始目标ip【英文标题】:Obtaining original destination ip in cherrypy 【发布时间】:2015-06-17 05:33:45 【问题描述】:

我在 Cherrypy 服务器上运行强制门户,并且我设置了 iptables 规则,将所有 http 流量从未注册的 MAC 地址重定向到门户。在用户通过门户启动页面向我注册后,我添加了一个 iptables 异常以让他们的流量通过。 现在我想要做的是将用户重定向到他们最初要去的页面 - 在他们被发送到门户之前。我知道 iptables 为所有 TCP 数据包设置了一个包含原始目标信息的字段,并且我知道有一个名为 getsockopt 的 C 函数来读取该字段。但是,我不知道如何在cherrypy中访问与请求关联的套接字。

谁能帮帮我? :)

【问题讨论】:

【参考方案1】:

我不是低级网络方面的专家,也不知道开放 Wi-Fi 授权实现如何标记其客户端。但在我看来,在OSI model 中,下层对上层一无所知。换句话说,IP 不知道具体的 HTTP 术语和页面 URL。

这种方式手头有一个套接字引用,我相信可以通过自定义 CherryPy 来检索它,最多会给你原始 IP 地址,而不是 URL。此外,混合网络 (IP) 和应用程序 (HTTP) 层,并且通常在多个地方管理一个应用程序实体,可能会导致各种问题。例如处理 HTTP 语音代理,例如正向和反向代理,它们不会保留较低层的细微差别。

更新

好的,既然您说您也有请求 URL,那么您可以通过以下方式检索原始套接字。正如您所看到的,它位于幕后,本质上是最终用户不应依赖的实现细节。它不是合同的一部分,可以在任何下一个版本中更改。这样你就有很好的机会射中自己的脚了。

#!/usr/bin/env python


import cherrypy


config = 
  'global' : 
    'server.socket_host' : '127.0.0.1',
    'server.socket_port' : 8080,
    'server.thread_pool' : 8
  ,



class App:

  @cherrypy.expose
  def index(self):
    '''For caveats and details on the slippery slope, take a look at ws4py
    https://github.com/Lawouach/WebSocket-for-Python/blob/master/ws4py/server/cherrypyserver.py
    '''
    print(cherrypy.serving.request.rfile.rfile._sock)

    return 'Make sure you know what you are doing.'


if __name__ == '__main__':
  cherrypy.quickstart(App(), '/', config)

【讨论】:

感谢您的回答。我相信我想做的事情不会违背 OSI 模型的原则。 iptables 重定向后,cherrypy 获取用户请求的特定页面的路径。唯一缺少的——因为重定向——是主机 IP。如果我可以从套接字中获取 IP,我应该能够重建整个请求路径。如果我的想法是正确的,那只会是高层从低层读取信息。我的问题是 - 正如你所说 - 如何检索套接字引用。 嗨 saaj,感谢您的更新。通过cherrypy.serving.request.rfile.rfile._sockgetsockopt(如here 所述),我能够检索到原始IP。也就是说,我确实认真对待您的警告,并且不知何故可以看出它不是一个“干净”的解决方案,但我见过的现代强制门户肯定会进行这种重定向。我会考虑一个更好的解决方案,也许是在 iptables 方面,如果我想出什么来更新我的帖子......

以上是关于在cherrypy中获取原始目标ip的主要内容,如果未能解决你的问题,请参考以下文章

获取活动 udp 连接的目标 IP/端口?

如何使用 CherryPy 配置 IP 地址?

获取 iSCSI 设备的目标 IP 地址

让linux系统每隔1分钟ping一个目标IP,目标IP也是linux,获取IP后写入某个文件

使用python根据ip获取目标地理位置信息

Python_跟随目标主机IP变换