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