在cherrypy中获取原始目标ip

时间:2015-04-11 15:06:38

标签: python iptables cherrypy getsockopt

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

有人可以帮帮我吗? :)

1 个答案:

答案 0 :(得分:0)

我不是低级别网络专家,也不知道常见的开放式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)